Spark是發源于美國加州大學伯克利分校AMPLab的集群計算平臺,它立足于內存計算,性能超過Hadoop百倍,即使使用磁盤,迭代類型的計算也會有10倍速度的提升。Spark從多迭代批量處理出發,兼收并蓄數據倉庫、流處理和圖計算等多種計算范式,是罕見的全能選手。Spark當下已成為Apache基金會的頂級開源項目,擁有著龐大的社區支持――活躍開發者人數已超過Hadoop MapReduce)。這里,我們為大家分享許鵬的“Apache Spark源碼走讀”系列博文,從源碼方面對這個流行大數據計算框架進行深度了解。
關于博主:許鵬,花名@徽滬一郎,2000年畢業于南京郵電學院,現就業于愛立信上海,在UDM部門從事相關產品研發,個人關注于Linux 內核及實時計算框架如Storm、Spark等。
源碼閱讀是一件非常容易的事,也是一件非常難的事。容易的是代碼就在那里,一打開就可以看到。難的是要通過代碼明白作者當初為什么要這樣設計,設計之初要解決的主要問題是什么。
在對Spark的源碼進行具體的走讀之前,如果想要快速對Spark的有一個整體性的認識,閱讀Matei Zaharia做的Spark論文是一個非常不錯的選擇。
在閱讀該論文的基礎之上,再結合Spark作者在2012 Developer Meetup上做的演講Introduction to Spark Internals,那么對于Spark的內部實現會有一個比較大概的了解。
有了上述的兩篇文章奠定基礎之后,再來進行源碼閱讀,那么就會知道分析的重點及難點。
1. RDD――Resillient Distributed Dataset 彈性分布式數據集。
2. Operation――作用于RDD的各種操作分為transformation和action。
3. Job――作業,一個JOB包含多個RDD及作用于相應RDD上的各種operation。
4. Stage――一個作業分為多個階段。
5. Partition――數據分區, 一個RDD中的數據可以分成多個不同的區。
6. DAG――Directed Acycle graph,有向無環圖,反應RDD之間的依賴關系。
7. Narrow dependency――窄依賴,子RDD依賴于父RDD中固定的data partition。
8. Wide Dependency――寬依賴,子RDD對父RDD中的所有data partition都有依賴。
9. Caching Managenment――緩存管理,對RDD的中間計算結果進行緩存管理以加快整體的處理速度。
RDD是只讀的數據分區集合,注意是數據集。
作用于RDD上的Operation分為transformantion和action。 經Transformation處理之后,數據集中的內容會發生更改,由數據集A轉換成為數據集B;而經Action處理之后,數據集中的內容會被歸約為一個具體的數值。
只有當RDD上有action時,該RDD及其父RDD上的所有operation才會被提交到cluster中真正的被執行。
從代碼到動態運行,涉及到的組件如下圖所示。
演示代碼
val sc = new SparkContext("Spark://...", "MyJob", home, jars) val file = sc.textFile("hdfs://...") val errors = file.filter(_.contains("ERROR")) errors.cache() errors.count()
不管什么樣的靜態模型,其在動態運行的時候無外乎由進程,線程組成。
用Spark的術語來說,static view稱為dataset view,而dynamic view稱為parition view。關系如圖所示
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