Dpark源碼剖析
Spark是一個當下很火的集群計算平臺,來自于加州大學伯克利分校的AMPLab,目前從Apache孵化器畢業,成為了Apache基金會下的頂級項目。現在的spark類似于hadoop,逐漸成長為一種生態系統。如下圖所示,其上層包含了一系列計算工具,包括:
- Shark for SQL,查詢hadoop數據的分布式SQL查詢引擎,類似于hadoop上的hive,但效率更高。
- Streaming,利用spark來進行大規模流式數據處理。
- MLlib,基于spark的機器學習庫。
- Graphx,spark之上的圖計算框架,支持Pregel和GraphLab的計算模型。
從spark創建之初,其對hadoop的支持就相當充分,當然一部分原因來自于Scala語言和Java語言交互的便利性。由上圖可以看出,spark支持從HDFS等讀出數據。盡管最開始,spark最先支持的是 mesos (一個統一資源管理和調度平臺),但在hadoop Yarn推出之后亦能很好地支持。除此之外,Spark能以本地多線程方式運行(local模式),也能以脫離mesos和Yarn的方式運行(standalone模式)。
Spark發展地如火如荼,盡管對于正常使用來說,我們不需要了解其內部的實現。但是要想深入優化上層應用,對底層的實現的了解是在所難免的。但是由于Scala語言的障礙,要想學習Spark需要從scala開始,學習曲線未免長了點。好在豆瓣的同學實現了一個spark的Python克隆: Dpark ,其完全用Python語言翻譯了spark。經過一段時間的研究,我對dpark的源碼也有了一定程度的了解,因此就想寫個系列來介紹其運行的原理。
然而Dpark有著不少的缺陷,下面就一一列舉:
- 由于dpark翻譯的時間較早(應該是spark 0.5前的版本,而spark目前最新版本已經是0.9),支持已經非常陳舊了。盡管dpark中RDD(spark中重要概念,表示彈性分布式數據集)還是內存層面上的抽象,而spark中的RDD是對內存和磁盤的統一抽象,另外缺少了上層的計算工具,但是其整體的思想是沒有什么變化的。
- 對Hadoop的支持非常糟糕,dpark不支持從HDFS讀取數據,取代支持的為分布式文件系統 MooseFS ;另外也不支持Yarn,當然還是支持mesos來進行調度的。
- 社區滯后,dpark目前的資料匱乏,開發也僅限于豆瓣的同學,沒有來自社區的力量。spark則正好相反,社區的發展日益蓬勃,從底層到上層都有來自社區的大量貢獻。
- GIL的限制,dpark中用多進程取代了spark中的多線程。
- 性能不佳,根據豆瓣的官方資料,dpark的性能甚至不如hadoop,這點讓我比較吃驚。看來Python語言的性能劣勢抵消了架構上帶來的好處。
這些缺陷不能說dpark沒有意義,其還是很好的學習工具。本來我研究dpark的初衷,是想完善其對Hadoop的支持,并移植spark graphx到dpark上。現在我更傾向于回歸spark中,但是通過對dpark的研究,上手spark應該也更加容易。
Spark經過這么多版本的迭代,基本思想沒有太大變化。我希望通過這個系列,能讓大家能更容易地了解dpark/spark。本文也會作為系列的索引,并隨著系列的進展而更新。