本書全面介紹Storm的架構、原理、核心概念、操作和數據流模型;6個不同領域的經典案例完整呈現大型數據應用系統的設計;系統總結了Storm常見運維故障的處理以及常用的技巧和最佳實踐。
國內資深大數據專家根據Storm最新技術撰寫,基于實際生產環境,從實戰、運維和調優3個維度對Storm進行了詳細的講解
全面介紹Storm的架構、原理、核心概念、操作和數據流模型;
6個不同領域的經典案例完整呈現大型數據應用系統的設計;
系統總結了Storm常見運維故障的處理以及常用的技巧和最佳實踐
“Storm大大簡化了面向龐大規模數據流的處理機制,從而在實時處理領域扮演著Hadoop之于批量處理領域的重要角色”——這是Storm官方項目所說的一句話,可見其在實時數據流處理領域的優勢。為了達成上述目標,Storm在設計思路中充分考慮到大規模可擴展能力、利用一套“故障快速、自動重啟”方案為實時處理提供容錯性支持,從而有力地保證了每個元組都能切實得到處理。Storm是一套極具可擴展能力、快速驚人且具備容錯能力的開源分布計算系統,其高度專注于流處理領域。Storm在事件處理與增量計算方面表現突出,能夠以實時方式根據不斷變化的參數對數據流進行處理。盡管Storm同時提供原語以實現通用性分布RPC并在理論上能夠被用于任何分布式計算任務的組成部分,但其最為根本的優勢仍然表現在事件流處理方面。
《Storm企業級應用:實戰、運維和調優》強調Storm在企業的實際應用,旨在幫助企業切實解決實時計算技術如何落地的問題。三位作者都是奮戰在中國大數據技術一線的實戰派專家,本書是他們實踐經驗的結晶。
《Storm企業級應用:實戰、運維和調優》內容在三個維度上具有重要特色:
理論維度,深入分析了Storm的架構設計、基本概念和原理。
實戰維度,通過6個典型的、不同行業的應用案例詳細講解了如何使用Storm設計大型的數據應用系統。
技巧維度,從Storm的常見故障及解決方法、使用技巧和最佳實踐進行介紹。
為什么寫作本書大數據是繼云計算、物聯網之后IT行業又一大顛覆性的技術變革。之前大數據在互聯網、軍事、金融、通信和物理學等領域已有不少落地案例,卻因為近年來Hadoop技術的快速發展而引起業界廣泛關注。可以說,Hadoop目前是大數據處理的關鍵技術,也是迄今為止,最成熟、應用最廣泛的技術。但是Hadoop生態圈下面的數據處理幾乎都是在離線狀態下進行的,離線處理海量數據是比較耗時、耗力的,Storm的實時處理技術應運而生。正如曾經開發Storm的一位主要工程師所談到的,Storm可以方便地在一個計算機集群中編寫與擴展復雜的實時計算,Storm用于實時處理,就好比Hadoop用于批處理。Storm保證每個消息都會得到處理,而且它很快——在一個小集群中,每秒可以處理數以百萬計的消息,更棒的是可以使用任意編程語言來開發。因此在節省時間、人力的情況下,Storm的優勢就充分體現了。
現在有關Storm的中文學習資料非常少,這給不少研發人員帶來了很大的難度。盡管現在市面上已經有幾本Storm的中文書籍,但是,這些書籍多是翻譯過來的,語言組織不符合國人的習慣,并且實例講解部分也不能切合本土國情。還有,這些書分別側重了某一個方面,如理論、實戰、運維等,還沒有一本書能夠非常系統地闡述Storm框架。本書正是為了解決以上的各種問題而撰寫的,這也是國內第一本系統講解Storm理論、實戰、運維和調優的書籍。
寫作本身還有一個重要因素——讓大家少走彎路。這一點筆者感同身受,在使用Storm之前,開始調研、搜集、了解Storm是比較痛苦的過程,由于網上的資料參差不齊,也沒有比較完全系統的實戰類書籍,因此盡管自己文筆很差,也想把自己了解的,以及實戰過的東西,總結出來供大家參考,幫大家少走些彎路,讓Storm為我們多做點事情。
本書以Storm 0.8.2為基礎,不僅深入探討了Storm的原理架構和數據模型,更重要的是通過實戰案例教給讀者如何運用Storm框架來設計、搭建以及實時計算海量數據,同時結合生產案例剖析Storm的運維和性能調優的技巧。
讀者對象本書適合以下讀者閱讀:
(1)云計算、大數據處理技術和分布式計算處理數據愛好者“大數據”無疑是繼“云計算”之后IT業界上最熱的詞匯。而云計算、大數據、實時處理數據本身存在交集,現在不少涉獵大數據的,以及要求數據時效性的公司已經開始深入了解Storm,本書講解的Storm是實時處理數據的一種工具。本書可以幫助這部分讀者快速而全面地了解Storm的原理、架構、使用場景和細節知識點,理解Storm在云計算、大數據時代處理數據的重要性。
(2)對實時處理數據感興趣的開發人員Hadoop技術在近幾年非常熱,已經是大數據處理的關鍵技術,而Storm作為Hadoop生態系統不足之處的補充者,已經被越來越多的公司用來滿足數據實時處理的需求。本書可以幫助這部分讀者詳細了解Storm與Hadoop之間的不同之處,涉及Storm的基本概念、核心知識點和高級特性,并且結合實戰案例講解,使讀者可以快速掌握Storm的使用。
(3)開源軟件愛好者Storm作為Twitter開源的項目,其實現過程中吸收了很多開源領域的優秀思想,值得我們深入研究和學習。本書在講解過程中剖析了不少Storm的源代碼,可以幫助該部分讀者了解和掌握Storm框架源代碼的設計方法和技巧。
(4)對Clojure語言編程感興趣的開發人員Storm是由BackType開發的實時處理系統,基本是用Clojure寫的。因此了解Clojure語言對于快速掌握Storm有很大的幫助,同時如果對Clojure語言感興趣,也可以借助Storm進行學習。
如何閱讀本書本書共11章,分為三篇。
基礎篇(第1~3章),介紹了Storm背景、基本原理、安裝部署、核心概念和數據流模型。
實戰篇(第4~9章),通過6個典型的應用案例和代碼示例,結合實踐技巧和理論知識,深入講解如何使用Storm設計大型數據應用系統。
技巧篇(第10~11章),重點介紹了Storm的高級特性、運維監控和性能調優等,并結合生產系統的性能優化、運維經驗和使用技巧等方面進行講解,旨在提升讀者的實際操作經驗。
如果你是一名具備一定的Storm基礎知識和使用經驗的用戶,那么可以直接閱讀后兩篇。實戰篇側重案例實戰,技巧篇側重技巧性能,請讀者自行選擇閱讀。但是,如果你是一名初學者,請一定從第1章的基礎理論知識開始學習。本書所有章節的源碼都托管在Github上。
勘誤和支持由于筆者的水平有限,編寫時間倉促,書中難免會出現一些錯誤或者不準確的地方,懇請讀者批評指正。你可以將書中的錯誤發布在站點頁面留言中,同時如果你遇到任何問題,也可以訪問該頁面,我們將盡量在線上為讀者提供最滿意的解答。
致謝首先要感謝Twitter公司將Storm開源,感謝其麾下的BackType團隊成員對開源軟件和開源社區做出的巨大貢獻。
感謝一直以來幫助過我們的眾多開源社區,這樣的平臺讓我們認識了很多圈子里的同行,使我從技術和思想的碰撞中受益匪淺。
感謝對我們有過幫助的Nathan Marz、徐明明、向磊、趙修湘、史東杰、廖旻可、王成祥、何定巍、盧億雷等人。
感謝普開第一期大數據就業班的所有同學,他們的大力支持和關心讓我們倍感欣慰和鼓舞。
感謝機械工業出版社華章公司的編輯楊福川和姜影,在這一年多的時間中始終支持我們的寫作,他們的鼓勵和幫助引導我們能順利完成本書。
最后感謝我們的爸爸、媽媽、爺爺、奶奶,感謝他們的養育之恩,并時時刻刻為我們灌輸著信心和力量!
謹以此書獻給我們最親愛的家人,以及眾多熱愛Storm的朋友們!
馬延輝,資深Hadoop技術專家,曾就職于淘寶、Answers。com、暴風等互聯網公司,從事Hadoop相關的研發和運維工作,對大數據技術的企業級落地、研發、運維和管理方面有著深刻理解和豐富的實戰經驗。開源HBase監控工具Ella作者。在國內Hadoop社區內非常活躍,經常在各種會議和沙龍上做技術分享,深受歡迎。現在致力于大數據技術在傳統行業的落地,以及大數據技術的普及和推廣。著有暢銷書《HBase企業應用開發實戰》,HBase領域公認最有價值的著作之一。
陳書美,高級數據分析工程師,對Storm實時數據計算、Kafka消息系統分析有深入的研究和豐富的實踐經驗,并對HDFS、MapReduce、Hive、HBase等Hadoop生態系統內的技術有系統且深刻的了解。曾就職于暴風影音,負責大數據應用等開發工作;目前就職于百度,從事數據分析工作。
雷葆華,武漢綠色網絡信息服務有限公司副總經理,負責公司大數據、SDN/NFV等新產品的研發工作。業界知名的云計算專家,中國電子學會云計算專委會委員。創業之前曾任中國電信北京研究院云計算產品線總監,是中國電信云計算工作主要發起者和推動者之一,在CDN、P2P、IDC等方面都有深入研究。提交專利28項,已授權專利8項,發表多篇有影響力的論文和文章,多次獲得部級科技進步獎勵。
著有《云計算解碼》、《CDN技術詳解》、《SDN核心技術剖析和實戰指南》等多部暢銷著作并獲得多個獎項。
前言
基礎篇
第1章 認識Storm
1.1 什么是實時流計算
1.1.1 實時流計算背景
1.1.2 實時計算應用場景
1.1.3 實時計算處理流程
1.1.4 實時計算框架
1.2 Storm是什么
1.2.1 Storm出現的背景
1.2.2 Storm簡介
1.2.3 Storm的設計思想
1.2.4 Storm與Hadoop的角色和組件比較
1.3 Storm核心組件
1.3.1 主節點Nimbus
1.3.2 工作節點Supervisor
1.3.3 協調服務組件ZooKeeper
1.3.4 其他核心組件
1.4 Storm的特性
1.5 Storm的功能
1.6 本章小結
第2章 開始使用Storm
2.1 環境準備
2.1.1 系統配置
2.1.2 安裝ZooKeeper集群
2.2 啟動模式
2.2.1 本地模式
2.2.2 分布式模式
2.3 安裝部署Storm集群
2.3.1 安裝Storm依賴庫
2.3.2 安裝Storm集群
2.3.3 啟動Storm集群
2.3.4 停止Storm集群
2.4 創建Topology并向集群提交任務
2.4.1 創建Topology
2.4.2 向集群提交任務
2.5 本章小結
第3章 核心概念和數據流模型
3.1 Tuple元組
3.1.1 Tuple描述
3.1.2 Tuple的生命周期
3.2 Spout數據源
3.2.1 Spout介紹
3.2.2 Spout實例
3.3 Bolt消息處理者
3.3.1 Bolt介紹
3.3.2 Bolt實例
3.4 Topology拓撲
3.4.1 Topology實例
3.4.2 Topology運行
3.5 Stream消息流和Stream Grouping消息流組
3.5.1 Stream消息流
3.5.2 Stream Grouping消息流組
3.6 Task任務
3.7 Worker工作者進程
3.8 Worker、Task、Executor三者之間的關系
3.9 事務
3.10 數據流模型
3.10.1 數據流模型簡介
3.10.2 Storm數據流模型
3.11 本章小結
實 戰 篇
第4章 實例1:移動互聯——語音“實時墻”
4.1 業務背景
4.1.1 案例背景
4.1.2 設計目標
4.1.3 數據格式
4.1.4 硬件配置
4.2 系統架構與模塊設計
4.2.1 整體架構
4.2.2 數據采集
4.2.3 數據實時處理
4.2.4 存儲設計
4.2.5 Web實時展示
4.2.6 硬件部署圖
4.3 核心模塊實現
4.3.1 實時處理業務邏輯實現
4.3.2 Web展示實現
4.3.3 最終效果呈現
4.4 本章小結
第5章 實例2:運營商——網絡流量流向實時分析
5.1 業務背景
5.1.1 案例背景
5.1.2 設計目標
5.1.3 數據規模預估
5.1.4 數據格式
5.1.5 統計分析需求
5.2 系統架構與模塊設計
5.2.1 整體架構
5.2.2 數據源
5.2.3 日志采集
5.2.4 數據存儲
5.2.5 數據處理
5.2.6 目標存儲和擴展服務
5.2.7 結果Web展示
5.3 核心模塊實現
5.3.1 模擬數據實現
5.3.2 日志采集和存儲實現
5.3.3 數據處理實現
5.3.4 Web展示實現
5.4 本章小結
第6章 實例3:交通——基于GPS的實時路況分析
6.1 業務背景
6.1.1 案例背景
6.1.2 設計目標
6.1.3 數據格式
6.1.4 實時路況分析方法
6.2 系統架構和模塊設計
6.3 核心模塊的實現
6.3.1 安裝Kafka集群
6.3.2 Flume整合Kafka
6.3.3 實時處理數據
6.3.4 Web頁面展示
6.4 本章小結
第7章 實例4:互聯網——數據質量實時監控
7.1 業務背景
7.1.1 案例背景
7.1.2 設計目標
7.1.3 數據格式
7.2 系統架構與模塊設計
7.2.1 整體架構
7.2.2 結果Web展示
7.3 核心模塊實現
7.3.1 模擬數據
7.3.2 實時處理業務邏輯的實現
7.3.3 Web界面實現
7.3.4 最終效果圖
7.4 本章小結
第8章 實例5:交通——超速頻發路段監控
8.1 業務背景
8.1.1 案例背景
8.1.2 數據類型
8.2 系統架構和模塊設計
8.3 核心模塊實現
8.3.1 實現入口類Main
8.3.2 數據源SocketSpout的實現
8.3.3 實時處理MapSearchBolt和SpeedProcessBolt的實現
8.3.4 目標存儲DataBaseLoadBolt的實現
8.4 本章小結
第9章 實例6:互聯網——廣告實時流量統計
9.1 廣告實時流量統計系統架構
9.1.1 廣告數據
9.1.2 詳細需求描述
9.1.3 系統架構
9.2 表結構與模塊設計
9.2.1 表結構設計
9.2.2 功能模塊設計
9.3 核心模塊實現
9.3.1 部署物理集群環境
9.3.2 Kafka生產者邏輯的實現
9.3.3 使用Storm-kafka實現業務邏輯
9.3.4 使用Hbase存儲并實現統計
9.4 本章小結
技巧篇
第10章 Storm常見故障及解決方法
10.1 安裝部署故障
10.1.1 “no jzmq in java.library.path”異常
10.1.2 “No rule to make target”異常
10.1.3 “cannot access org.zeromq.ZMQ”異常
10.1.4 缺少pkg-conf?ig異常
10.1.5 “java.lang.Unsatisf?iedLinkError”異常
10.1.6 “java.lang.NoClassDefFoundError:clojure.core.protocols$”異常
10.1.7 “Error:cannot link with -luuid,install uuid-dev”異常
10.1.8 “bad interpreter:No such f?ile or directory”異常
10.1.9 “org.zeromq.ZMQException:Invalid argument”異常
10.2 啟動故障
10.2.1 “java.io.FileNotFoundException”異常
10.2.2 “java.io.EOFException”異常
10.3 運行時故障
10.3.1 “Nimbus host is not set”異常
10.3.2 “AlreadyAliveException(msg:xxx is alreadyactive)”異常
10.3.3 無法序列化log4j.Logger異常
10.3.4 “Failing message”異常
10.3.5 “java.io.NotSerializableException”異常
10.3.6 “java.lang.NoClassDefFoundError”異常
10.3.7 “java.net.NoRouteToHostException”異常
10.3.8 “java.net.UnknownHostException”異常
10.3.9 重復defaults.yaml資源文件異常
10.3.10 “KeeperException$NoNodeException”異常
10.3.11 “A fatal error has been detected by the Java Runtime Environment”錯誤
10.3.12 “java.lang.ArrayIndexOutOfBoundsException”異常
10.3.13 DRPC空指針異常
10.3.14 Storm Thrift讀取數據報錯
10.4 本章小結
第11章 Storm使用技巧和最佳實踐
11.1 核心組件使用要點
11.1.1 Spout和Bolt
11.1.2 ZooKeeper集群盡量獨立
11.1.3 Thrift服務的應用場景
11.1.4 序列化機制的使用場景
11.2 集群配置技巧
11.2.1 默認參數配置
11.2.2 日志信息
11.2.3 合理配置JVM參數
11.3 集群運維技巧
11.3.1 Storm計算結果的存儲位置
11.3.2 Storm集群動態增刪節點
11.3.3 關閉Storm相關進程
11.3.4 Storm UI顯示內容的問題
11.4 項目開發技巧
11.4.1 使用assembly插件打包
11.4.2 依賴JAR沖突
11.5 保證消息的可靠處理
11.5.1 消息失敗后的處理
11.5.2 主動干預可靠性
11.5.3 處理重復的Tuple
11.6 理解DRPC原語
11.6.1 DRPC工作流
11.6.2 LinearDRPCTopologyBuilder實現類
11.6.3 DRPC的兩種模式
11.7 快速理解一致性事務
11.7.1 Trident框架的使用
11.7.2 Trident框架的細節
11.7.3 事務性Spout
11.7.4 狀態State
11.8 本章小結