1. 程式人生 > >既生Mahout,何生Spark MLlib ?

既生Mahout,何生Spark MLlib ?

Apache Mahout與Spark MLlib均是Apache下的專案,都是機器學習演算法庫,並且現在mahout已經不再接受MapReduce的作業了,也向Spark轉移。

那兩者有什麼關係呢?我們在應用過程中該作何取捨?既然已經有了Mahout,為什麼還會再有MLlib的盛行呢?雖然在後續資料蒐集解決疑惑的過程中,Mahout和MLlib並非“瑜”和“亮”的關係,但是小編在最初還是忍不住冒出“既生瑜,何生亮”的感慨來......

640?wx_fmt=png&wxfrom=5&wx_lazy=1

除了關於機器學習庫方面的疑問,同樣在執行機制上也存在疑惑:MLib和mahout都執行在hadoop上,底層都是基於HDFS檔案系統;但Mlib執行在spark上,主要基於記憶體計算,大家都知道基於記憶體計算肯定是比資料庫I/O快的,那麼會不會在能處理的資料量級別上不如mahout?會不會對硬體有更高需求?能否實現增加節點線性增加計算能力?

Apache Mahout && Spark MLlib

Mahout是hadoop的一個機器學習庫,主要的程式設計模型是MapReduce;Spark ML則是基於Spark的機器學習,Spark自身擁有MLlib作為機器學習庫。現在Mahout已經停止接受新的MapReduce演算法了,向Spark遷移。

按照Mahout程式碼貢獻者的提法,Weathering Thru Tech Days: Mahout 0.10.x: first Mahout release as a programming environment。Mahout已經不再開發和維護新的基於MR的演算法,會轉向支援Scala,同時支援多種分散式引擎,包括Spark和H20。另外,Mahout和Spark ML並不是競爭關係,Mahout是MLlib的補充。

傳統的Mahout是提供的是Java的API,使用者應用會編譯成MapReduce的job,執行在MapReduce的框架上。從現在看來,這種方式開發效率低,執行速度慢,已經過時了。而,Spark特別適合迭代式的計算這正是機器學習演算法訓練所需要的。那麼是不是可以說Mahout肯定會被Spark取代呢?非也。Mahout社群也在憋大招。

Apache Mahout 機器學習庫

Mahout只是一個java的軟體庫,並不提供使用者介面預裝伺服器或者安裝程式。

現在Mahout專案在理論上可以實現大部分型別的機器學習技術,但是實際上現在它僅僅關注推薦引擎(協同過濾)、聚類和分類。其次Mahout是可擴充套件的,它旨在當所處理的資料規模遠大於單機處理能力時成為一種可選的機器學習工具。在現在Mahout中,這些可擴充套件的機器學習實現都是用java來寫的,而且有些事建立在

Apache的Hadoop分散式計算專案之上的。

