Apache Spark原始碼剖析

broadviewbj發表於2015-03-23
 

Apache Spark原始碼剖析(全面系統介紹Spark原始碼,提供分析原始碼的實用技巧和合理的閱讀順序,充分了解Spark的設計思想和執行機理

許鵬 著  

ISBN 978-7-121-25420-8

20153月出版

定價:68.00

304

16

編輯推薦

Spark ContributorDatabricks工程師連城,華為大資料平臺開發部部長陳亮,網易杭州研究院副院長汪源,TalkingData首席資料科學家張夏天聯袂力薦

1.本書全面、系統地介紹了Spark原始碼,深入淺出,細緻入微

2.提供給讀者一系列分析原始碼的實用技巧,並給出一個合理的閱讀順序

3.始終抓住資源分配、訊息傳遞、容錯處理等基本問題,抽絲撥繭

4.一步步尋找答案,所有問題迎刃而解,使讀者知其然更知其所以然

內容提要

Apache Spark原始碼剖析》以Spark 1.02版本原始碼為切入點,著力於探尋Spark所要解決的主要問題及其解決辦法,透過一系列精心設計的小實驗來分析每一步背後的處理邏輯。

Apache Spark原始碼剖析》第3~5章詳細介紹了Spark Core中作業的提交與執行,對容錯處理也進行了詳細分析,有助讀者深刻把握Spark實現機理。第6~9章對Spark Lib庫進行了初步的探索。在對原始碼有了一定的分析之後,讀者可儘快掌握Spark技術。

Apache Spark原始碼剖析》對於Spark應用開發人員及Spark叢集管理人員都有極好的學習價值;對於那些想從原始碼學習而又不知如何入手的讀者,也不失為一種借鑑。
 

目錄

第一部分Spark概述1

1章初識Spark   3

1.1 大資料和Spark 3

1.1.1 大資料的由來4

1.1.2 大資料的分析4

1.1.3 Hadoop 5

1.1.4 Spark簡介6

1.2 Spark的第一次親密接觸7

1.2.1 環境準備7

1.2.2 下載安裝Spark 8

1.2.3 Spark下的WordCount 8

第二部分Spark核心概念13

2Spark整體框架 15

2.1 程式設計模型15

2.1.1 RDD 17

2.1.2 Operation 17

2.2 執行框架18

2.2.1 作業提交18

2.2.2 叢集的節點構成18

2.2.3 容錯處理19

2.2.4 為什麼是Scala 19

2.3 原始碼閱讀環境準備19

2.3.1 原始碼下載及編譯19

2.3.2 原始碼目錄結構21

2.3.3 原始碼閱讀工具21

2.3.4 本章小結22

3SparkContext初始化 23

3.1 spark-shell 23

3.2 SparkContext的初始化綜述27

3.3 Spark Repl綜述30

3.3.1 Scala Repl執行過程31

3.3.2 Spark Repl 32

4Spark作業提交 33

4.1 作業提交33

4.2 作業執行38

4.2.1 依賴性分析及Stage劃分39

4.2.2 Actor ModelAkka 46

4.2.3 任務的建立和分發47

4.2.4 任務執行53

4.2.5 CheckpointCache 62

4.2.6 WebUIMetrics 62

4.3 儲存機制71

4.3.1 Shuffle結果的寫入和讀取71

4.3.2 Memory Store 80

4.3.3 儲存子模組啟動過程分析81

4.3.4 資料寫入過程分析82

4.3.5 資料讀取過程分析84

4.3.6 TachyonStore 88

5章部署方式分析 91

5.1 部署模型91

5.2 單機模式local 92

5.3 偽叢集部署local-cluster 93

5.4 原生叢集Standalone Cluster 95

5.4.1 啟動Master 96

5.4.2 啟動Worker 97

5.4.3 執行spark-shell 102

5.4.4 容錯性分析106

5.5 Spark On YARN 112

5.5.1 YARN的程式設計模型112

5.5.2 YARN中的作業提交112

5.5.3 Spark On YARN實現詳解113

5.5.4 SparkPi on YARN 122

第三部分Spark Lib 129

6Spark Streaming  131

6.1 Spark Streaming整體架構131

6.1.1 DStream 132

6.1.2 程式設計介面133

6.1.3 Streaming WordCount 134

6.2 Spark Streaming執行過程135

6.2.1 StreamingContext初始化過程136

6.2.2 資料接收141

6.2.3 資料處理146

6.2.4 BlockRDD 155

6.3 視窗操作158

6.4 容錯性分析159

6.5 Spark Streaming vs. Storm 165

6.5.1 Storm簡介165

6.5.2 StormSpark Streaming對比168

6.6 應用舉例168

6.6.1 搭建Kafka Cluster 168

6.6.2 KafkaWordCount 169

7SQL   173

7.1 SQL語句的通用執行過程分析175

7.2 SQL On Spark的實現分析178

7.2.1 SqlParser 178

7.2.2 Analyzer 184

7.2.3 Optimizer 191

7.2.4 SparkPlan 192

7.3 Parquet 檔案和JSON資料集196

7.4 Hive簡介197

7.4.1 Hive 架構197

7.4.2 HiveQL On MapReduce執行過程分析199

7.5 HiveQL On Spark詳解200

7.5.1 Hive On Spark環境搭建206

7.5.2 編譯支援Hadoop 2.xSpark 211

7.5.3 執行Hive On Spark測試用例213

8GraphX  215

8.1 GraphX簡介215

8.1.1 主要特點216

8.1.2 版本演化216

8.1.3 應用場景217

8.2 分散式圖計算處理技術介紹218

8.2.1 屬性圖218

8.2.2 圖資料的儲存與分割219

8.3 Pregel計算模型220

8.3.1 BSP 220

8.3.2 像頂點一樣思考220

8.4 GraphX圖計算框架實現分析223

8.4.1 基本概念223

8.4.2 圖的載入與構建226

8.4.3 圖資料儲存與分割227

8.4.4 操作介面228

8.4.5 PregelGraphX中的原始碼實現230

8.5 PageRank 235

8.5.1 什麼是PageRank 235

8.5.2 PageRank核心思想235

9MLLib   239

9.1 線性迴歸239

9.1.1 資料和估計240

9.1.2 線性迴歸引數求解方法240

9.1.3 正則化245

9.2 線性迴歸的程式碼實現246

9.2.1 簡單示例246

9.2.2 入口函式train 247

9.2.3 最最佳化演算法optimizer 249

9.2.4 權重更新update 256

9.2.5 結果預測predict 257

9.3 分類演算法257

9.3.1 邏輯迴歸258

9.3.2 支援向量機260

9.4 擬牛頓法261

9.4.1 數學原理261

9.4.2 程式碼實現265

9.5 MLLib與其他應用模組間的整合268

第四部分附錄271

附錄A Spark原始碼除錯 273

附錄B 原始碼閱讀技巧 283

作者簡介

許鵬長期致力於電信領域和網際網路的軟體研發,在資料處理方面積累了大量經驗,對系統的可擴充套件性、可靠性方面進行過深入學習和研究。因此,累積了大量的原始碼閱讀和分析的技巧與方法。目前在杭州同盾科技擔任大資料平臺架構師一職。對於Linux核心,作者也曾進行過深入的分析。

媒體評論

HadoopHiveStorm等老牌大資料系統相比,Spark的程式碼體積要小得多。然而這樣一套精簡的系統卻同時承載了批處理、流處理、迭代計算、關係查詢、圖計算等多種計算正規化,再加上Scala和函數語言程式設計並不為普通程式設計師所熟悉,閱讀和分析Spark原始碼並不是一件特別輕鬆的事情。本書記錄了一系列分析Spark原始碼的實用技巧,並給出了一個合理的閱讀順序,相信可以令學習Spark的讀者們事半功倍。

                              ——Spark ContributorDatabricks工程師  連城

介紹Spark的書籍很多,但一般不夠全面,而這本書非常系統全面地介紹了Spark原始碼,深入淺出、細緻入微,把Spark的由來、Spark整體框架、Spark各軟體棧、Spark環境搭建、Spark部署模式等從原始碼角度一步步剖析得非常清楚。作者有很強的系統設計、軟體工程功底,讀者不僅可以從書中學到Spark知識,還可以學習到作者對新技術研究、原始碼研究很多好的方法和技巧。授人以魚不如授人以漁,對在校大學生、Spark初學者、大資料開發工程師來說,這本書非常值得擁有。

                                       ——華為大資料平臺開發部部長  陳亮

難以置信,薄薄的一本書可以兼具如此的廣度與深度。除了Spark核心系統,本書還介紹了StreamingSQLGraphXMLLib等擴充套件庫,內容相當全面。但更“贊”的是本書對Spark及各擴充套件庫的執行機理,無不提綱挈領,一一闡明,讓讀者不但知其然,還能知其所以然。如果想在生產環境中用好Spark,本書值得細讀。

——網易杭州研究院副院長  汪源

Spark目前正在蓬勃發展,越來越多的公司把大資料計算任務遷移到Spark平臺上來。Spark開發的學習曲線並不陡峭。但是處理大資料,需要的不僅是邏輯正確的程式,還需要高效能的程式。如果想把Spark的效能挖掘到極致,那就需要深入瞭解Spark的設計思想和執行機制,而要了解這些,沒有比讀原始碼更直接的了。許鵬老師的這本書,對於那些沒有時間、精力直接啃原始碼或者對Scala語言還不太精通的讀者來說是一個福音。

                                ——TalkingData首席資料科學家  張夏天

前言

筆者接觸Spark時間不算很長,而本書之所以能夠出版,憑藉的是濃厚的興趣和執著之心。

這一切還要從Storm說起。筆者一直在做網際網路相關工作,但接觸大資料的時間並不長,當時HadoopStorm等非常紅火,引起了筆者的“窺視”之心。從2013年開始,筆者打算看看Hadoop的原始碼實現,觀察其程式碼規模,發覺所花時間可能會很長。恰好其時Storm風頭正勁,於是轉向Storm原始碼,0.8版的Storm程式碼規模不過20 000行左右,感覺還是比較好入手的。

Storm原始碼分析期間,筆者還學習了ClojureZeroMQThriftZooKeeperLMAX Disruptor等新技術,對於實時流資料處理算是有了一個大概的瞭解。由於聽說在實時流資料處理領域Spark技術也很強悍,而且在容錯性方面具有天生的優勢,更引發了筆者的興趣,為了弄清楚究竟,於是開始了Spark的原始碼走讀過程。

筆者是以讀Spark論文開始的,說老實話覺得晦澀難懂,因為無法將其對映到記憶體使用、程式啟動、執行緒執行、訊息傳遞等基本問題上。或許換個方法會更好,故筆者選擇直接從原始碼入手,如此一來事情反而變簡單了。在原始碼分析的過程中,筆者始終抓住資源分配、訊息傳遞、容錯處理等基本問題設問,然後一步步努力尋找答案,所有的問題漸漸迎刃而解。

筆者關於原始碼分析有一個心得,就是要緊緊把握住計算的基本模型,然後結合新分析問題的業務領域,將業務上的新問題轉換到計算處理的老套路上來,然後就可以以不變應萬變,而不被一些新技術名詞晃花了眼。這裡所說的老套路是指從作業系統的角度來看,如果能事先深度瞭解作業系統,將對分析一些新應用程式大有裨益。

Spark原始碼採用Scala語言編寫,那麼閱讀Spark原始碼之前,是否一定要先學Scala呢?筆者個人以為不必,只要你有一些JavaC++程式語言的基礎,就可以開始看Spark原始碼,遇到不懂的地方再去學習,效率反而會大大提高,做到有的放矢。將學習中遇到的知識點,從函數語言程式設計、泛型程式設計、物件導向、並行程式設計等幾個方面去整理歸納,這樣能夠快速將Scala語言的框架勾勒出來。

本書第1章和第2章簡要介紹了大資料分析技術的產生背景和演進過程;第35章詳細分析了Spark Core中的作業規劃、提交及任務執行等內容,對於要深刻把握Spark實現機理的讀者來說,這幾章值得反覆閱讀;第69章就Spark提供的高階Lib庫進行了簡要的分析,分析的思路是解決的主要問題是什麼、解決的方案是如何產生的,以及方案是如何透過程式碼來具體實現的。

在對原始碼有了一定的分析和掌握之後,再回過頭來看一下Spark相關的論文,這時候對論文的理解可能會更順暢。

Spark的整體框架非常龐大,涵蓋的範圍也很廣,隨著筆者在工作中使用得越來越具體,這樣的感受也越來越深。另外,必須要說對於Spark來說,筆者所做的分析實在有限,箇中錯誤在所難免,讀者諸君還請多多諒解。

在本書成稿期間,電子工業出版社的付睿編輯和李雲靜編輯給出了極為詳細的改進意見,在這裡表示衷心的感謝。最後感謝家人的支援和鼓勵,親愛的老婆和懂事的兒子給了筆者堅持的理由和勇氣。

許 鵬

20152

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-1470111/,如需轉載,請註明出處,否則將追究法律責任。

相關文章