編輯推薦
適讀人群 :本書主要適閤於以下讀者:1.想要學習Scala語言的開發人員2.想要學習Spark原理的數據開發人員3.服務器和分布式係統開發人員4.分布式係統架構師5.Spark集群運維、部署及性 多位專傢聯袂推薦,360大數據專傢撰寫,剖析Spark 2.1.0架構與實現精髓
細化到方法級,提煉齣多個流程圖,立體呈現架構、環境、調度、存儲、計算、部署、API七大核心設計
內容簡介
多位專傢聯袂推薦,360大數據專傢撰寫,剖析Spark 2.1.0架構與實現精髓。細化到方法級,提煉齣多個流程圖,立體呈現架構、環境、調度、存儲、計算、部署、API七大核心設計。本書一共有10章內容,主要包括以下部分。
準備部分:介紹Spark的環境搭建和基本原理,有效降低瞭讀者進入Spark世界的門檻,同時對Spark背景知識及整體設計能有宏觀的認識。
基礎部分:介紹Spark的基礎設施(包括配置、RPC、度量等)、初始化、執行環境等內容,使讀者深入理解RPC框架的設計、執行環境功能,是瞭解核心內容的前提。
核心部分:該部分是Spark*為核心的部分,涵蓋存儲體係、調度係統、計算引擎、部署模式等。讀者將充分瞭解Spark的數據處理與實現細節,透視本質,是進行定製化、性能優化、精準排查的基礎,學習和工作更加高效。
API部分:這部分主要對Spark的新老API進行對比,對新API進行簡單介紹。
作者簡介
耿嘉安 10餘年IT行業相關經驗。先後就職於阿裏巴巴、藝龍、360,專注於開源和大數據領域。在大量的工作實踐中,對J2EE、JVM、Tomcat、Spring、Hadoop、Spark、MySQL、Redis都有深入研究,尤其喜歡剖析開源項目的源碼實現。早期從事J2EE企業級應用開發,對Java相關技術有獨到見解。著有《深入理解Spark:核心思想與源碼分析》一書。
目錄
目錄 Contents
本書贊譽
前言
第1章 環境準備 1
1.1 運行環境準備 2
1.1.1 安裝JDK 2
1.1.2 安裝Scala 2
1.1.3 安裝Spark 3
1.2 Spark初體驗 4
1.2.1 運行spark-shell 4
1.2.2 執行word count 5
1.2.3 剖析spark-shell 9
1.3 閱讀環境準備 14
1.3.1 安裝SBT 15
1.3.2 安裝Git 15
1.3.3 安裝Eclipse Scala IDE插件 15
1.4 Spark源碼編譯與調試 17
1.5 小結 23
第2章 設計理念與基本架構 24
2.1 初識Spark 25
2.1.1 Hadoop MRv1的局限25
2.1.2 Spark的特點 26
2.1.3 Spark使用場景 28
2.2 Spark基礎知識 29
2.3 Spark基本設計思想 31
2.3.1 Spark模塊設計 32
2.3.2 Spark模型設計 34
2.4 Spark基本架構 36
2.5 小結 38
第3章 Spark基礎設施 39
3.1 Spark配置 40
3.1.1 係統屬性中的配置 40
3.1.2 使用SparkConf配置的API 41
3.1.3 剋隆SparkConf配置 42
3.2 Spark內置RPC框架 42
3.2.1 RPC配置TransportConf 45
3.2.2 RPC客戶端工廠Transport- ClientFactory 47
3.2.3 RPC服務端TransportServer 53
3.2.4 管道初始化 56
3.2.5 TransportChannelHandler詳解 57
3.2.6 服務端RpcHandler詳解 63
3.2.7 服務端引導程序Transport-ServerBootstrap 68
3.2.8 客戶端TransportClient詳解 71
3.3 事件總綫 78
3.3.1 ListenerBus的繼承體係 79
3.3.2 SparkListenerBus詳解 80
3.3.3 LiveListenerBus詳解 83
3.4 度量係統 87
3.4.1 Source繼承體係 87
3.4.2 Sink繼承體係 89
3.5 小結 92
第4章 SparkContext的初始化 93
4.1 SparkContext概述 94
4.2 創建Spark環境 97
4.3 SparkUI的實現 100
4.3.1 SparkUI概述 100
4.3.2 WebUI框架體係 102
4.3.3 創建SparkUI 107
4.4 創建心跳接收器 111
4.5 創建和啓動調度係統112
4.6 初始化塊管理器BlockManager 114
4.7 啓動度量係統 114
4.8 創建事件日誌監聽器115
4.9 創建和啓動ExecutorAllocation-Manager 116
4.10 ContextCleaner的創建與啓動 120
4.10.1 創建ContextCleaner 120
4.10.2 啓動ContextCleaner 120
4.11 額外的SparkListener與啓動事件總綫 122
4.12 Spark環境更新 123
4.13 SparkContext初始化的收尾 127
4.14 SparkContext提供的常用方法 128
4.15 SparkContext的伴生對象130
4.16 小結 131
第5章 Spark執行環境 132
5.1 SparkEnv概述 133
5.2 安全管理器SecurityManager 133
5.3 RPC環境 135
5.3.1 RPC端點RpcEndpoint 136
5.3.2 RPC端點引用RpcEndpointRef 139
5.3.3 創建傳輸上下文TransportConf 142
5.3.4 消息調度器Dispatcher 142
5.3.5 創建傳輸上下文Transport-Context 154
5.3.6 創建傳輸客戶端工廠Transport-ClientFactory 159
5.3.7 創建TransportServer 160
5.3.8 客戶端請求發送 162
5.3.9 NettyRpcEnv中的常用方法 173
5.4 序列化管理器SerializerManager 175
5.5 廣播管理器BroadcastManager 178
5.6 map任務輸齣跟蹤器 185
5.6.1 MapOutputTracker的實現 187
5.6.2 MapOutputTrackerMaster的實現原理 191
5.7 構建存儲體係 199
5.8 創建度量係統 201
5.8.1 MetricsCon?g詳解 203
5.8.2 MetricsSystem中的常用方法 207
5.8.3 啓動MetricsSystem 209
5.9 輸齣提交協調器 211
5.9.1 OutputCommitCoordinator-Endpoint的實現 211
5.9.2 OutputCommitCoordinator的實現 212
5.9.3 OutputCommitCoordinator的工作原理 216
5.10 創建SparkEnv 217
5.11 小結 217
第6章 存儲體係 219
6.1 存儲體係概述 220
6.1.1 存儲體係架構 220
6.1.2 基本概念 222
6.2 Block信息管理器 227
6.2.1 Block鎖的基本概念 227
6.2.2 Block鎖的實現 229
6.3 磁盤Block管理器 234
6.3.1 本地目錄結構 234
6.3.2 DiskBlockManager提供的方法 236
6.4 磁盤存儲DiskStore 239
6.5 內存管理器 242
6.5.1 內存池模型 243
6.5.2 StorageMemoryPool詳解 244
6.5.3 MemoryManager模型 247
6.5.4 Uni?edMemoryManager詳解 250
6.6 內存存儲MemoryStore 252
6.6.1 MemoryStore的內存模型 253
6.6.2 MemoryStore提供的方法 255
6.7 塊管理器BlockManager 265
6.7.1 BlockManager的初始化 265
6.7.2 BlockManager提供的方法 266
6.8 BlockManagerMaster對Block-Manager的管理 285
6.8.1 BlockManagerMaster的職責 285
6.8.2 BlockManagerMasterEndpoint詳解 286
6.8.3 BlockManagerSlaveEndpoint詳解 289
6.9 Block傳輸服務 290
6.9.1 初始化NettyBlockTransfer-Service 291
6.9.2 NettyBlockRpcServer詳解 292
6.9.3 Shuf?e客戶端 296
6.10 DiskBlockObjectWriter詳解 305
6.11 小結 308
第7章 調度係統 309
7.1 調度係統概述 310
7.2 RDD詳解 312
7.2.1 為什麼需要RDD 312
7.2.2 RDD
前言/序言
Preface 前 言為什麼寫這本書給本書寫前言時,讓我想起瞭兩年前給《深入理解Spark:核心思想與源碼分析》一書寫前言的經曆。我不禁想起崔護的《題都城南莊》這首詩,詩的內容是:
去年今日此門中,人麵桃花相映紅。
人麵不知何處去,桃花依舊笑春風。
從核心思想和架構來看,Spark依然是那個Spark,但是我已經找瞭一個新的“東傢”。我的年齡不知不覺中又長瞭兩歲,Spark也在大數據領域從“新貴”變成瞭“老人”。Spark的版本從0.x.x到2.x.x基本上也是用瞭兩年時間。
自從《深入理解Spark:核心思想與源碼分析》一書齣版後,引起瞭一些市場反響,更難得的是得到瞭很多讀者的反饋。一些熱心的讀者通過微信或者郵件嚮我指齣瞭書中內容的很多不足之處,包括錯彆字、錯誤的描述、代碼分析有點像流水賬、提綱挈領的內容偏少、代碼版本過低等。一些錯誤在修訂的版本中得到瞭解決,有些修正的內容則通過單獨寫博客來補充。在與讀者的溝通過程中,也糾正瞭我對一些問題的理解偏差。再次深深地感謝廣大讀者的支持與幫助!
一些讀者對《深入理解Spark:核心思想與源碼分析》一書的內容非常肯定,希望能夠齣第2版,高婧雅編輯也一再“慫恿”我,但是我一直沒有寫第2版的打算。我當時希望有人能夠以更好的方式寫一本介紹和分析Spark 2.0版本的源碼分析書籍,因為我感覺之前的寫作方式的確不是很好。在我心中一直有個矛盾:如果源碼太少,源碼分析的書籍將退化成單純講原理的書籍,對於想深入理解Spark實現的讀者來說這是不夠的;如果源碼太多,又讓人有堆砌代碼或者“混”篇幅的感覺。很多源碼分析的書隻是簡單說說接口或者方法的功能,讓人始終有種“霧裏看花”的感覺。所以我一直很期待能有更好的方式來寫作源碼分析類的書。
在一年多的等待中,我始終沒有發現類似書籍的齣現,於是我打算再做一次嘗試。這次擯棄瞭《深入理解Spark:核心思想與源碼分析》一書中按照代碼執行流程分析的方式,改為先從整體上介紹一個係統,然後逐個分析每個組件的功能,最後將這些組件之間的關係用流程圖的方式串聯起來。本書的寫作方式依然犯有代碼過多的“毛病”,但我還是期待本書能帶來一些新的氣象。
本書的主要特色按照源碼分析的習慣設計,從腳本分析到初始化,再到核心內容。整個過程遵循由淺入深的基本思路。
每一章先對本章的內容有個總體介紹,然後深入分析各個組件的實現原理,最後將各個組件之間的關係通過執行流程來展現。
本書盡可能地用圖來展示原理,以加速讀者對內容的掌握。
本書講解的很多實現及原理都值得藉鑒,可以幫助讀者提升架構設計、程序設計等方麵的能力。
本書盡可能保留較多的源碼,以便於初學者能夠在脫離辦公環境的地方(如地鐵、公交等),也能輕鬆閱讀。
讀者對象源碼閱讀是一項苦差事,人力和時間成本都很高,尤其對於剛剛接觸Spark的人來說更是如此。本書盡可能保留源碼,使得分析過程不至於産生跳躍感,目的是降低大多數人的學習門檻。如果你是從事IT工作1~3年的新人或者希望開始學習Spark的核心知識,本書非常適閤你。如果你已經對Spark有所瞭解或者已經使用它,還想進一步提高自己,那麼本書更適閤你。如果你是一個開發新手,對Java、Linux等基礎知識還不是很瞭解的話,本書可能不太適閤你。如果你已經對Spark有深入的研究,本書也許可以作為你的參考資料。
總體來說,本書適閤以下人群:
已經瞭解過Spark,但還想深入理解Spark實現原理的人;大數據技術愛好者;對性能優化和部署方案感興趣的運維工程師與架構師;開源代碼愛好者,喜歡研究源碼的同學可以通過本書學到一些閱讀源碼的方式、方法。
本書不會教你如何開發Spark應用程序,而隻拿word count的經典例子做演示。本書會簡單介紹Hadoop MapReduce、Hadoop YARN、Mesos、Alluxio(Tachyon)、ZooKeeper、HDFS、Akka、Jetty、Netty,但不會過多介紹這些框架的使用,因為市場上已經有豐富的書籍供讀者挑選。本書也不會過多介紹Scala、Java、Shell的語法,讀者可以在市場上選擇適閤自己的書籍閱讀。本書將無比適閤那些想要破解“潘多拉魔盒”的人!
如何閱讀本書本書一共有10章內容,主要包括以下部分。
準備部分(第1~2章):簡單介紹瞭Spark的環境搭建和基本原理,幫助讀者瞭解一些背景知識。
基礎部分(第3~5章):介紹Spark的基礎設施、SparkContext的初始化、Spark執行環境等內容。
核心部分(第6~9章):這是Spark最為核心的部分,包括存儲體係、調度係統、計算引擎、部署模式等。
API部分(第10章):這部分主要對Spark的新舊API進行對比,對新API進行介紹。
本書最後的附錄中還包括一些內容:附錄A介紹的是Spark中最常用的工具類Utils;附錄B是Akka的簡介;附錄C為Jetty的簡介和工具類JettyUtils的介紹;附錄D為Metrics庫的簡介和Metrics中部分API的介紹;附錄E演示瞭Hadoop 1.0版本中的word count例子;附錄F
深入解析現代大數據引擎的靈魂:從設計哲學到工程實踐 這是一部旨在揭示高性能、可擴展大數據處理核心秘密的著作。它不滿足於簡單羅列API的使用技巧,而是帶領讀者潛入技術的最深層,探究驅動現代數據分析引擎運轉的精巧架構與深邃的工程智慧。本書將大數據處理的復雜性剝離開一層層錶象,直抵那些奠定其強大能力的基石。 從設計哲學齣發,本書首先會引導讀者理解構建一個卓越大數據處理框架所需要考量的根本性問題。 為什麼需要如此復雜的分布式計算模型?如何纔能在海量數據麵前實現計算的有效並行?如何權衡吞吐量、延遲和資源利用率?這些問題的答案並非一蹴而就,而是需要對計算機科學原理、分布式係統理論以及性能優化策略有著深刻的洞察。本書將從分布式係統的基本範式入手,例如CAP理論在實際應用中的考量,一緻性模型的選擇對係統行為的影響,以及容錯機製的設計對於構建高可用係統的關鍵作用。 接著,我們將深入剖析引擎的核心組件,揭示它們為何如此設計。 想象一下,一個龐大的數據處理任務被分解成無數個小任務,在成百上韆颱機器上同時運行,最終匯聚成精確的結果。這背後離不開精妙的調度器,它需要高效地將任務分配給可用的資源,並實時監控任務的執行狀態,處理節點故障,重試失敗的任務。本書將詳細講解調度器是如何運作的,包括其任務隊列管理、資源分配策略、優先級調度以及與集群管理器的協作機製。 內存計算與緩存策略也是本書重點關注的領域。 在處理PB級彆的數據時,磁盤I/O往往成為巨大的瓶頸。因此,如何最大化地利用內存資源,通過智能的緩存機製減少對磁盤的訪問,是提升性能的關鍵。本書將探討各種內存管理技術,包括數據結構的優化、內存池的運用,以及不同級彆的緩存策略,例如塊級緩存、算子級緩存和DataFrame/Dataset級彆的緩存。我們將分析這些策略如何影響數據訪問的局部性,以及它們在不同計算模式下的適用性。 彈性分布式數據集(RDD)作為許多大數據處理框架的 foundational abstraction,其設計思想和內部機製將得到詳盡的解析。 RDD不僅僅是一個數據集閤,它更重要的是一種不可變、分區、可重算的分布式數據結構。本書將深入剖析RDD的 lineage(血緣關係)是如何構建的,以及當發生節點故障時,RDD的重算機製是如何保證計算的完整性和容錯性的。我們將探討RDD的懶執行(lazy evaluation)策略,以及它如何與DAG(有嚮無環圖)調度器協同工作,實現高效的作業執行。 進入更高級的抽象層麵,DataFrame和Dataset的引入帶來瞭怎樣的變革? 它們在RDD的基礎上引入瞭Schema信息,使得數據結構更加清晰,同時也為編譯器層麵的優化提供瞭可能。本書將深入講解DataFrame和Dataset的內部錶示,以及查詢優化器是如何利用這些結構信息進行謂詞下推(predicate pushdown)、列裁剪(column pruning)和算子融閤(operator fusion)等一係列優化操作,從而生成高效的執行計劃。我們將探討Catalyst Optimizer的工作原理,以及用戶如何通過理解這些優化機製來編寫更高效的數據處理代碼。 除瞭數據處理本身,資源的有效管理和利用也是大數據引擎成功的重要因素。 集群管理器(如YARN、Mesos)扮演著至關重要的角色,它們負責為應用程序分配和管理計算資源。本書將解析集群管理器如何與大數據處理引擎協同工作,包括應用程序提交、資源申請、容器分配以及對應用程序生命周期的管理。我們將探討不同集群管理器的特點,以及它們如何影響大數據作業的部署和伸縮性。 性能調優是大數據工程中不可避免的一環。 即使擁有優秀的架構,不當的使用和配置也可能導緻性能低下。本書將提供一套係統性的性能調優思路和方法。從數據傾斜的識彆與解決,到 Shuffle 過程的優化,再到垃圾迴收(GC)的調優,我們將一步步引導讀者掌握診斷和解決性能瓶頸的技巧。我們將分析各種性能指標的意義,以及如何通過監控工具和日誌分析來定位問題。 在工程實現層麵,本書將深入探討一些關鍵的實現細節。 例如,序列化機製的選擇如何影響數據傳輸的效率,網絡通信協議的設計如何保證數據在分布式節點間的高效傳輸,以及進程間通信(IPC)的實現如何支持引擎內部組件的協同工作。我們還會關注內存泄漏的檢測與避免,以及如何設計能夠應對高並發和大量請求的健壯係統。 最後,本書還將展望大數據處理技術未來的發展趨勢。 隨著數據量的不斷增長和應用場景的日益復雜,對大數據引擎的要求也在不斷提高。我們將探討流式處理、圖計算、機器學習集成等前沿領域的發展,以及這些技術將如何演進,並為讀者提供一個更廣闊的視角來理解大數據處理的未來圖景。 本書的獨特之處在於,它不僅僅是關於“如何用”某個工具,而是關於“為什麼這樣做”。它旨在培養讀者對大數據處理技術底層原理的深刻理解,從而能夠獨立地分析問題、設計解決方案,並在麵對復雜的技術挑戰時,能夠從容應對。無論您是大數據技術的初學者,還是希望進一步精進技能的資深工程師,本書都將為您提供寶貴的洞察和實用的指導,助您在現代大數據處理的浪潮中乘風破浪。