(以下內容兩點說明來自知乎回答:如何看待mahout和milib之間的關係,mahout真的死了麼?

著眼於計算平臺

在Mahout的開發者看來,Mllib各種演算法像一個黑盒子,只有少量引數可以調整,也許用起來很簡單,但是很多時候並不能滿足不同使用者的需要。未來的Mahout的目標是機器學習平臺,它將提供類似R和Scala的DSL,支援類似分散式向量計算,大資料統計等基本功能,讓使用者可以很方便的將演算法轉化為程式碼。

支援多種後端

另外,未來的Mahout將支援多種後端,spark是一種,也許還有Flink。

具體可以參考這幾篇文章

1. Weathering Thru Tech Days: Mahout 0.10.x: first Mahout release as a programming environment

2. What are the differences between Apache Mahout and Spark MLlib?

下面是未來Mahout的架構圖。

0?wx_fmt=jpeg

Spark MLlib 機器學習庫

Spark之所以在機器學習方面具有得天獨厚的優勢,有以下幾點原因:

(1)機器學習演算法一般都有很多個步驟迭代計算的過程,機器學習的計算需要在多次迭代後獲得足夠小的誤差或者足夠收斂才會停止,迭代時如果使用Hadoop的MapReduce計算框架,每次計算都要讀/寫磁碟以及任務的啟動等工作,這回導致非常大的I/O和CPU消耗。而Spark基於記憶體的計算模型天生就擅長迭代計算,多個步驟計算直接在記憶體中完成,只有在必要時才會操作磁碟和網路,所以說Spark正是機器學習的理想的平臺。

(2)從通訊的角度講,如果使用Hadoop的MapReduce計算框架,JobTracker和TaskTracker之間由於是通過heartbeat的方式來進行的通訊和傳遞資料,會導致非常慢的執行速度,而Spark具有出色而高效的Akka和Netty通訊系統,通訊效率極高。

MLlib(Machine Learnig lib) 是Spark對常用的機器學習演算法的實現庫,同時包括相關的測試和資料生成器。Spark的設計初衷就是為了支援一些迭代的Job, 這正好符合很多機器學習演算法的特點。在Spark官方首頁中展示了Logistic Regression演算法在Spark和Hadoop中執行的效能比較,如圖下圖所示。

0?wx_fmt=gif

可以看出在Logistic Regression的運算場景下,Spark比Hadoop快了100倍以上!

MLlib目前支援4種常見的機器學習問題: 分類、迴歸、聚類和協同過濾,MLlib在Spark整個生態系統中的位置如圖下圖所示。

0?wx_fmt=jpeg

MLlib基於RDD,天生就可以與Spark SQL、GraphX、Spark Streaming無縫整合,以RDD為基石,4個子框架可聯手構建大資料計算中心!

MLlib是MLBase一部分,其中MLBase分為四部分:MLlib、MLI、ML Optimizer和MLRuntime。

l  ML Optimizer會選擇它認為最適合的已經在內部實現好了的機器學習演算法和相關引數,來處理使用者輸入的資料,並返回模型或別的幫助分析的結果;

l  MLI 是一個進行特徵抽取和高階ML程式設計抽象的演算法實現的API或平臺;

l  MLlib是Spark實現一些常見的機器學習演算法和實用程式,包括分類、迴歸、聚類、協同過濾、降維以及底層優化,該演算法可以進行可擴充; MLRuntime 基於Spark計算框架,將Spark的分散式計算應用到機器學習領域。

0?wx_fmt=gif

Spark MLlib架構解析

從架構圖可以看出MLlib主要包含三個部分:

l  底層基礎:包括Spark的執行庫、矩陣庫和向量庫;

l  演算法庫:包含廣義線性模型、推薦系統、聚類、決策樹和評估的演算法;

l  實用程式:包括測試資料的生成、外部資料的讀入等功能。

0?wx_fmt=jpeg

從機器學習庫的角度,結合官網介紹和各位知乎大牛的分析,大致總結如下:

Mahout機器學習
每個企業的資料都是多樣的和特別針對他們需求的。然而, 在對那些資料的分析種類上卻沒多少多樣性。Mahout專案是實施普通分析計算的一個Hadoop庫。用例包括使用者協同過濾、使用者建議、聚類和分類。

MLlib:機器學習
MLlib 執行在spark上(一個基於記憶體計算的框架),
MLib和mahout都執行在hadoop上,底層都是基於HDFS檔案系統;但Mlib執行在spark上,主要基於記憶體計算

關於機器學習庫依舊存在很多不明白的點,那碰到就儘量去弄明白吧!

參考資料

1.Spark官網 mlllib說明  

http://spark.apache.org/docs/1.1.0/mllib-guide.html

2.機器學習常見演算法分類彙總》 

http://www.ctocio.com/hotnews/15919.html

宣告:以上內容如有侵犯到您的原創,請聯絡我們進行處理,謝謝!

0?wx_fmt=jpeg

那年亂世如麻,願你們來世擁有錦繡年華。

0?wx_fmt=jpeg

更多幹貨內容請關注微信公眾號“AI 深入淺出

長按二維碼關注