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