【機器學習實戰-python3】大數據與MapReduce

本篇的數據和代碼參見:https://github.com/stonycat/ML-in-Action

一、MapReduce:分佈式計算的框架
MapReduce

優點:可在短時間內完成大量工作。
缺點:算法必須經過重寫,需要對系統工程有一定的理解。
適用數據類型:數值型和標稱型數據。

Google公司的Jeffrey Dean和Sanjay Ghemawat在2004年的一篇論文中第一次提出了這個思想,該論文的題目是“MapReduce:Simplified Data Processing on Large Clusters” 1 MapReduce的名字由函數式編程中常用的map和reduce兩個單詞組成。

MapReduce的優勢在於,它使得程序以並行方式執行。
這裏寫圖片描述

在一些MapReduce的實現中,在多個機器上都保存有數據的多個備份,
例如在機器0上存放的輸入數據可能還存放在機器1上,以防機器0出現問題。同時,每個節點都必須與主節點通信,表明自己工作正常。如果某節點失效或者工作異常,主節點將重啓該節點或者將該節點移出可用機器池。
總結一下上面幾個例子中關於MapReduce的學習要點:

 主節點控制MapReduce的作業流程;
 MapReduce的作業可以分成map任務和reduce任務;
 map任務之間不做數據交流,reduce任務也一樣;
 在map和reduce階段中間,有一個sort或combine階段;
 數據被重複存放在不同的機器上,以防某個機器失效;
 mapper和reducer傳輸的數據形式爲key/value對。

Apache的Hadoop項目是MapReduce框架的一個實現。下一節將開始討論Hadoop項目,並介紹如何在Python中使用它。

二、Hadoop 流
Hadoop是一個開源的Java項目,爲運行MapReduce作業提供了大量所需的功能。除了分佈式計算之外,Hadoop自帶分佈式文件系統。

下面將使用Python編寫MapReduce代碼,並在Hadoop流中運行。Hadoop流(http://hadoop.apache. org/ common/docs/current/streaming.html)很像Linux系統中的管道(管道使用符號 | ,可以將一個命令的輸出作爲另一個命令的輸入)。如果用mapper.py調用mapper,用reducer.py調用reducer,那麼Hadoop流就可以像Linux命令一樣執行。
測試書中代碼:mrMeanMapper.py

$ cat inputFile.txt | python mrMeanMapper.py
100 0.509570 0.344439
report: still alive

其中第一行是標準輸出,也就是reducer的輸入;第二行是標準錯誤輸出,即對主節點做出的響應報告,表明本節點工作正常。

至此,mapper已經可以工作了,下面介紹reducer。根據前面的介紹,mapper接受原始的輸入併產生中間值傳遞給reducer。很多mapper是並行執行的,所以需要將這些mapper的輸出合併成一個值。mrMeanReducer.py

cat inputFile.txt | python mrMeanMapper.py | python mrMeanReducer.py
report: still alive
100 0.509570 0.344439
report: still alive

三、MapReduce 上的機器學習
下面的清單簡要列出了本書常用的機器學習算法和對應的MapReduce實現。

簡單貝葉斯——它屬於爲數不多的可以很自然地使用MapReduce的算法。在MapReduce中計算加法非常容易,而簡單貝葉斯正需要統計在某個類別下某特徵的概率。因此可以將每個指定類別下的計算作業交由單個的mapper處理,然後使用reducer來將結果加和。

k-近鄰算法——該算法首先試圖在數據集上找到相似向量,即便數據集很小,這個步驟也將花費大量的時間。在海量數據下,它將極大地影響日常商業週期的運轉。一個提速的辦法是構建樹來存儲數據,利用樹形結構來縮小搜索範圍。該方法在特徵數小於10的情況下效果很好。高維數據下(如文本、圖像和視頻)流行的近鄰查找方法是局部敏感哈希算法。

支持向量機(SVM)——使用的Platt SMO算法在MapReduce框架下難以實現。但有一些其他SVM的實現使用隨機梯度下降算法求解,如Pegasos算法。另外,還有一個近似的SVM算法叫做最鄰近支持向量機(proximal SVM),求解更快並且易於在MapReduce框架下實現 。

奇異值分解——Lanczos算法是一個有效的求解近似特徵值的算法。該算法可以應用在一系列MapReduce作業上,從而有效地找到大矩陣的奇異值。另外,該算法還可以應用於主成分分析。

K-均值聚類——一個流行的分佈式聚類方法叫做canopy聚類,可以先調用canopy聚類法取得初始的k個簇,然後再運行K-均值聚類方法。

注:書中涉及的在Python中使用mrjob自動化MapReduce和分佈式SVM的Pegasos算法示例這裏省略,感興趣可參考其他blog如:
http://blog.forec.cn/2016/02/27/machinelearning15/

你真的需要 MapReduce 嗎?
充分利用已有資源可以節省時間和精力。如果你的作業花費了太多的時間,先問問自己:代碼是否能用更有效率的語言編寫(如C或者Java)?如果語言已經足夠有效率,那麼代碼是否經過了充分的優化?影響處理速度的系統瓶頸在哪裏,是內存還是處理器?或許你不知道這些問題的答案,找一些人做些諮詢或討論將非常有益。大多數人意識不到單臺機器上可以做多少數字運算。如果沒有大數據的問題,一般不需要用到MapReduce和Hadoop。但對MapReduce和Hadoop稍作了解,在面臨大數據的問題時知道它們能做些什麼,還是很棒的一件事情。
——————————————————————————————————————————————————————————
小結:
當運算需求超出了當前資源的運算能力,可以考慮購買更好的機器,或者租用網絡服務並使用MapReduce框架並行執行。很多機器學習算法都可以容易地寫成MapReduce作業,而某些需要經過重寫。大部分情況下,MapReduce並不需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章