本週主要講大數據分析和處理,包含:
-
hadoop 使用,map-reduce概念和使用
-
spark與大數據處理
下面詳細記錄一下知識點:
hadoop
-
HDFS 分佈式文件系統
-
主從結構,一個namenoe和多個datanode, 分別對應獨立的物理機器
-
NameNode是主服務器,管理文件系統的命名空間和客戶端對文件的訪問操作。NameNode執行文件系統的命名空間操作,比如打開關閉重命名文件或者目錄等,它也負責數據塊到具體DataNode的映射
-
集羣中的DataNode管理存儲的數據。負責處理文件系統客戶端的文件讀寫請求,並在NameNode的統一調度下進行數據塊的創建刪除和複製工作。
-
NameNode是所有HDFS元數據的管理者,用戶數據永遠不會經過NameNode
-
MapReduce 並行計算框架
-
主從結構,一個JobTracker和多個TaskTracker
-
MapReduce是由一個單獨運行在主節點上的JobTacker和運行在每個集羣從節點上的TaskTracker共同組成的。JobTacker負責調度構成一個作業的所有任務,這些任務分佈在不同的從節點上。
-
MapReduce模型原理是利用一個輸入的key/value對集合來產生一個輸出的key/value隊集合,使用Map和Reduce函數來計算
-
MapReduce將大數據分解爲成百上千小數據集,每個數據集分別由集羣中的一個節點(一般是一臺計算機)並行處理生成中間結果,後然這些中間結果又由大量的節點合併,形成最終結果
-
echo "hello world">test1.txt
-
echo是指回顯示,可以理解爲print, 大於符(>)爲重定向,正常echo是顯示在屏幕上,而用了重定向後,即內容顯示在了text1.txt文件裏。那這句話意思是,創建一個test1.txt文件,其內容是"hello world"。
-
移動計算:
-
程序自動分發到各hadoop結點上進行計算,然後通過一定機制把結果進行彙總最後返回出來,這稱之爲移動計算。顯然,移動計算要比移動數據成本要低得多。
-
google三駕馬車:
-
也就是在google在2003年到2004年公佈了關於GFS、MapReduce和BigTable三篇技術論文,即google的三駕馬車。
-
Hadoop的HDFS對就google的GFS,MapReduce對就google的MapReduce,Hadoop的HBase對應google的BigTable。
-
(注:HBase是其於hadoop開發的類似數據操作的軟件)。
-
到現在hadoop的核心價值總算摸清了,一是分佈式存儲,二是移動計算。
spark :
-
RDD:(非常適合機器學習)
-
在Spark裏,所有的處理和計算任務都會被組織成一系列Resilient Distributed Dataset(彈性分佈式數據集,簡稱RDD)上的transformations(轉換) 和 actions(動作)。
-
RDD是一個包含諸多元素、被劃分到不同節點上進行並行處理的數據集合,可以將RDD持久化到內存中,這樣就可以有效地在並行操作中複用(在機器學習這種需要反覆迭代的任務中非常有效)。在節點發生錯誤時RDD也可以自動恢復。
-
SparkContext是用來鏈接
-
使用sc.parallelize,你可以把Python list,NumPy array或者Pandas Series、Pandas DataFrame轉成Spark RDD
-
初始化RDD方法2
-
第2種方式當然是直接把文本讀到RDD了
-
你的每一行都會被當做一個item,不過需要注意的一點是,Spark一般默認你的路徑是指向HDFS的,如果你要從本地讀取文件的話,給一個file://開頭的全局路徑。(服務器的本地)
-
RDD transformation的那些事
-
map() 對RDD的每一個item都執行同一個操作
-
flatMap() 對RDD中的item執行同一個操作以後得到一個list,然後以平鋪的方式把這些list裏所有的結果組成新的list
-
filter() 篩選出來滿足條件的item
-
distinct() 對RDD中的item去重
-
sample() 從RDD中的item中採樣一部分出來,有放回或者無放回
-
sortBy() 對RDD中的item進行排序
-
比較炫酷的是,前面提到的Transformation,可以一個接一個地串聯,
-
resultRDD = (numbersRDD # In parentheses so we can write each
-
.map(doubleIfOdd) # transformation in one line
-
.filter(lambda x: x > 6)
-
.distinct())
-
要結果的話調用 resultRDD.collect() ---確認量級是否會爆掉
-
RDD間的操作
-
rdd1.union(rdd2): 所有rdd1和rdd2中的item組合
-
rdd1.intersection(rdd2): rdd1 和 rdd2的交集
-
rdd1.substract(rdd2): 所有在rdd1中但不在rdd2中的item(差集)
-
rdd1.cartesian(rdd2): rdd1 和 rdd2中所有的元素笛卡爾乘積
-
特別注意:
-
Spark的一個核心概念是惰性計算。當你把一個RDD轉換成另一個的時候,這個轉換不會立即生效執行!!!
-
Spark會把它先記在心裏,等到真的需要拿到轉換結果的時候,纔會重新組織你的transformations(因爲可能有一連串的變換)
-
這樣可以避免不必要的中間結果存儲和通信。
-
RDD Actions
-
collect(): 計算所有的items並返回所有的結果到driver端,接着 collect()會以Python list的形式返回結果
-
first(): 和上面是類似的,不過只返回第1個item
-
take(n): 類似,但是返回n個item
-
count(): 計算RDD中item的個數
-
top(n): 返回頭n個items,按照自然結果排序
-
reduce(): 對RDD中的items做聚合
-
有一個很有用的操作,我們試想一下,有時候我們需要重複用到某個transform序列得到的RDD結果。但是一遍遍重複計算顯然是要開銷的,所以我們可以通過一個叫做cache()的操作把它暫時地存儲在內存中:
-
針對更復雜結構的transform和action
-
reduceByKey(): 對所有有着相同key的items執行reduce操作
-
groupByKey(): 返回類似(key, listOfValues)元組的RDD,後面的value List 是同一個key下面的
-
sortByKey(): 按照key排序
-
countByKey(): 按照key去對item個數進行統計
-
collectAsMap(): 和collect有些類似,但是返回的是k-v的字典
個人感悟:
本週進入hard模式,至少對我來說是。但同樣也發現了很多有趣的東西,像map-reduce和HDFS,以前只是聽過,但這次是詳細的學習,發現分佈式存儲和分佈式計算優勢很大,而且以後互聯網的發展,數據量會越來越大,能發現大數據背後的價值變得很重要,畢竟現在還有很多公司做的一些決策都是憑個人感覺來做的,如果換成base
on data,進步空間會很大。
現在看來之前學的課程分成三個部分,都可以單獨找工作了:
-
python 爬蟲工程師
-
python 數據分析工程師
-
hadoop ,spark大數據工程師
但是我的定位是機器學習中的圖像處理領域,而且要成爲圖像處理領域的專才。上面列出這些也要會,同時瞭解它們原理和能使用。我也非常瞭解自己的能力範圍,所以目前的原則就是“專注自己熱愛的領域,同時嚴格按照老師的課程安排去學習和做練習,但不能太在意細節和鑽牛角尖,跟上課程進度”