機器學習集訓營---第五週總結

本週主要講大數據分析和處理,包含:
  1. hadoop 使用,map-reduce概念和使用
  2. spark與大數據處理

下面詳細記錄一下知識點:
hadoop
  1. HDFS  分佈式文件系統
    1. 主從結構,一個namenoe和多個datanode, 分別對應獨立的物理機器
    2. NameNode是主服務器,管理文件系統的命名空間和客戶端對文件的訪問操作。NameNode執行文件系統的命名空間操作,比如打開關閉重命名文件或者目錄等,它也負責數據塊到具體DataNode的映射
    3. 集羣中的DataNode管理存儲的數據。負責處理文件系統客戶端的文件讀寫請求,並在NameNode的統一調度下進行數據塊的創建刪除和複製工作。
    4. NameNode是所有HDFS元數據的管理者,用戶數據永遠不會經過NameNode
  2. MapReduce  並行計算框架
    1. 主從結構,一個JobTracker和多個TaskTracker
    2. MapReduce是由一個單獨運行在主節點上的JobTacker和運行在每個集羣從節點上的TaskTracker共同組成的。JobTacker負責調度構成一個作業的所有任務,這些任務分佈在不同的從節點上。
    3.  MapReduce模型原理是利用一個輸入的key/value對集合來產生一個輸出的key/value隊集合,使用Map和Reduce函數來計算
    4. MapReduce將大數據分解爲成百上千小數據集,每個數據集分別由集羣中的一個節點(一般是一臺計算機)並行處理生成中間結果,後然這些中間結果又由大量的節點合併,形成最終結果
  3. echo "hello world">test1.txt
    1. echo是指回顯示,可以理解爲print, 大於符(>)爲重定向,正常echo是顯示在屏幕上,而用了重定向後,即內容顯示在了text1.txt文件裏。那這句話意思是,創建一個test1.txt文件,其內容是"hello world"。
  4. 移動計算:
    1. 程序自動分發到各hadoop結點上進行計算,然後通過一定機制把結果進行彙總最後返回出來,這稱之爲移動計算。顯然,移動計算要比移動數據成本要低得多。
  5. google三駕馬車:
    1. 也就是在google在2003年到2004年公佈了關於GFS、MapReduce和BigTable三篇技術論文,即google的三駕馬車。
    2. Hadoop的HDFS對就google的GFS,MapReduce對就google的MapReduce,Hadoop的HBase對應google的BigTable。
    3. (注:HBase是其於hadoop開發的類似數據操作的軟件)。
  6. 到現在hadoop的核心價值總算摸清了,一是分佈式存儲,二是移動計算。

spark :
  1. RDD:(非常適合機器學習)
    1. 在Spark裏,所有的處理和計算任務都會被組織成一系列Resilient Distributed Dataset(彈性分佈式數據集,簡稱RDD)上的transformations(轉換) 和 actions(動作)。
    2. RDD是一個包含諸多元素、被劃分到不同節點上進行並行處理的數據集合,可以將RDD持久化到內存中,這樣就可以有效地在並行操作中複用(在機器學習這種需要反覆迭代的任務中非常有效)。在節點發生錯誤時RDD也可以自動恢復。
  2. SparkContext是用來鏈接
  3. 使用sc.parallelize,你可以把Python list,NumPy array或者Pandas Series、Pandas DataFrame轉成Spark RDD
  4. 初始化RDD方法2
    1. 第2種方式當然是直接把文本讀到RDD了
    2. 你的每一行都會被當做一個item,不過需要注意的一點是,Spark一般默認你的路徑是指向HDFS的,如果你要從本地讀取文件的話,給一個file://開頭的全局路徑。(服務器的本地)
  5. RDD transformation的那些事
    1. map() 對RDD的每一個item都執行同一個操作
    2. flatMap() 對RDD中的item執行同一個操作以後得到一個list,然後以平鋪的方式把這些list裏所有的結果組成新的list
    3. filter() 篩選出來滿足條件的item
    4. distinct() 對RDD中的item去重
    5. sample() 從RDD中的item中採樣一部分出來,有放回或者無放回
    6. sortBy() 對RDD中的item進行排序
  6. 比較炫酷的是,前面提到的Transformation,可以一個接一個地串聯,
    1. resultRDD = (numbersRDD # In parentheses so we can write each
    2. .map(doubleIfOdd) # transformation in one line
    3. .filter(lambda x: x > 6)
    4. .distinct())
    5. 要結果的話調用 resultRDD.collect() ---確認量級是否會爆掉
  7. RDD間的操作
    1. rdd1.union(rdd2): 所有rdd1和rdd2中的item組合
    2. rdd1.intersection(rdd2): rdd1 和 rdd2的交集
    3. rdd1.substract(rdd2): 所有在rdd1中但不在rdd2中的item(差集)
    4. rdd1.cartesian(rdd2): rdd1 和 rdd2中所有的元素笛卡爾乘積
  8. 特別注意:
    1. Spark的一個核心概念是惰性計算。當你把一個RDD轉換成另一個的時候,這個轉換不會立即生效執行!!!
    2. Spark會把它先記在心裏,等到真的需要拿到轉換結果的時候,纔會重新組織你的transformations(因爲可能有一連串的變換)
    3. 這樣可以避免不必要的中間結果存儲和通信。
  9. RDD Actions
    1. collect(): 計算所有的items並返回所有的結果到driver端,接着 collect()會以Python list的形式返回結果
    2. first(): 和上面是類似的,不過只返回第1個item
    3. take(n): 類似,但是返回n個item
    4. count(): 計算RDD中item的個數
    5. top(n): 返回頭n個items,按照自然結果排序
    6. reduce(): 對RDD中的items做聚合
  10. 有一個很有用的操作,我們試想一下,有時候我們需要重複用到某個transform序列得到的RDD結果。但是一遍遍重複計算顯然是要開銷的,所以我們可以通過一個叫做cache()的操作把它暫時地存儲在內存中:
  11. 針對更復雜結構的transform和action
    1. reduceByKey(): 對所有有着相同key的items執行reduce操作
    2. groupByKey(): 返回類似(key, listOfValues)元組的RDD,後面的value List 是同一個key下面的
    3. sortByKey(): 按照key排序
    4. countByKey(): 按照key去對item個數進行統計
    5. collectAsMap(): 和collect有些類似,但是返回的是k-v的字典

個人感悟:
本週進入hard模式,至少對我來說是。但同樣也發現了很多有趣的東西,像map-reduce和HDFS,以前只是聽過,但這次是詳細的學習,發現分佈式存儲和分佈式計算優勢很大,而且以後互聯網的發展,數據量會越來越大,能發現大數據背後的價值變得很重要,畢竟現在還有很多公司做的一些決策都是憑個人感覺來做的,如果換成base on data,進步空間會很大。
現在看來之前學的課程分成三個部分,都可以單獨找工作了:
  1. python 爬蟲工程師
  2. python 數據分析工程師
  3. hadoop ,spark大數據工程師
但是我的定位是機器學習中的圖像處理領域,而且要成爲圖像處理領域的專才。上面列出這些也要會,同時瞭解它們原理和能使用。我也非常瞭解自己的能力範圍,所以目前的原則就是“專注自己熱愛的領域,同時嚴格按照老師的課程安排去學習和做練習,但不能太在意細節和鑽牛角尖,跟上課程進度”


發佈了253 篇原創文章 · 獲贊 188 · 訪問量 140萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章