本書站在大數據落地應用的角度,系統(tǒng)闡述大數據從數據收集,到數據存儲、分布式協(xié)調及資源管理、計算引擎、分析工具,再到數據可視化這一完整流程,本書既包含主要技術的實現原理及其框架,也包含了具體落地指導,是幫助企業(yè)和個人整體了解大數據框架不可多得的參考書。本章主要包括6個部分共16章的內容,其中:第壹部分介紹了大數據體系架構,以及Google和Hadoop技術棧;第二部分介紹大數據分析相關技術,主要涉及關系型數據收集工具Sqoop與Canel、非關系型數據收集系統(tǒng)Flume以及分布式消息隊列Kafka;第三部分介紹大數據存儲相關技術,涉及數據存儲格式、分布式文件系統(tǒng)以及分布式數據庫;第四部分介紹資源管理和服務協(xié)調相關技術,涉及資源管理和調度系統(tǒng)YARN以及資源協(xié)調系統(tǒng)ZooKeeper;第五部分介紹計算引擎相關技術,涉及批處理、交互式處理以及流式實時處理三類引擎;第六部分數據分析相關技術,涉及基于數據分析語言HQL與SQL、大數據統(tǒng)一編程模型及機器學習庫等。
Preface?前 言為什么要寫這本書隨著大數據技術的普及,它已經被廣泛應用于互聯(lián)網、電信、金融、工業(yè)制造等諸多行業(yè)。據相關報告統(tǒng)計,大數據人才需求呈井噴態(tài)勢,越來越多的程序員開始學習大數據技術,這使得它已經成為程序員所需的基本技能。
為了滿足大數據人才市場需求,越來越多的大數據技術書籍不斷面世,包括《Hadoop權威指南》《Hadoop實戰(zhàn)》等。盡管如此,面向初、中級學者,能夠系統(tǒng)化、體系化介紹大數據技術的基礎書籍并不多見。筆者曾接觸過大量大數據初學者,他們一直渴望能有一本簡單且易于理解的教科書式的大數據書籍出現。為了滿足這些讀者的需求,筆者根據自己多年的數據項目和培訓經驗,繼《Hadoop技術內幕》書籍之后,于兩年前開始嘗試編寫一本淺顯易讀的大數據基礎書籍。
相比于現有的大數據基礎書籍,本書具有三大特色:①系統(tǒng)性:深度剖析大數據技術體系的六層架構;②技術性:詳盡介紹Hadoop和Spark等主流大數據技術;③實用性:理論與實踐相結合,探討常見的大數據問題。本書嘗試以“數據生命周期”為線索,按照分層結構逐步介紹大數據技術體系,涉及數據收集、數據存儲、資源管理和服務協(xié)調、計算引擎及數據分析五層技術架構,由點及面,最終通過綜合案例將這些技術串接在一起。
讀者對象(1)大數據應用開發(fā)人員本書用了相當大的篇幅介紹各個大數據系統(tǒng)的適用場景和使用方式,能夠很好地幫助大數據應用開發(fā)工程師設計出滿足要求的程序。
(2)大數據講師和學員本書按照大數據五層架構,即數據收集→數據存儲→資源管理與服務協(xié)調→計算引擎→數據分析,完整介紹了整個大數據技術體系,非常易于理解,此外,每節(jié)包含大量代碼示例和思考題目,非常適合大數據教學。
(3)大數據運維工程師對于一名合格的大數據運維工程師而言,適當地了解大數據系統(tǒng)的應用場景、設計原理和架構是十分有幫助的,這不僅有助于我們更快地排除各種可能的大數據系統(tǒng)故障,也能夠讓運維人員與研發(fā)人員更有效地進行溝通。本書可以有效地幫助運維工程師全面理解當下主流的大數據技術體系。
(4)開源軟件愛好者開源大數據系統(tǒng)(比如Hadoop和Spark)是開源軟件中的佼佼者,它們在實現的過程中吸收了大量開源領域的優(yōu)秀思想,同時也有很多值得學習的創(chuàng)新。通過閱讀本書,這部分讀者不僅能領略到開源軟件的優(yōu)秀思想,還可以學習如何構建一套完整的技術生態(tài)。
如何閱讀本書本書以數據在大數據系統(tǒng)中的生命周期為線索,介紹以Hadoop與Spark為主的開源大數據技術棧。本書內容組織方式如下。
第一部分:主要介紹大數據體系架構,以及Google和Hadoop技術棧,讓讀者從高層次上對大數據技術有一定了解。
第二部分:介紹大數據分析相關技術,主要涉及關系型數據收集工具Sqoop與Canel、非關系型數據收集系統(tǒng)Flume,以及分布式消息隊列Kafka。
第三部分:介紹大數據存儲相關技術,涉及數據存儲格式、分布式文件系統(tǒng)及分布式數據庫三部分。
第四部分:介紹資源管理和服務協(xié)調相關技術,涉及資源管理和調度系統(tǒng)YARN,以及資源協(xié)調系統(tǒng)ZooKeeper。
第五部分:介紹計算引擎相關技術,包括批處理、交互式處理,以及流式實時處理三類引擎,內容涉及MapReduce、Spark、Impala/Presto、Storm等常用技術。
第六部分:介紹數據分析相關技術,涉及基于數據分析的語言HQL與SQL、大數據統(tǒng)一編程模型及機器學習庫等。
大數據體系的邏輯也是本書的邏輯,故這里給出大數據體系邏輯圖。
勘誤和支持由于筆者的水平有限,編寫時間倉促,書中難免會出現一些錯誤或者不準確的地方,懇請讀者批評指正。為此,筆者特意創(chuàng)建了一個在線支持與應急方案的站點http://hadoop123.com和微信公眾號hadoop-123。你可以將書中的錯誤發(fā)布在Bug勘誤表頁面。如果你遇到任何問題,也可以訪問Q&A頁面,我將盡量在線上為你提供最滿意的解答。如果你有更多寶貴的意見,也歡迎發(fā)送郵件至郵箱dongxicheng@yahoo.com,期待能夠得到你們的真摯反饋。
獲取源代碼實例本書各節(jié)的源代碼實例可從網站http://hadoop123.com或微信公眾號hadoop-123中獲取。
致謝感謝我的導師廖華明副研究員,是她引我進入大數據世界。
感謝機械工業(yè)出版社華章公司的孫海亮編輯對本書的校訂,他的鼓勵和幫助使我順利完成了本書的編寫工作。
最后感謝我的父母,感謝他們的養(yǎng)育之恩,感謝兄長的鼓勵和支持,感謝他們時時刻刻給我以信心和力量!
謹以此書獻給我最親愛的家人,以及眾多熱愛大數據技術的朋友們!
董西成
目 錄?Contents
前 言
第一部分 概述篇
第1章 企業(yè)級大數據技術體系概述 2
1.1 大數據系統(tǒng)產生背景及應用場景 2
1.1.1 產生背景 2
1.1.2 常見大數據應用場景 3
1.2 企業(yè)級大數據技術框架 5
1.2.1 數據收集層 6
1.2.2 數據存儲層 7
1.2.3 資源管理與服務協(xié)調層 7
1.2.4 計算引擎層 8
1.2.5 數據分析層 9
1.2.6 數據可視化層 9
1.3 企業(yè)級大數據技術實現方案 9
1.3.1 Google大數據技術棧 10
1.3.2 Hadoop與Spark開源大數據技術棧 12
1.4 大數據架構:Lambda Architecture 15
1.5 Hadoop與Spark版本選擇及安裝部署 16
1.5.1 Hadoop與Spark版本選擇 16
1.5.2 Hadoop與Spark安裝部署 17
1.6 小結 18
1.7 本章問題 18
第二部分 數據收集篇
第2章 關系型數據的收集 20
2.1 Sqoop概述 20
2.1.1 設計動機 20
2.1.2 Sqoop基本思想及特點 21
2.2 Sqoop基本架構 21
2.2.1 Sqoop1基本架構 22
2.2.2 Sqoop2基本架構 23
2.2.3 Sqoop1與Sqoop2對比 24
2.3 Sqoop使用方式 25
2.3.1 Sqoop1使用方式 25
2.3.2 Sqoop2使用方式 28
2.4 數據增量收集CDC 31
2.4.1 CDC動機與應用場景 31
2.4.2 CDC開源實現Canal 32
2.4.3 多機房數據同步系統(tǒng)Otter 33
2.5 小結 35
2.6 本章問題 35
第3章 非關系型數據的收集 36
3.1 概述 36
3.1.1 Flume設計動機 36
3.1.2 Flume基本思想及特點 37
3.2 Flume NG基本架構 38
3.2.1 Flume NG基本架構 38
3.2.2 Flume NG高級組件 41
3.3 Flume NG數據流拓撲構建方法 42
3.3.1 如何構建數據流拓撲 42
3.3.2 數據流拓撲實例剖析 46
3.4 小結 50
3.5 本章問題 50
第4章 分布式消息隊列Kafka 51
4.1 概述 51
4.1.1 Kafka設計動機 51
4.1.2 Kafka特點 53
4.2 Kafka設計架構 53
4.2.1 Kafka基本架構 54
4.2.2 Kafka各組件詳解 54
4.2.3 Kafka關鍵技術點 58
4.3 Kafka程序設計 60
4.3.1 Producer程序設計 61
4.3.2 Consumer程序設計 63
4.3.3 開源Producer與Consumer實現 65
4.4 Kafka典型應用場景 65
4.5 小結 67
4.6 本章問題 67
第三部分 數據存儲篇
第5章 數據序列化與文件存儲格式 70
5.1 數據序列化的意義 70
5.2 數據序列化方案 72
5.2.1 序列化框架Thrift 72
5.2.2 序列化框架Protobuf 74
5.2.3 序列化框架Avro 76
5.2.4 序列化框架對比 78
5.3 文件存儲格式剖析 79
5.3.1 行存儲與列存儲 79
5.3.2 行式存儲格式 80
5.3.3 列式存儲格式ORC、Parquet與CarbonData 82
5.4 小結 88
5.5 本章問題 89
第6章 分布式文件系統(tǒng) 90
6.1 背景 90
6.2 文件級別和塊級別的分布式文件系統(tǒng) 91
6.2.1 文件級別的分布式系統(tǒng) 91
6.2.2 塊級別的分布式系統(tǒng) 92
6.3 HDFS基本架構 93
6.4 HDFS關鍵技術 94
6.4.1 容錯性設計 95
6.4.2 副本放置策略 95
6.4.3 異構存儲介質 96
6.4.4 集中式緩存管理 97
6.5 HDFS訪問方式 98
6.5.1 HDFS shell 98
6.5.2 HDFS API 100
6.5.3 數據收集組件 101
6.5.4 計算引擎 102
6.6 小結 102
6.7 本章問題 103
第7章 分布式結構化存儲系統(tǒng) 104
7.1 背景 104
7.2 HBase數據模型 105
7.2.1 邏輯數據模型 105
7.2.2 物理數據存儲 107
7.3 HBase基本架構 108
7.3.1 HBase基本架構 108
7.3.2 HBase內部原理 110
7.4 HBase訪問方式 114
7.4.1 HBase shell 114
7.4.2 HBase API 116
7.4.3 數據收集組件 118
7.4.4 計算引擎 119
7.4.5 Apache Phoenix 119
7.5 HBase應用案例 120
7.5.1 社交關系數據存儲 120
7.5.2 時間序列數據庫OpenTSDB 122
7.6 分布式列式存儲系統(tǒng)Kudu 125
7.6.1 Kudu基本特點 125
7.6.2 Kudu數據模型與架構 126
7.6.3 HBase與Kudu對比 126
7.7 小結 127
7.8 本章問題 127
第四部分 分布式協(xié)調與資源管理篇
第8章 分布式協(xié)調服務ZooKeeper 130
8.1 分布式協(xié)調服務的存在意義 130
8.1.1 leader選舉 130
8.1.2 負載均衡 131
8.2 ZooKeeper數據模型 132
8.3 ZooKeeper基本架構 133
8.4 ZooKeeper程序設計 134
8.4.1 ZooKeeper API 135
8.4.2 Apache Curator 139
8.5 ZooKeeper應用案例 142
8.5.1 leader選舉 142
8.5.2 分布式隊列 143
8.5.3 負載均衡 143
8.6 小結 144
8.7 本章問題 145
第9章 資源管理與調度系統(tǒng)YARN 146
9.1 YARN產生背景 146
9.1.1 MRv1局限性 146
9.1.2 YARN設計動機 147
9.2 YARN設計思想 148
9.3 YARN的基本架構與原理 149
9.3.1 YARN基本架構 149
9.3.2 YARN高可用 152
9.3.3 YARN工作流程 153
9.4 YARN資源調度器 155
9.4.1 層級隊列管理機制 155
9.4.2 多租戶資源調度器產生背景 156
9.4.3 Capacity/Fair Scheduler 157
9.4.4 基于節(jié)點標簽的調度 160
9.4.5 資源搶占