Kafka系統(tǒng)(入門、進(jìn)階、商業(yè)實(shí)戰(zhàn))_第1頁
Kafka系統(tǒng)(入門、進(jìn)階、商業(yè)實(shí)戰(zhàn))_第2頁
Kafka系統(tǒng)(入門、進(jìn)階、商業(yè)實(shí)戰(zhàn))_第3頁
Kafka系統(tǒng)(入門、進(jìn)階、商業(yè)實(shí)戰(zhàn))_第4頁
Kafka系統(tǒng)(入門、進(jìn)階、商業(yè)實(shí)戰(zhàn))_第5頁
已閱讀5頁,還剩327頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Kafka系統(tǒng)入門、進(jìn)階、商業(yè)實(shí)戰(zhàn)目錄\h第1篇準(zhǔn)備\h第1章了解消息隊(duì)列和Kafka\h1.1本章教學(xué)視頻說明\h1.2消息隊(duì)列\(zhòng)h1.2.1什么是消息隊(duì)列\(zhòng)h1.2.2消息隊(duì)列主要有哪些作用\h1.3為什么需要Kafka\h1.4Kafka的基本概念\h1.4.1代理、生產(chǎn)者、消費(fèi)者、消費(fèi)者組\h1.4.2主題、分區(qū)、副本、記錄\h1.5了解Kafka的工作機(jī)制——生產(chǎn)消息/消費(fèi)消息\h1.6Kafka的使用范圍\h1.6.1Kafka的設(shè)計(jì)初衷\h1.6.2Kafka的特性\h1.6.3Kafka適用于哪些場景\h1.7小結(jié)\h第2章安裝及配置Kafka\h2.1本章教學(xué)視頻說明\h2.2安裝與配置基礎(chǔ)環(huán)境\h2.2.1安裝并配置Linux操作系統(tǒng)\h2.2.2實(shí)例1:安裝與配置Java運(yùn)行環(huán)境\h2.2.3實(shí)例2:配置SSH免密碼登錄\h2.2.4實(shí)例3:安裝與配置Zookeeper\h2.3實(shí)例4:部署Kafka\h2.3.1單機(jī)模式部署\h2.3.2分布式模式部署\h2.4實(shí)例5:安裝與配置Kafka監(jiān)控工具\(yùn)h2.4.1獲取并編譯KafkaEagle源代碼\h2.4.2安裝與配置KafkaEagle\h2.5實(shí)例6:編譯Kafka源代碼\h2.5.1安裝與配置Scala運(yùn)行環(huán)境\h2.5.2安裝與配置Gradle\h2.5.3了解Kafka源代碼的編譯過程\h2.6實(shí)例7:將Kafka源代碼導(dǎo)入編輯器\h2.6.1導(dǎo)入IntelliJIDEA編輯器\h2.6.2導(dǎo)入Eclipse編輯器\h2.7了解元數(shù)據(jù)的存儲(chǔ)分布\h2.8了解控制器的選舉流程\h2.8.1了解控制器的啟動(dòng)順序\h2.8.2了解主題分區(qū)Leader節(jié)點(diǎn)的選舉過程\h2.8.3了解注冊分區(qū)和副本狀態(tài)機(jī)\h2.8.4了解分區(qū)自動(dòng)均衡和分區(qū)重新分配\h2.9小結(jié)\h第2篇入門\h第3章Kafka的基本操作\h3.1本章教學(xué)視頻說明\h3.2操作Zookeeper集群\h3.2.1Zookeeper的作用及背景\h3.2.2實(shí)例8:單機(jī)模式啟動(dòng)Zookeeper系統(tǒng)\h3.2.3實(shí)例9:單機(jī)模式關(guān)閉Zookeeper系統(tǒng)\h3.2.4實(shí)例10:分布式模式啟動(dòng)Zookeeper集群\h3.2.5實(shí)例11:分布式模式關(guān)閉Zookeeper集群\h3.3操作Kafka集群\h3.3.1實(shí)例12:單機(jī)模式啟動(dòng)Kafka系統(tǒng)\h3.3.2實(shí)例13:單機(jī)模式關(guān)閉Kafka系統(tǒng)\h3.3.3實(shí)例14:分布式模式啟動(dòng)Kafka集群\h3.3.4實(shí)例15:分布式模式關(guān)閉Kafka集群\h3.4管理主題\h3.4.1什么是主題\h3.4.2實(shí)例16:創(chuàng)建主題\h3.4.3實(shí)例17:查看主題\h3.4.4實(shí)例18:修改主題\h3.4.5實(shí)例19:刪除主題\h3.5管理分區(qū)與副本\h3.5.1分區(qū)和副本的背景及作用\h3.5.2實(shí)例20:修改分區(qū)\h3.5.3實(shí)例21:修改副本數(shù)\h3.6小結(jié)\h第4章將消息數(shù)據(jù)寫入Kafka系統(tǒng)——生產(chǎn)\h4.1本章教學(xué)視頻說明\h4.2了解Kafka生產(chǎn)者\(yùn)h4.3使用腳本操作生產(chǎn)者\(yùn)h4.3.1實(shí)例22:通過監(jiān)控工具查看消息\h4.3.2實(shí)例23:啟動(dòng)消費(fèi)者程序,并查看消息\h4.4發(fā)送消息到Kafka主題\h4.4.1了解異步模式\h4.4.2實(shí)例24:生產(chǎn)者用異步模式發(fā)送消息\h4.4.3了解同步模式\h4.4.4實(shí)例25:生產(chǎn)者用同步模式發(fā)送消息\h4.4.5多線程發(fā)送消息\h4.4.6實(shí)例26:生產(chǎn)者用單線程發(fā)送消息\h4.4.7實(shí)例27:生產(chǎn)者用多線程發(fā)送消息\h4.5配置生產(chǎn)者的屬性\h4.6保存對象的各個(gè)屬性——序列化\h4.6.1實(shí)例28:序列化一個(gè)對象\h4.6.2實(shí)例29:在生產(chǎn)者應(yīng)用程序中實(shí)現(xiàn)序列化\h4.7自定義主題分區(qū)\h4.7.1實(shí)例30:編寫自定義主題分區(qū)的算法\h4.7.2實(shí)例31:演示自定義分區(qū)類的使用\h4.8小結(jié)\h第5章從Kafka系統(tǒng)中讀取消息數(shù)據(jù)——消費(fèi)\h5.1本章教學(xué)視頻說明\h5.2了解Kafka消費(fèi)者\(yùn)h5.2.1為什么需要消費(fèi)者組\h5.2.1消費(fèi)者和消費(fèi)者組的區(qū)別\h5.2.2消費(fèi)者和分區(qū)的對應(yīng)關(guān)系\h5.3使用Kafka系統(tǒng)的腳本操作消費(fèi)者\(yùn)h5.3.1認(rèn)識(shí)消費(fèi)者新接口\h5.3.2實(shí)例32:用新接口啟動(dòng)消費(fèi)者程序,并查看消費(fèi)者信息\h5.3.3實(shí)例33:用舊接口啟動(dòng)消費(fèi)者程序,并查看消費(fèi)者元數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)\h5.4消費(fèi)Kafka集群中的主題消息\h5.4.1主題如何自動(dòng)獲取分區(qū)和手動(dòng)分配分區(qū)\h5.4.2實(shí)例34:主題自動(dòng)/手動(dòng)獲取分區(qū)\h5.4.3實(shí)例35:反序列化主題消息\h5.4.4如何提交消息的偏移量\h5.4.5實(shí)例36:使用多線程消費(fèi)多個(gè)分區(qū)的主題\h5.5配置消費(fèi)者的屬性\h5.6小結(jié)\h第6章存儲(chǔ)及管理數(shù)據(jù)\h6.1本章教學(xué)視頻說明\h6.2分區(qū)存儲(chǔ)數(shù)據(jù)\h6.2.1熟悉分區(qū)存儲(chǔ)\h6.2.2了解消息的格式\h6.3清理過期數(shù)據(jù)的兩種方法\h6.4網(wǎng)絡(luò)模型和通信流程\h6.4.1基本數(shù)據(jù)類型\h6.4.2通信模型\h6.4.3通信過程\h6.6小結(jié)\h第3篇進(jìn)階\h第7章Kafka安全機(jī)制\h7.1本章教學(xué)視頻說明\h7.2了解Kafka的安全機(jī)制\h7.2.1身份驗(yàn)證\h7.2.2權(quán)限控制\h7.3使用SSL協(xié)議進(jìn)行加密和身份驗(yàn)證\h7.3.1了解SSL協(xié)議\h7.3.2實(shí)例37:創(chuàng)建SSL密鑰庫,并查看密鑰庫文件\h7.3.3實(shí)例38:創(chuàng)建私有證書\h7.3.4實(shí)例39:導(dǎo)出證書,使用CA對證書進(jìn)行簽名\h7.3.5實(shí)例40:在服務(wù)端配置SSL協(xié)議,并創(chuàng)建主題\h7.3.6實(shí)例41:在客戶端配置SSL協(xié)議,并讀/寫數(shù)據(jù)\h7.4使用SASL協(xié)議進(jìn)行認(rèn)證\h7.4.1給客戶端配置“Java認(rèn)證和授權(quán)服務(wù)”(JAAS)\h7.4.2給服務(wù)端配置SASL\h7.4.3實(shí)例42:開啟SASL/Kerberos認(rèn)證協(xié)議\h7.4.4實(shí)例43:開啟SASL/PLAIN認(rèn)證協(xié)議\h7.4.5實(shí)例44:開啟SASL/SCRAM認(rèn)證協(xié)議\h7.5權(quán)限控制\h7.5.1權(quán)限控制的基礎(chǔ)命令\h7.5.2配置ACL(訪問控制列表)\h7.5.3實(shí)例45:啟動(dòng)集群\h7.5.4實(shí)例46:查看授權(quán)、添加授權(quán)、刪除授權(quán)\h7.6小結(jié)\h第8章用Kafka連接器建立數(shù)據(jù)管道\h8.1本章教學(xué)視頻說明\h8.2認(rèn)識(shí)Kafka連接器\h8.2.1了解連接器的使用場景\h8.2.2特性及優(yōu)勢\h8.2.3連接器的幾個(gè)核心概念\h8.3操作Kafka連接器\h8.3.1配置Kafka連接器的屬性\h8.3.2認(rèn)識(shí)應(yīng)用接口——RESTAPI\h8.3.3實(shí)例47:單機(jī)模式下,將數(shù)據(jù)導(dǎo)入Kafka主題中\(zhòng)h8.3.4實(shí)例48:單機(jī)模式下,將Kafka主題中的數(shù)據(jù)導(dǎo)出\h8.3.5實(shí)例49:分布式模式下,將數(shù)據(jù)導(dǎo)入Kafka主題\h8.4實(shí)例50:開發(fā)一個(gè)簡易的Kafka連接器插件\h8.4.1編寫Source連接器\h8.4.2編寫Sink連接器\h8.4.3打包與部署\h8.5小結(jié)\h第9章Kafka流處理\h9.1本章教學(xué)視頻說明\h9.2初識(shí)Kafka流處理\h9.2.1什么是流處理\h9.2.2什么是流式計(jì)算\h9.2.3為何要使用流處理\h9.3了解流處理的架構(gòu)\h9.3.1流分區(qū)與任務(wù)\h9.3.2線程模型\h9.3.3本地狀態(tài)存儲(chǔ)\h9.3.4容錯(cuò)性(Failover)\h9.4操作KStream和KTable\h9.4.1流處理的核心概念\h9.4.2窗口操作\h9.4.3連接操作\h9.4.4轉(zhuǎn)換操作\h9.4.5聚合操作\h9.5實(shí)例51:利用流處理開發(fā)一個(gè)單詞統(tǒng)計(jì)程序\h9.5.1創(chuàng)建Kafka流主題\h9.5.2統(tǒng)計(jì)流主題中單詞出現(xiàn)的頻率\h9.5.3預(yù)覽操作結(jié)果\h9.6實(shí)例52:利用Kafka流開發(fā)一個(gè)SQL引擎\h9.6.1構(gòu)建生產(chǎn)流數(shù)據(jù)源\h9.6.2構(gòu)建Kafka流處理\h9.6.3構(gòu)建數(shù)據(jù)結(jié)構(gòu)和執(zhí)行SQL邏輯\h9.6.4觀察操作結(jié)果\h9.7小結(jié)\h第10章監(jiān)控與測試\h10.1本章教學(xué)視頻說明\h10.2Kafka的監(jiān)控工具——KafkaEagle系統(tǒng)\h10.2.1實(shí)例53:管理主題\h10.2.2實(shí)例54:查看消費(fèi)者組信息\h10.2.3實(shí)例55:查看Kafka與Zookeeper集群的狀態(tài)和性能\h10.3測試生產(chǎn)者性能\h10.3.1了解測試環(huán)境\h10.3.2認(rèn)識(shí)測試工具\(yùn)h10.3.3實(shí)例56:利用工具測試生產(chǎn)者性能\h10.4測試消費(fèi)者性能\h10.4.1了解測試環(huán)境\h10.4.2認(rèn)識(shí)測試工具\(yùn)h10.4.3實(shí)例57:利用腳本測試消費(fèi)者的性能\h10.4小結(jié)\h第4篇商業(yè)實(shí)戰(zhàn)\h第11章Kafka與ELK套件的整合\h11.1本章教學(xué)視頻說明\h11.2安裝與配置ELK\h11.2.1安裝與配置LogStash\h11.2.2實(shí)例58:LogStash的標(biāo)準(zhǔn)輸入與輸出\h11.2.3安裝與配置ElasticSearch\h11.2.4實(shí)例59:使用ElasticSearch集群的HTTP接口創(chuàng)建索引\h11.2.5實(shí)例60:使用ElasticSearch集群的HTTP接口查看索引\h11.2.6實(shí)例61:使用ElasticSearch集群的HTTP接口添加數(shù)據(jù)\h11.2.7安裝與配置Kibana\h11.2.8實(shí)例62:啟動(dòng)并驗(yàn)證Kibana系統(tǒng)\h11.3實(shí)例63:實(shí)現(xiàn)一個(gè)游戲日志實(shí)時(shí)分析系統(tǒng)\h11.3.1了解系統(tǒng)要實(shí)現(xiàn)的功能\h11.3.2了解平臺(tái)體系架構(gòu)\h11.3.3采集數(shù)據(jù)\h11.3.4分流數(shù)據(jù)\h11.3.5實(shí)現(xiàn)數(shù)據(jù)可視化\h11.4小結(jié)\h第12章Kafka與Spark實(shí)時(shí)計(jì)算引擎的整合\h12.1本章教學(xué)視頻說明\h12.2介紹Spark背景\h12.2.1SparkSQL——Spark處理結(jié)構(gòu)化數(shù)據(jù)的模塊\h12.2.2SparkStreaming——Spark核心應(yīng)用接口的一種擴(kuò)展\h12.2.3MLlib——Spark的一個(gè)機(jī)器學(xué)習(xí)類庫\h12.2.4GraphX——Spark的一個(gè)圖計(jì)算框架\h12.3準(zhǔn)備Spark環(huán)境\h12.3.1下載Spark基礎(chǔ)安裝包\h12.3.2安裝與配置Spark集群\h12.4操作Spark\h12.4.1實(shí)例64:使用SparkShell統(tǒng)計(jì)單詞出現(xiàn)的頻率\h12.4.2實(shí)例65:使用SparkSQL對單詞權(quán)重進(jìn)行降序輸出\h12.4.3實(shí)例66:使用SparkSubmit統(tǒng)計(jì)單詞出現(xiàn)的頻率\h12.5實(shí)例67:對游戲明細(xì)數(shù)據(jù)做實(shí)時(shí)統(tǒng)計(jì)\h12.5.1了解項(xiàng)目背景和價(jià)值\h12.5.2設(shè)計(jì)項(xiàng)目實(shí)現(xiàn)架構(gòu)\h12.5.3編碼步驟一實(shí)現(xiàn)數(shù)據(jù)采集\h12.5.4編碼步驟二實(shí)現(xiàn)流計(jì)算\h12.5.5編碼步驟三打包應(yīng)用程序\h12.5.6編碼步驟四創(chuàng)建表結(jié)構(gòu)\h12.5.7編碼步驟五執(zhí)行應(yīng)用程序\h12.5.8編碼步驟六預(yù)覽結(jié)果\h12.6小結(jié)\h第13章實(shí)例68:從零開始設(shè)計(jì)一個(gè)Kafka監(jiān)控系統(tǒng)——KafkaEagle\h13.1本章教學(xué)視頻說明\h13.2了解KafkaEagle監(jiān)控系統(tǒng)\h13.2.1設(shè)計(jì)的背景\h13.2.2應(yīng)用場景\h13.3從結(jié)構(gòu)上了解KafkaEagle\h13.3.1了解KafkaEagle的整體架構(gòu)和代碼結(jié)構(gòu)\h13.3.2設(shè)計(jì)KafkaEagle的7大功能模塊\h13.4實(shí)現(xiàn)KafkaEagle的功能模塊\h13.4.1編碼步驟一實(shí)現(xiàn)數(shù)據(jù)面板\h13.4.2編碼步驟二實(shí)現(xiàn)主題管理\h13.4.3編碼步驟三實(shí)現(xiàn)消費(fèi)者實(shí)例詳情\h13.4.4編碼步驟四實(shí)現(xiàn)集群監(jiān)控\h13.4.5編碼步驟五實(shí)現(xiàn)性能監(jiān)控\h13.4.6編碼步驟六實(shí)現(xiàn)告警功能\h13.4.7編碼步驟七實(shí)現(xiàn)系統(tǒng)功能\h13.5安裝及使用KafkaEagle監(jiān)控系統(tǒng)\h13.5.1準(zhǔn)備環(huán)境\h13.5.2快速部署\h13.5.3了解KafkaEagle的基礎(chǔ)命令\h13.6小結(jié)\h第1篇準(zhǔn)備業(yè)界已有的消息隊(duì)列系統(tǒng),在擴(kuò)展性、可靠性、資源利用率和吞吐率方面存在明顯不足,故LinkedIn團(tuán)隊(duì)開始嘗試設(shè)計(jì)一款新的消息隊(duì)列系統(tǒng),進(jìn)而誕生了Kafka消息隊(duì)列系統(tǒng)。本篇將介紹學(xué)習(xí)Kafka前的準(zhǔn)備工作,包括Kafka的基本概念和架構(gòu),以及詳細(xì)的安裝步驟。?第1章了解消息隊(duì)列和Kafka?第2章安裝及配置Kafka\h第1章了解消息隊(duì)列和Kafka本章的知識(shí)都是Kafka基礎(chǔ),學(xué)習(xí)起來會(huì)非常輕松。本章能夠幫助讀者從零開始認(rèn)識(shí)Kafka,內(nèi)容包含消息隊(duì)列、Kafka的起源、Kafka的基礎(chǔ)知識(shí)等。\h1.1本章教學(xué)視頻說明視頻內(nèi)容:什么是消息隊(duì)列、消息隊(duì)列與Kafka之間的聯(lián)系、Kafka的基本概念、Kafka的工作機(jī)制,以及Kafka的使用范圍等。視頻時(shí)長:10分鐘。視頻截圖見圖1-1。圖1-1本章教學(xué)視頻截圖\h1.2消息隊(duì)列在高并發(fā)的應(yīng)用場景中,由于來不及同步處理請求,接收到的請求往往會(huì)發(fā)生阻塞。例如,大量的插入、更新請求同時(shí)到達(dá)數(shù)據(jù)庫,這會(huì)導(dǎo)致行或表被鎖住,最后會(huì)因?yàn)檎埱蠖逊e過多而觸發(fā)“連接數(shù)過多的異?!保═ooManyConnections)錯(cuò)誤。因此,在高并發(fā)的應(yīng)用場景中需要一個(gè)緩沖機(jī)制,而消息隊(duì)列則可以很好地充當(dāng)這樣一個(gè)角色。消息隊(duì)列通過異步處理請求來緩解系統(tǒng)的壓力。\h1.2.1什么是消息隊(duì)列“消息隊(duì)列”(MessageQueue,MQ)從字面來理解,是一個(gè)隊(duì)列,擁有先進(jìn)先出(FirstInputFirstOutput,FIFO)的特性。它主要用于不同進(jìn)程或線程之間的通信,用來處理一系列的輸入請求。消息隊(duì)列采用異步通信機(jī)制。即,消息的發(fā)送者和接收者無須同時(shí)與消息隊(duì)列進(jìn)行數(shù)據(jù)交互,消息會(huì)一直保存在隊(duì)列中,直至被接收者讀取。每一條消息記錄都包含詳細(xì)的數(shù)據(jù)說明,包括數(shù)據(jù)產(chǎn)生的時(shí)間、數(shù)據(jù)類型、特定的輸入?yún)?shù)。\h1.2.2消息隊(duì)列主要有哪些作用在實(shí)際的應(yīng)用中,消息隊(duì)列主要有以下作用?!駪?yīng)用解耦:多個(gè)應(yīng)用可通過消息隊(duì)列對相同的消息進(jìn)行處理,應(yīng)用之間相互獨(dú)立,互不影響;●異步處理:相比于串行和并行處理,異步處理可以減少處理的時(shí)間;●數(shù)據(jù)限流:流量高峰期,可通過消息隊(duì)列來控制流量,避免流量過大而引起應(yīng)用系統(tǒng)崩潰;●消息通信:實(shí)現(xiàn)點(diǎn)對點(diǎn)消息隊(duì)列或聊天室等。1.應(yīng)用解耦由于消息與平臺(tái)和語言無關(guān),并且在語法上也不再是函數(shù)之間的調(diào)用,因此,消息隊(duì)列允許應(yīng)用接口獨(dú)立地進(jìn)行擴(kuò)展,只用應(yīng)用接口遵守同樣的接口約束。舉例,用戶使用客戶端上傳一張個(gè)人圖片,具體流程如圖1-2所示。(1)圖片上傳系統(tǒng)將圖片信息(如唯一ID、圖片類型、圖片尺寸等)批量寫入消息隊(duì)列,寫入成功后會(huì)將結(jié)果直接返回給客戶端。(2)人臉識(shí)別系統(tǒng)定時(shí)從消息隊(duì)列中讀取數(shù)據(jù),完成對新增圖片的識(shí)別。圖1-2應(yīng)用解耦實(shí)例圖圖片上傳系統(tǒng)無須關(guān)心人臉識(shí)別系統(tǒng)是否對上傳的圖片進(jìn)行了處理,它只需要關(guān)心是否成功將圖片信息寫入消息隊(duì)列。由于用戶無須立即知曉人臉識(shí)別的結(jié)果,因此人臉識(shí)別系統(tǒng)可選擇不同的調(diào)度策略來處理消息隊(duì)列中的圖片信息。2.異步處理用戶在注冊賬號(hào)時(shí),服務(wù)程序需要給用戶發(fā)送郵件注冊信息和短信注冊信息。比較傳統(tǒng)的做法是——通過串行和并行的方式來實(shí)現(xiàn)。(1)串行方式:先將用戶注冊信息寫入數(shù)據(jù)庫,然后發(fā)送短信注冊信息,再發(fā)送郵件注冊信息。以上三個(gè)任務(wù)全部完成后,才會(huì)將結(jié)果返回給用戶。具體流程如圖1-3所示。假設(shè)這三個(gè)階段的耗時(shí)均為20ms,不考慮網(wǎng)絡(luò)等其他消耗,則整個(gè)過程需耗時(shí)60ms。(2)并行方式:先將用戶注冊信息寫入數(shù)據(jù)庫,然后在發(fā)送短信注冊信息的同時(shí)還發(fā)送郵件注冊信息。以上任務(wù)全部完成后才會(huì)將結(jié)果返回給用戶。具體流程如圖1-4所示。圖1-3串行方式流程圖圖1-4并行處理流程圖假設(shè)這三個(gè)階段的耗時(shí)均為20ms,不考慮網(wǎng)絡(luò)等其他消耗,則整個(gè)過程需耗時(shí)40ms。提示:與串行的不同之處是,并行處理提高了處理效率,減少了處理時(shí)間。針對上述應(yīng)用場景,采傳統(tǒng)方式時(shí),系統(tǒng)的性能(如并發(fā)量、吞吐量、響應(yīng)時(shí)間等)會(huì)產(chǎn)生瓶頸。此時(shí)需要引入消息隊(duì)列異步處理非必要業(yè)務(wù)環(huán)節(jié)。具體架構(gòu)如圖1-5所示。圖1-5更改并行處理流程圖用戶將注冊信息寫入數(shù)據(jù)庫約耗時(shí)20ms(和串行和并行的處理時(shí)間相同)。短信和郵件注冊信息寫入消息隊(duì)列后會(huì)直接將結(jié)果返回給用戶。由于寫入消息隊(duì)列的速度非??欤究梢院雎?。另外,“通過異步讀取消息隊(duì)列中的短信注冊信息”過程和“郵件注冊信息”過程相當(dāng)于同時(shí)進(jìn)行的,那么整個(gè)過程約耗時(shí)20ms。提示:從上面的分析可以看出,在調(diào)整架構(gòu)后,系統(tǒng)的整體處理時(shí)間是串行方式的1/3,是并行方式的1/2。3.數(shù)據(jù)限流數(shù)據(jù)限流也是消息隊(duì)列的常用場景之一,一般在促銷和“秒殺”活動(dòng)中使用得較為廣泛。例如,在電商的“雙11”活動(dòng)中,由于瞬間的數(shù)據(jù)訪問量過大,服務(wù)器接收到的數(shù)據(jù)請求過大,則導(dǎo)致服務(wù)器上的應(yīng)用服務(wù)無法處理請求而崩潰。為了解決這類問題,一般需要先將用戶請求寫入消息隊(duì)列(相當(dāng)于用消息隊(duì)列做一次緩沖),然后服務(wù)器上的應(yīng)用服務(wù)再從消息隊(duì)列中讀取數(shù)據(jù)。具體流程如圖1-6所示。圖1-6數(shù)據(jù)限流流程圖數(shù)據(jù)限流具有以下優(yōu)點(diǎn):●用戶請求寫數(shù)據(jù)到消息隊(duì)列時(shí),不與應(yīng)用業(yè)務(wù)服務(wù)直接接觸,中間存在一次緩沖。這極大地減少了應(yīng)用服務(wù)處理用戶請求的壓力?!窨梢栽O(shè)置隊(duì)列的長度,用戶請求遵循FIFO原則。后來的用戶請求處于隊(duì)列之外時(shí),是無法秒殺到商品的,這些請求會(huì)直接被舍棄,返給用戶“商品已售完”的結(jié)果。提示:FIFO(FirstInputFirstOutput,先進(jìn)先出)是一種較為傳統(tǒng)的執(zhí)行方法,按照請求的進(jìn)入順序依次進(jìn)行處理。4.消息通信消息隊(duì)列具有高效的通信機(jī)制,所以其在點(diǎn)對點(diǎn)通信和聊天室通信中被廣泛應(yīng)用。具體流程如圖1-7和1-8所示。圖1-7點(diǎn)對點(diǎn)通信流程圖圖1-8聊天室通信流程圖\h1.3為什么需要KafkaKafka起源于LinkedIn公司。起初,LinkedIn需要收集各個(gè)業(yè)務(wù)系統(tǒng)和應(yīng)用的指標(biāo)數(shù)據(jù)來進(jìn)行數(shù)據(jù)分析,原先是使用“自定義開發(fā)”系統(tǒng)來實(shí)現(xiàn)的。但這期間需要采集的數(shù)據(jù)量非常大,且內(nèi)容很復(fù)雜。除要采集操作系統(tǒng)的基礎(chǔ)指標(biāo)(例如:內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等)外,還要采集很多和業(yè)務(wù)相關(guān)的數(shù)據(jù)指標(biāo)。隨著數(shù)據(jù)量的增長、業(yè)務(wù)需求的復(fù)雜度提高,這個(gè)“自定義開發(fā)”系統(tǒng)的問題也越來越多。例如,在處理一個(gè)HTTP請求數(shù)據(jù)時(shí),由于數(shù)據(jù)內(nèi)容是以XML數(shù)據(jù)格式進(jìn)行傳輸?shù)模枰葘@部分?jǐn)?shù)據(jù)做解析處理,然后才能拿來做離線分析。由于這樣一個(gè)自定義開發(fā)系統(tǒng)不夠穩(wěn)定,且XML數(shù)據(jù)格式的解析過程也非常復(fù)雜,所以系統(tǒng)經(jīng)常出現(xiàn)問題。出現(xiàn)問題后,定位分析也比較麻煩,需要很長的處理時(shí)間,所以無法做到實(shí)時(shí)服務(wù)。之后,LinkedIn想尋找一種可支持大數(shù)據(jù)實(shí)時(shí)服務(wù)并且支持水平擴(kuò)展的解決方案。嘗試過使用ActiveMQ,但是它不支持水平擴(kuò)展,并且ActiveMQ內(nèi)部有很多Bug。說明:ActiveMQ是一個(gè)開源的消息系統(tǒng),完全采用Java編程語言來實(shí)現(xiàn),因此能很好地兼容Java消息服務(wù)(JavaMessageService,JMS)規(guī)范。于是,LinkedIn團(tuán)隊(duì)開發(fā)了一個(gè)既滿足實(shí)時(shí)處理需求,又可支持水平拓展的消息系統(tǒng)——Kafka,它還擁有高吞吐量特性。2010年,Kafka項(xiàng)目被托管到Github開源社區(qū)。一時(shí)間,大量開發(fā)者被這個(gè)項(xiàng)目所吸引。2011年,Kafka成為Apache項(xiàng)目基金會(huì)的一個(gè)開源項(xiàng)目。2012年,Apache項(xiàng)目基金會(huì)開始對Kafka項(xiàng)目進(jìn)行孵化。之后,不斷有LinkedIn員工和社區(qū)成員來維護(hù)和改善Kafka項(xiàng)目,Kafka項(xiàng)目得到持續(xù)不斷地改進(jìn)。如今,Kafka項(xiàng)目成為Apache項(xiàng)目基金會(huì)的頂級(jí)項(xiàng)目之一。\h1.4Kafka的基本概念Kafka是一個(gè)分布式實(shí)時(shí)數(shù)據(jù)流平臺(tái),可獨(dú)立部署在單臺(tái)服務(wù)器上,也可部署在多臺(tái)服務(wù)器上構(gòu)成集群。它提供了發(fā)布與訂閱功能。用戶可以發(fā)送數(shù)據(jù)到Kafka集群中,也可以從Kafka集群中讀取數(shù)據(jù)。Kafka系統(tǒng)中有幾個(gè)核心概念,下面分別介紹。\h1.4.1代理、生產(chǎn)者、消費(fèi)者、消費(fèi)者組1.代理(Broker)在Kafka集群中,一個(gè)Kafka進(jìn)程(Kafka進(jìn)程又稱為Kafka實(shí)例)被稱為一個(gè)代理(Broker)節(jié)點(diǎn)。代理節(jié)點(diǎn)是消息隊(duì)列中的一個(gè)常用概念。通常,在部署分布式Kafka集群時(shí),一臺(tái)服務(wù)器上部署一個(gè)Kafka實(shí)例。2.生產(chǎn)者(Producer)在Kafka系統(tǒng)中,生產(chǎn)者通常被稱為Producer。Producer將消息記錄發(fā)送到Kafka集群指定的主題(Topic)中進(jìn)行存儲(chǔ),同時(shí)生產(chǎn)者(Producer)也能通過自定義算法決定將消息記錄發(fā)送到哪個(gè)分區(qū)(Partition)。例如,通過獲取消息記錄主鍵(Key)的哈希值,然后使用該值對分區(qū)數(shù)取模運(yùn)算,得到分區(qū)索引。計(jì)算公式如下。3.消費(fèi)者(Consumer)消費(fèi)者(Consumer)從Kafka集群指定的主題(Topic)中讀取消息記錄。在讀取主題數(shù)據(jù)時(shí),需要設(shè)置消費(fèi)組名(GroupId)。如果不設(shè)置,則Kafka消費(fèi)者會(huì)默認(rèn)生成一個(gè)消費(fèi)組名稱。4.消費(fèi)者組(ConsumerGroup)消費(fèi)者程序在讀取Kafka系統(tǒng)主題(Topic)中的數(shù)據(jù)時(shí),通常會(huì)使用多個(gè)線程來執(zhí)行。一個(gè)消費(fèi)者組可以包含一個(gè)或多個(gè)消費(fèi)者程序,使用多分區(qū)和多線程模式可以極大提高讀取數(shù)據(jù)的效率。提示:一般而言,一個(gè)消費(fèi)者對應(yīng)一個(gè)線程。在給應(yīng)用程序設(shè)置線程數(shù)量時(shí),遵循“線程數(shù)小于等于分區(qū)數(shù)”原則。如果線程數(shù)大于分區(qū)數(shù),則多余的線程不會(huì)消費(fèi)分區(qū)中的數(shù)據(jù),這樣會(huì)造成資源浪費(fèi)。\h1.4.2主題、分區(qū)、副本、記錄1.主題(Topic)Kafka系統(tǒng)通過主題來區(qū)分不同業(yè)務(wù)類型的消息記錄。例如,用戶登錄數(shù)據(jù)存儲(chǔ)在主題A中,用戶充值記錄存儲(chǔ)在主題B中,則如果應(yīng)用程序只訂閱了主題A,而沒有訂閱主題B,那該應(yīng)用程序只能讀取主題A中的數(shù)據(jù)。2.分區(qū)(Partition)每一個(gè)主題(Topic)中可以有一個(gè)或者多個(gè)分區(qū)(Partition)。在Kafka系統(tǒng)的設(shè)計(jì)思想中,分區(qū)是基于物理層面上的,不同的分區(qū)對應(yīng)著不同的數(shù)據(jù)文件。Kafka通過分區(qū)(Partition)來支持物理層面上的并發(fā)讀寫,以提高Kafka集群的吞吐量。每個(gè)主題(Topic)下的各分區(qū)(Partition)中存儲(chǔ)數(shù)據(jù)的具體流程如圖1-9所示。圖1-9各分區(qū)存儲(chǔ)數(shù)據(jù)的流程每個(gè)分區(qū)(Partition)內(nèi)部的消息記錄是有序的,每個(gè)消息都有一個(gè)連續(xù)的偏移量序號(hào)(Offset)。一個(gè)分區(qū)只對應(yīng)一個(gè)代理節(jié)點(diǎn)(Broker),一個(gè)代理節(jié)點(diǎn)可以管理多個(gè)分區(qū)。3.副本(Replication)在Kafka系統(tǒng)中,每個(gè)主題(Topic)在創(chuàng)建時(shí)會(huì)要求指定它的副本數(shù),默認(rèn)是1。通過副本(Replication)機(jī)制來保證Kafka分布式集群數(shù)據(jù)的高可用性。提示:在創(chuàng)建主題時(shí),主題的副本系數(shù)值應(yīng)如下設(shè)置:(1)若集群數(shù)量大于等于3,則主題的副本系數(shù)值可以設(shè)置為3;(2)若集群數(shù)量小于3,則主題的副本系數(shù)值可以設(shè)置為小于等于集群數(shù)量值。例如,集群數(shù)為2,則副本系數(shù)可以設(shè)置為1或者2;集群數(shù)為1,則副本系數(shù)只能設(shè)置為1。通常情況下,當(dāng)集群數(shù)量大于等于3時(shí),為了保證集群數(shù)據(jù)不丟失,會(huì)將副本系數(shù)值設(shè)置為3。當(dāng)然,集群數(shù)量大于等于3時(shí),副本系數(shù)值也可以設(shè)置為1或者2,但是會(huì)存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)。4.記錄(Record)被實(shí)際寫入到Kafka集群并且可以被消費(fèi)者應(yīng)用程序讀取的數(shù)據(jù),被稱為記錄(Record)。每條記錄包含一個(gè)鍵(Key)、值(Value)和時(shí)間戳(Timestamp)。\h1.5了解Kafka的工作機(jī)制——生產(chǎn)消息/消費(fèi)消息Kafka作為一個(gè)消息隊(duì)列系統(tǒng),其核心機(jī)制就是生產(chǎn)消息和消費(fèi)消息。在Kafka基本結(jié)構(gòu)中,生產(chǎn)者(Producer)組件和消費(fèi)者(Consumer)組件互不影響,但又是必須存在的。缺少生產(chǎn)者和消費(fèi)者中的任意一方,整個(gè)Kafka消息隊(duì)列系統(tǒng)將是不完整的。Kafka消息隊(duì)列系統(tǒng)最基本的結(jié)構(gòu)如圖1-10所示。●生產(chǎn)者(Producer)負(fù)責(zé)寫入消息數(shù)據(jù)。將審計(jì)日志、服務(wù)日志、數(shù)據(jù)庫、移動(dòng)App日志,以及其他類型的日志主動(dòng)推送到Kafka集群進(jìn)行存儲(chǔ)?!裣M(fèi)者(Consumer)負(fù)責(zé)讀取消息數(shù)據(jù)。例如,通過Hadoop的應(yīng)用接口、Spark的應(yīng)用接口、Storm的應(yīng)用接口、ElasticSearch的應(yīng)用接口,以及其他自定義服務(wù)的應(yīng)用接口,主動(dòng)拉取Kafka集群中的消息數(shù)據(jù)。另外,Kafka是一個(gè)分布式系統(tǒng),用Zookeeper來管理、協(xié)調(diào)Kafka集群的各個(gè)代理(Broker)節(jié)點(diǎn)。當(dāng)Kafka集群中新添加了一個(gè)代理節(jié)點(diǎn),或者某一臺(tái)代理節(jié)點(diǎn)出現(xiàn)故障時(shí),Zookeeper服務(wù)將會(huì)通知生產(chǎn)者應(yīng)用程序和消費(fèi)者應(yīng)用程序去其他的正常代理節(jié)點(diǎn)讀寫。提示:這里只需對Kafka的基本結(jié)構(gòu)有一個(gè)宏觀的認(rèn)知即可,后面章會(huì)詳細(xì)介紹Kafka的具體內(nèi)容。圖1-10Kafka消息中間件系統(tǒng)基本結(jié)構(gòu)\h1.6Kafka的使用范圍Kafka作為一個(gè)分布式消息隊(duì)列系統(tǒng),擁有處理海量數(shù)據(jù)的能力。它不僅在實(shí)時(shí)業(yè)務(wù)場景中有天然優(yōu)勢,而且在處理某些場景中的離線任務(wù)時(shí)也表現(xiàn)不俗,這得益于Kafka底層的通用性和其強(qiáng)大的應(yīng)用接口(API)。在實(shí)時(shí)業(yè)務(wù)場景中,Kafka能夠和Spark、Flink、Storm等實(shí)時(shí)計(jì)算引擎完美地結(jié)合。同時(shí),Kafka也提供了應(yīng)用接口(API),可以將主題(Topic)中的數(shù)據(jù)導(dǎo)出到Hive倉庫做離線計(jì)算。\h1.6.1Kafka的設(shè)計(jì)初衷Kafka雛形由LinkedIn開發(fā),設(shè)計(jì)之初被LinkedIn用來處理活動(dòng)流數(shù)據(jù)和運(yùn)營數(shù)據(jù)。提示:活動(dòng)流數(shù)據(jù),是指瀏覽器訪問記錄、頁面搜索記錄、查看網(wǎng)頁詳細(xì)記錄等站點(diǎn)內(nèi)容。運(yùn)營數(shù)據(jù),是指服務(wù)器的基本指標(biāo),例如CPU、磁盤I/O、網(wǎng)絡(luò)、內(nèi)存等。在后續(xù)版本迭代中,Kafka被設(shè)計(jì)成一個(gè)統(tǒng)一的平臺(tái),可用來處理大公司所有的實(shí)時(shí)數(shù)據(jù)。需要它能夠滿足以下需求。1.高吞吐量日常生活中所使用的支付寶、微信、QQ這類軟件的用戶量非常龐大,每秒產(chǎn)生的數(shù)據(jù)流量也非常巨大。面對這類場景,若要實(shí)時(shí)地聚合消息日志,必須具有高吞吐量才能支持高容量事件流。2.高可用隊(duì)列分布式消息隊(duì)列系統(tǒng)都具有異步處理機(jī)制。另外,分布式消息隊(duì)列系統(tǒng)一般都擁有處理大量數(shù)據(jù)積壓能力,以便支持其他離線系統(tǒng)的定期數(shù)據(jù)加載。3.低延時(shí)實(shí)時(shí)應(yīng)用場景對時(shí)延的要求極為嚴(yán)格。耗時(shí)越少,則結(jié)果越理想。這意味著,設(shè)計(jì)出來的系統(tǒng)必須擁有低延遲處理能力。4.分布式機(jī)制系統(tǒng)還需具有支持分區(qū)、分布式、能實(shí)時(shí)處理消息等特點(diǎn),并能在機(jī)器出現(xiàn)故障時(shí)保證數(shù)據(jù)不丟失。為滿足這些需求,Kafka擁有了許多獨(dú)特的特性,這使得它更類似于數(shù)據(jù)庫日志,而不是傳統(tǒng)的消息傳遞系統(tǒng)。在1.6.2小節(jié)將介紹這些獨(dú)特的特性。\h1.6.2Kafka的特性如今Kafka的社區(qū)非常活躍,有大量的開發(fā)人員不斷地改善Kafka的不足。在Kafka迭代過程中,每個(gè)版本中都會(huì)添加很多新特性。1.異步生產(chǎn)數(shù)據(jù)從Kafka0.8.2起,生產(chǎn)者(Producer)寫數(shù)據(jù)時(shí)不再區(qū)分同步和異步,所有的操作請求均以異步的方式發(fā)送,這樣大大地提高了客戶端寫數(shù)據(jù)的效率。異步方式將數(shù)據(jù)批量的發(fā)送到Kafka不同的代理(Broker)節(jié)點(diǎn),因此也減少了Kafka服務(wù)端的資源開銷。這種方式在與Kafka系統(tǒng)進(jìn)行網(wǎng)絡(luò)通信時(shí),能夠有效地減少等待時(shí)間。2.偏移量遷移在Kafka0.8.2之前,消費(fèi)者(Consumer)每次讀取Kafka集群主題(Topic)中的數(shù)據(jù)時(shí),會(huì)產(chǎn)生“消費(fèi)”記錄,比如偏移量(Offset)、“消費(fèi)”線程信息、時(shí)間戳等信息。這些信息都保存在Zookeeper集群中,這樣Zookeeper的性能會(huì)嚴(yán)重影響Kafka集群的吞吐量。從Kafka0.8.2版本開始,消費(fèi)者(Consumer)應(yīng)用程序可以把“消費(fèi)”記錄提交到Kafka集群,并以內(nèi)部主題的方式進(jìn)行存儲(chǔ),Kafka系統(tǒng)將其命名為__consumer_offsets。一直持續(xù)到Kafka0.10.0版本,Kafka官網(wǎng)才將該特性設(shè)置為默認(rèn)屬性。說明:在Kafka集群主題中,__consumer_offsets屬于內(nèi)部主題。外界客戶端應(yīng)用程序無法直接讀取該主題內(nèi)的數(shù)據(jù),需要設(shè)置特別的屬性才能實(shí)現(xiàn)。3.安全機(jī)制在Kafka0.9之前,Kafka系統(tǒng)是沒有安全機(jī)制的,在通過外網(wǎng)進(jìn)行數(shù)據(jù)傳輸時(shí),只能通過設(shè)置Linux操作系統(tǒng)的防火墻或者網(wǎng)絡(luò)安全來控制。如果用戶使用的數(shù)據(jù)是非常敏感的(比如銀行的交易流水記錄),應(yīng)用Kafka是讓人非常擔(dān)憂的,因?yàn)閿?shù)據(jù)的安全性難以得到保證。在Kafka0.9版本以后,系統(tǒng)添加了安全機(jī)制,可以通過SSL和SASL安全機(jī)制來進(jìn)行身份確認(rèn)。生產(chǎn)者(Producer)和消費(fèi)者(Consumer)必須進(jìn)行身份驗(yàn)證,才能操作Kafka集群。另外,Kafka代理(Broker)與Zookeeper集群進(jìn)行連接時(shí)也需要身份驗(yàn)證。在設(shè)置了安全機(jī)制的Kafka集群中,數(shù)據(jù)均采用加密方式進(jìn)行傳輸。由于加密方式依賴操作系統(tǒng)的CPU和Java虛擬機(jī)(JavaVirtualMachine,JVM),所以,在采用加密方式傳輸數(shù)據(jù)時(shí)性能可能會(huì)降低。提示:在后面的章中會(huì)詳細(xì)介紹Kafka的安全機(jī)制,這里作為一個(gè)特性讓讀者先有所了解。4.連接器Kafka在0.9版本中,添加了一個(gè)名為Connect的模塊,即連接器。從命名上來看,它可以在外部系統(tǒng)與數(shù)據(jù)集之間建立一個(gè)數(shù)據(jù)流管道,以實(shí)現(xiàn)數(shù)據(jù)的讀與寫。Kafka使用了一個(gè)通用的框架,可以在這個(gè)框架上非常便捷地開發(fā)和管理Kafka連接器(Connect)接口。Kafka連接器還支持在分布式模式或者單機(jī)模式下運(yùn)行,并可以通過RESTAPI提交和管理Kafka集群。5.機(jī)架感知Kafka0.10及以后版本中添加了機(jī)架感知功能。引入機(jī)架感知的概念,能夠顯著提升Kafka集群的可用性。如果所有備份數(shù)據(jù)都在一個(gè)單個(gè)機(jī)架上,一旦這個(gè)機(jī)架出現(xiàn)故障,則導(dǎo)致所有的備份數(shù)據(jù)變得不可用,這樣是很危險(xiǎn)的。所以,需要使用機(jī)架感知來讓Kafka的備份數(shù)據(jù)分布到不同的機(jī)架上,以保證數(shù)據(jù)的高可用性。6.數(shù)據(jù)流在Kafka0.10及以后版本中,添加了數(shù)據(jù)流特性。在實(shí)際業(yè)務(wù)場景中,如需將Kafka集群中的數(shù)據(jù)進(jìn)行流處理之后再重新回寫到Kafka集群中,那使用KafkaStreams(數(shù)據(jù)流)這一特性能夠很輕易地實(shí)現(xiàn)。KafkaStreams是一個(gè)用來處理流式數(shù)據(jù)的庫,屬于Java類庫。它并不是一個(gè)流處理框架,與Flink、Storm、Spark等這類流處理框架是不一樣的。KafkaStreams不僅只是一個(gè)類庫,它依然擁有一系列流處理功能,例如連接(JOIN)、過濾(Filter)、聚合(Aggregate)等,能夠?qū)崿F(xiàn)一個(gè)功能齊全、低延時(shí)的實(shí)時(shí)流處理。7.時(shí)間戳在Kafka0.10及以后版本中,生產(chǎn)者(Producer)寫入的每一條消息記錄都加入了時(shí)間戳(Timestamp)。在寫入消息的過程中,如果用戶沒有指定該消息的時(shí)間,則該消息的時(shí)間會(huì)被自動(dòng)添加上。Kafka數(shù)據(jù)流(Streams)實(shí)現(xiàn)了基于時(shí)間事件的實(shí)時(shí)流處理,用戶可以使用時(shí)間戳來跟蹤和查找消息記錄。8.消息語義在Kafka版本中,實(shí)現(xiàn)了消息記錄只處理一次(ExactlyOnceSemantics,EOS)。在Kafka中,單個(gè)代理(Broker)節(jié)點(diǎn)可能會(huì)出現(xiàn)宕機(jī),或者生產(chǎn)者(Producer)在向Kafka集群主題(Topic)發(fā)送消息時(shí)出現(xiàn)網(wǎng)絡(luò)故障。Kafka生產(chǎn)者在處理這類異常行為時(shí)會(huì)有以下幾種不同語義?!裰辽僖淮危喝绻贙afka中設(shè)置ACKS=ALL,則意味著寫入的消息至少有一條。如果生產(chǎn)者(Producer)等待Kafka集群服務(wù)端確認(rèn)發(fā)生超時(shí),或者收到服務(wù)端響應(yīng)的錯(cuò)誤碼,則會(huì)觸發(fā)重試機(jī)制。若是Kafka代理(Broker)節(jié)點(diǎn)在發(fā)送確認(rèn)之前失敗了,但是消息卻成功寫入到了Kafka集群主題(Topic),由于失敗再次觸發(fā)重試機(jī)制導(dǎo)致消息被重寫,最終導(dǎo)致結(jié)果不正確?!裰炼嘁淮危荷a(chǎn)者(Produce)在發(fā)送消息到Kafka集群主題(Topic)時(shí),最多允許消息成功寫入一次,這樣可避免數(shù)據(jù)重復(fù)。●精準(zhǔn)一次:這是最符合要求的,但是也是最困難的。因?yàn)樗枰鬟f系統(tǒng)與生產(chǎn)者和消費(fèi)者的應(yīng)用程序之間進(jìn)行配合。在成功讀取一條消息后,如果用戶將Kafka的偏移量(Offset)的值回退到原點(diǎn),則用戶將會(huì)從回退的偏移量值開始讀取消息,一直讀取到最新的消息為止。\h1.6.3Kafka適用于哪些場景在實(shí)際的使用場景中,Kafka有著廣泛的應(yīng)用。例如,日志收集、消息系統(tǒng)、活動(dòng)追蹤、運(yùn)營指標(biāo)、流式處理、事件源等。1.日志收集在實(shí)際工作中,系統(tǒng)和應(yīng)用程序都會(huì)產(chǎn)生大量的日志。為了方便管理這些日志,可以利用Kafka將這些零散的日志收集到Kafka集群中,然后通過Kafka的統(tǒng)一接口將這些數(shù)據(jù)開放給不同的消費(fèi)者(Consumer)。統(tǒng)一接口包括:Hadoop的應(yīng)用接口、HBase的應(yīng)用接口、ElasticSearch的應(yīng)用接口等。2.消息系統(tǒng)線上業(yè)務(wù)流量很大的應(yīng)用,可以使用Kafka作為緩沖,以減少服務(wù)端的壓力。這樣能夠有效地解耦生產(chǎn)者(Producer)和消費(fèi)者(Consumer),以及緩沖消息數(shù)據(jù)。3.用戶軌跡可使用Kafka記錄瀏覽器用戶或者手機(jī)App用戶產(chǎn)生的各種記錄,例如瀏覽的網(wǎng)頁、搜索的內(nèi)容、點(diǎn)擊的內(nèi)容等。這些用戶活動(dòng)信息會(huì)被服務(wù)器收集Kafka集群中進(jìn)行存儲(chǔ),然后消費(fèi)者通過“消費(fèi)”這些活動(dòng)數(shù)據(jù)來做實(shí)時(shí)分析,或者加載到Hive數(shù)據(jù)倉庫做離線數(shù)據(jù)分析與挖掘。4.記錄運(yùn)營監(jiān)控?cái)?shù)據(jù)Kafka也可用來記錄運(yùn)營監(jiān)控?cái)?shù)據(jù),包括收集各種分布式應(yīng)用系統(tǒng)的數(shù)據(jù)(如Hadoop系統(tǒng)、Hive系統(tǒng)、HBase系統(tǒng)等)。5.實(shí)現(xiàn)流處理Kafka是一個(gè)流處理平臺(tái),所以在實(shí)際應(yīng)用場景中也會(huì)與其他大數(shù)據(jù)套件結(jié)合使用,例如SparkStreaming、Storm、Flink等。6.事件源事件源是一種應(yīng)用程序的設(shè)計(jì)風(fēng)格,其中狀態(tài)更改會(huì)產(chǎn)生一條帶有時(shí)間戳的記錄,然后將這條以時(shí)間序列產(chǎn)生的記錄進(jìn)行保存。在面對非常大的存儲(chǔ)數(shù)據(jù)時(shí),可以使用這種方式來構(gòu)建非常優(yōu)秀的后端程序。\h1.7小結(jié)本章介紹了什么是消息隊(duì)列,并引出了Kafka的相關(guān)知識(shí)。分別介紹了Kafka的起源、基本概念、基本結(jié)構(gòu),以及使用范圍。通過本章的學(xué)習(xí),讀者可以對Kafka有了一個(gè)大概的了解,知道了Kafka在實(shí)際工作中能做哪些事情。\h第2章安裝及配置Kafka本章將介紹Kafka集群的安裝與配置,包含以下內(nèi)容:安裝與配置基礎(chǔ)環(huán)境、安裝Kafka集群、安裝與配置Kafka監(jiān)控工具、編譯Kafka源代碼,以及將Kafka源代碼導(dǎo)入代碼編輯器中等。其中涉及的實(shí)戰(zhàn)內(nèi)容并不復(fù)雜。\h2.1本章教學(xué)視頻說明視頻內(nèi)容:基礎(chǔ)環(huán)境的準(zhǔn)備、安裝Kafka集群、安裝與配置Kafka監(jiān)控工具、編譯Kafka源代碼,以及將Kafka源代碼導(dǎo)入代碼編輯器等。視頻時(shí)長:19分鐘。視頻截圖見圖2-1所示。圖2-1本章教學(xué)視頻截圖\h2.2安裝與配置基礎(chǔ)環(huán)境需安裝以下幾個(gè)軟件。1.Linux操作系統(tǒng)Kafka設(shè)計(jì)之初便是以Linux操作系統(tǒng)作為前提的,因此Linux操作系統(tǒng)能完美支持Kafka。本節(jié)以64位CentOS6.6為例。提示:CentOS(CommunityEnterpriseOperatingSystem,社區(qū)企業(yè)操作系統(tǒng))是Linux發(fā)行版之一。2.Java軟件開發(fā)工具包(JavaDevelopmentKit,JDK)Kafka的源代碼是利用Scala語言編寫的,它需要運(yùn)行在Java虛擬機(jī)(JavaVirtualMachine,JVM)上。因此,在安裝Kafka之前需要先安裝JDK。3.ZooKeeperKafka是一個(gè)分布式消息中間件系統(tǒng),它依賴ZooKeeper管理和協(xié)調(diào)Kafka集群的各個(gè)代理(Broker)節(jié)點(diǎn)。因此,在安裝Kafka集群之前需要先安裝ZooKeeper集群。在安裝CentOS、JDK、ZooKeeper之前,需要準(zhǔn)備好這些軟件的安裝包。安裝包選擇rpm或tar.gz類型均可。本書選擇的是64位操作系統(tǒng)下的tar.gz類型的安裝包,版本信息與下載地址見表2-1。表2-1版本信息與下載地址\h2.2.1安裝并配置Linux操作系統(tǒng)目前,市場上Linux操作系統(tǒng)的版本有很多,如RedHat、Ubuntu、CentOS等。讀者可以根據(jù)自己的喜好選取合適的Linux操作系統(tǒng),這對學(xué)習(xí)本書的影響不大。CentOS6.6安裝包下載界面如圖2-2所示。本書選擇64位CentOS6.6的鏡像文件進(jìn)行下載。圖2-2CentOS操作系統(tǒng)下載預(yù)覽提示:如果有現(xiàn)成的物理機(jī)或者云主機(jī)供學(xué)習(xí)使用,則可以跳過下面內(nèi)容,直接進(jìn)入2.2.2小節(jié)開始學(xué)習(xí)。如果是自行安裝虛擬機(jī)學(xué)習(xí)使用,則請繼續(xù)閱讀下面內(nèi)容。在Windows操作系統(tǒng)中,安裝Linux操作系統(tǒng)虛擬機(jī)可以使用VMware或VirtualBox。在Mac操作系統(tǒng)中,安裝Linux操作系統(tǒng)虛擬機(jī)可以使用ParallelsDesktop或VirtualBox。提示:無論在Windows操作系統(tǒng)中還是在Mac操作系統(tǒng)環(huán)境中,VirtualBox軟件都是免費(fèi)的。而VMware和ParallelsDesktop均屬于商業(yè)產(chǎn)品,用戶需要付費(fèi)使用。使用這些軟件安裝Linux操作系統(tǒng)虛擬機(jī),不涉及復(fù)雜的操作,均是直接單擊“下一步”按鈕,直到最后單擊“完成”按鈕。1.配置網(wǎng)絡(luò)安裝完Linux操作系統(tǒng)虛擬機(jī)后,如果虛擬機(jī)需要連接外網(wǎng),應(yīng)做一個(gè)簡單的網(wǎng)絡(luò)配置。具體操作命令如下:完成網(wǎng)絡(luò)配置后,重啟虛擬機(jī)使配置生效。具體操作命令如下:2.配置hosts系統(tǒng)文件這里安裝的是三臺(tái)Linux操作系統(tǒng)虛擬機(jī)。在其中一臺(tái)配置好主機(jī)的hosts文件,然后使用復(fù)制命令將該hosts文件分發(fā)到其他兩臺(tái)機(jī)器中。(1)在其中一個(gè)主機(jī)上配置hosts文件,具體操作命令如下:(2)使用Linux的復(fù)制命令分發(fā)文件。具體操作命令如下:(3)登錄到其他主機(jī),將/tmp目錄下的hosts文本文件復(fù)制到/etc目錄中。\h2.2.2實(shí)例1:安裝與配置Java運(yùn)行環(huán)境本書選擇的是Oracle官方的JDK8,版本號(hào)為8u144,如圖2-3所示。圖2-3JDK下載版本預(yù)覽提示:在學(xué)習(xí)本書時(shí),可能Oracle官方網(wǎng)站的JDK版本號(hào)又更新了,選擇其他版本號(hào)的JDK進(jìn)行下載也是可以的,這并不影響對本書內(nèi)容的學(xué)習(xí)。實(shí)例描述在Linux操作系中安裝JDK。其中涉及下載安裝包、解壓安裝包并配置、同步安裝包等操作。1.安裝JDK由于CentOS操作系統(tǒng)可能會(huì)自帶OpenJDK環(huán)境,所以,在安裝JDK之前,需要先檢查CentOS操作系統(tǒng)中是否存在OpenJDK環(huán)境。如存在,則需要先將其卸載。具體操作步驟如下。(1)卸載CentOS操作系統(tǒng)自帶JDK環(huán)境。如果不存在自帶的JDK環(huán)境,則可跳過此步驟。(2)將下載的JDK安裝包解壓縮到指定目錄下(可自行指定),詳細(xì)操作命令如下。2.配置JDK將JDK解壓縮到指定目錄后,需要配置JDK的全局環(huán)境變量,具體操作步驟如下。(1)添加JDK全局變量,具體操作命令如下。(2)若要使配置的內(nèi)容立即生效,則需要執(zhí)行以下命令。(3)驗(yàn)證JDK環(huán)境是否安裝成功,具體操作命令如下。如果操作系統(tǒng)終端顯示了對應(yīng)的JDK版本號(hào)(如圖2-4所示),則認(rèn)為JDK環(huán)境配置成功。圖2-4JDK打印版本信息3.同步安裝包將第一臺(tái)主機(jī)上解壓后的JDK文件夾和環(huán)境變量配置文件.bash_profile分別同步到其他兩個(gè)主機(jī)上。具體操作命令如下。\h2.2.3實(shí)例2:配置SSH免密碼登錄SecureShell簡稱SSH,由IETF的網(wǎng)絡(luò)小組所制定。SSH協(xié)議建立在應(yīng)用層基礎(chǔ)上,專為遠(yuǎn)程登錄會(huì)話和其他網(wǎng)絡(luò)服務(wù)提供安全性保障。提示:國際互聯(lián)網(wǎng)工程任務(wù)組(TheInternetEngineeringTaskForce,IETF)是一個(gè)公開性質(zhì)的大型民間國際團(tuán)體,匯集了大量與互聯(lián)網(wǎng)架構(gòu)和“互聯(lián)網(wǎng)正常運(yùn)作”相關(guān)的網(wǎng)絡(luò)設(shè)計(jì)者、運(yùn)營者、投資人及研究人員。1.了解SSH協(xié)議利用SSH協(xié)議可以有效地防止在遠(yuǎn)程管理過程中重要信息的泄露。SSH起初是UNIX操作系統(tǒng)上的一個(gè)應(yīng)用程序,后來擴(kuò)展到其他操作系統(tǒng)平臺(tái)。正確使用SSH協(xié)議可以彌補(bǔ)網(wǎng)絡(luò)中的漏洞。幾乎所有的UNIX平臺(tái)(例如Linux、AIX、Solaris)都可以運(yùn)行SSH客戶端。提示:AIX是IBM基于AT&TUnixSystemV開發(fā)的一套類似UNIX的操作系統(tǒng),可運(yùn)行在利用IBM專有的Power系列芯片設(shè)計(jì)的小型機(jī)上。Solaris是SunMicroSystems研發(fā)的計(jì)算機(jī)操作系統(tǒng),它是UNIX操作系統(tǒng)的衍生版本之一。在Windows、Linux和MacOS操作系統(tǒng)上的SSH客戶端,可以使用SSH協(xié)議登錄到Linux服務(wù)器。在SSH工具中輸入Linux服務(wù)器的用戶名和密碼,或者在Linux服務(wù)器中添加客戶端的公鑰來進(jìn)行登錄。登錄的流程如圖2-5所示。圖2-5SSH登錄2.配置SSH免密登錄在Kafka集群啟動(dòng)時(shí),實(shí)現(xiàn)三臺(tái)主機(jī)免密碼登錄。這里使用SSH來實(shí)現(xiàn)。實(shí)例描述在Linux操作系統(tǒng)中配置SSH免密登錄,涉及創(chuàng)建密鑰、認(rèn)證授權(quán)、文件賦權(quán)等操作。具體操作步驟如下:(1)創(chuàng)建密鑰。在Linux操作系統(tǒng)中,使用ssh-keygen命令來創(chuàng)建密鑰文件,具體操作命令如下。接下來只需按Enter鍵,不用設(shè)置任何信息。命令操作結(jié)束后會(huì)在/home/hadoop/.ssh/目錄下生成對應(yīng)的私鑰和公鑰等文件。(2)認(rèn)證授權(quán)。將公鑰(id_rsa.pub)文件中的內(nèi)容追加到authorized_keys文件中,具體操作命令如下。(3)文件賦權(quán)。在當(dāng)前賬號(hào)下,需要給authorized_keys文件賦予600權(quán)限,否則會(huì)因?yàn)闄?quán)限限制導(dǎo)致登錄失敗。文件權(quán)限操作命令如下。(4)在其他節(jié)點(diǎn)上創(chuàng)建密鑰。在Kafka集群的其他節(jié)點(diǎn)下,使用ssh-keygen-trsa命令生成對應(yīng)的公鑰。然后在第一臺(tái)主機(jī)上使用Linux同步命令將authorized_keys文件分發(fā)到其他節(jié)點(diǎn)的/home/hadoop/.ssh/目錄中。詳細(xì)操作命令如下。提示:如果在登錄過程中系統(tǒng)沒有提示輸入密碼,即表示免密碼登錄配置成功。反之,則配置失敗。讀者需核對配置步驟是否和本書一致。為了方便維護(hù)集群,通常在所有主機(jī)中選擇一臺(tái)主機(jī)作為“管理者”,讓其負(fù)責(zé)下發(fā)配置文件。這臺(tái)主機(jī)與其他主機(jī)之間的免密關(guān)系如圖2-6所示。圖2-6SSH免密關(guān)系在維護(hù)集群(例如執(zhí)行啟動(dòng)、查看狀態(tài)、停止等操作)時(shí),通常在擁有“管理者”權(quán)限的主機(jī)上執(zhí)行批處理腳本。\h2.2.4實(shí)例3:安裝與配置ZookeeperZookeeper是一個(gè)分布式應(yīng)用程序協(xié)調(diào)服務(wù)系統(tǒng),是大數(shù)據(jù)生態(tài)圈的重要組件。Kafka、Hadoop、HBase等系統(tǒng)均依賴Zookeeper來提供一致性服務(wù)。Zookeeper是將復(fù)雜且容易出錯(cuò)的核心服務(wù)進(jìn)行封裝,然后對外提供簡單易用、高效穩(wěn)定的接口。實(shí)例描述Zookeeper安裝涉及下載軟件包、配置Zookeeper系統(tǒng)文件、配置環(huán)境變量、啟動(dòng)Zookeeper等操作。1.安裝Zookeeper(1)下載Zookeeper軟件包。按表2-1中的地址下載3.4.6版本安裝包,然后將其解壓到指定位置。本書所有的安裝包都會(huì)被解壓到/data/soft/new目錄下。(2)解壓軟件包。對Zookeeper軟件包進(jìn)行解壓和重命名,具體操作命令如下:2.配置Zookeeper系統(tǒng)文件(1)配置zoo.cfg文件。在啟動(dòng)Zookeeper集群之前,需要配置Zookeeper集群信息。讀者可以將Zookeeper安裝目錄下的示例配置文件重命名,即,將zoo_sample.cfg修改為zoo.cfg。按如下所示編輯zoo.cfg文件。(2)配置注意事項(xiàng)。在配置的dataDir目錄下創(chuàng)建一個(gè)myid文件,該文件里面寫入一個(gè)0~255的整數(shù),每個(gè)Zookeeper節(jié)點(diǎn)上這個(gè)文件中的數(shù)字要是唯一的。本書的這些數(shù)字是從1開始的,依次對應(yīng)每個(gè)Kafka節(jié)點(diǎn)。主機(jī)與代理節(jié)點(diǎn)(Broker)的對應(yīng)關(guān)系如圖2-7所示。圖2-7主機(jī)與代理節(jié)點(diǎn)(Broker)的對應(yīng)關(guān)系(3)操作細(xì)節(jié)。文件中的數(shù)字要與DataNode節(jié)點(diǎn)下的Zookeeper配置的數(shù)字保持一致。例如,server.1=dn1:2888:3888,則dn1主機(jī)下的myid配置文件應(yīng)該填寫數(shù)字1。在dn1主機(jī)上配置好ZooKeeper環(huán)境后,可使用scp命令將其傳輸?shù)狡渌?jié)點(diǎn),具體命令如下。完成文件傳輸后,dn2主機(jī)和dn3主機(jī)上的myid文件中的數(shù)字分別被修改為2和3。3.配置環(huán)境變量在Linux操作系統(tǒng)中,可以對Zookeeper做全局的環(huán)境變量配置。這樣做的好處是,可以很方便地使用Zookeeper腳本,不用切換到Zookeeper的bin目錄下再操作。具體操作命令如下。之后,用以下命令使剛剛配置的環(huán)境變量立即生效:接著,在其他兩臺(tái)主機(jī)上也做相同的配置操作。4.啟動(dòng)Zookeeper在安裝了Zookeeper的節(jié)點(diǎn)上,分別執(zhí)行啟動(dòng)進(jìn)程的命令:但這樣管理起來不夠方便??梢詫ι鲜鰡?dòng)命令進(jìn)行改進(jìn),例如編寫一個(gè)分布式啟動(dòng)腳本(zk-daemons.sh),具體如下:5.驗(yàn)證完成啟動(dòng)命令后,在終端中輸入jps命令。若顯示QuorumPeerMain進(jìn)程名稱,即表示服務(wù)進(jìn)程啟動(dòng)成功。也可以使用Zookeeper的狀態(tài)命令status來查看,具體操作命令如下。結(jié)果如圖2-8所示。在Zookeeper集群運(yùn)行正常的情況下,若有三個(gè)節(jié)點(diǎn),則會(huì)選舉出一個(gè)Leader和兩個(gè)Follower。圖2-8進(jìn)程狀態(tài)預(yù)覽結(jié)果提示:讀者也可以查看Zookeeper的運(yùn)行日志zookeeper.out文件,其中記錄了Zookeeper的啟動(dòng)過程以及運(yùn)行過程。\h2.3實(shí)例4:部署Kafka安裝Kafka比較簡單,單機(jī)模式和分布式模式的部署步驟基本一致。由于生產(chǎn)環(huán)境所使用的操作系統(tǒng)一般是Linux,所以本書Kafka集群的部署也是基于Linux操作系統(tǒng)來完成的。實(shí)例描述:按兩種模式部署(單機(jī)模式部署和分布式模式)Kafka系統(tǒng),并觀察結(jié)果。\h2.3.1單機(jī)模式部署如果是測試環(huán)境或需要在本地調(diào)試Kafka應(yīng)用程序代碼,則會(huì)以單機(jī)模式部署一個(gè)Kafka系統(tǒng)。部署的步驟也非常簡單:啟動(dòng)一個(gè)Standalone模式的Zookeeper,然后啟動(dòng)一個(gè)KafkaBroker進(jìn)程。提示:本書選擇的Kafka安裝包版本是,讀者在學(xué)習(xí)本書時(shí),Kafka官方可能發(fā)布了更新的版本。讀者可以選擇更新的版本來安裝,其配置過程依然可以參考本書所介紹的,這并不影響對本書的學(xué)習(xí)。1.下載Kafka安裝包訪問Kafka官方網(wǎng)站,找到下載地址,然后在Linux操作系統(tǒng)中使用wget命令進(jìn)行下載。具體操作命令如下。2.解壓Kafka安裝包下載了Kafka安裝包后,在Linux操作系統(tǒng)指定位置進(jìn)行解壓操作。具體操作命令如下。3.配置Kafka全局變量在/home/hadoop/.bash_profile文件中,配置Kafka系統(tǒng)的全局變量。具體操作命令如下。接著,使用source命令使剛剛配置的環(huán)境變量立即生效:4.配置Kafka系統(tǒng)配置單機(jī)模式的Kafka系統(tǒng)步驟比較簡單,只需要在$KAFKA_HOME/conf/perties文件中做少量的配置即可。具體操作命令如下。5.啟動(dòng)Zookeeper以Standalone模式啟動(dòng)Zookeeper進(jìn)程,具體操作命令如下。6.啟動(dòng)Kafka單機(jī)模式在當(dāng)前主機(jī)上使用Kafka命令來啟動(dòng)Kafka系統(tǒng),具體操作命令如下。啟動(dòng)成功后,終端會(huì)打印出如圖2-9所示信息。圖2-9Kafka啟動(dòng)信息\h2.3.2分布式模式部署在生產(chǎn)環(huán)境中,一般會(huì)以分布式模式來部署Kafka系統(tǒng),以便組建集群。在分布式模式中,不推薦使用Standalone模式的Zookeeper,這樣具有一定的風(fēng)險(xiǎn)。如果使用的是Standalone模式的Zookeeper,則一旦Zookeeper出現(xiàn)故障則導(dǎo)致整個(gè)Kafka集群不可用。所以,一般在生產(chǎn)環(huán)境中會(huì)以集群的形式來部署ZooKeeper。1.下載和單機(jī)模式的下載步驟一致。2.解壓可參考單機(jī)模式的解壓模式和重命名方法。3.配置Kafka全局變量可參考單機(jī)模式的全局配置過程。4.配置Kafka系統(tǒng)在分布式模式下配置Kafka系統(tǒng)和單機(jī)模式不一致。打開$KAFKA_HOME/conf/server.properties文件,編輯相關(guān)屬性,具體修改內(nèi)容見代碼2-1。代碼2-1Kafka系統(tǒng)屬性文件配置5.同步安裝包配置好一個(gè)主機(jī)上的Kafka系統(tǒng)后,使用Linux同步命令將配置好的Kafka文件夾同步到其他的主機(jī)上。具體操作命令如下。由于Kafka集群中每個(gè)代理(Broker)節(jié)點(diǎn)的ID必須唯一,所以同步完成后需要將其他兩臺(tái)主機(jī)上的broker.id屬性值修改為1和2(或者是其他不重復(fù)的正整數(shù))。6.啟動(dòng)Zookeeper集群在啟動(dòng)Kafka集群之前,需要先啟動(dòng)Zookeeper集群。啟動(dòng)Zookeeper集群無須在每臺(tái)主機(jī)上分別執(zhí)行Zookeeper啟動(dòng)命令,只需執(zhí)行分布式啟動(dòng)命令即可:7.啟動(dòng)Kafka集群Kafka系統(tǒng)本身沒有分布式啟動(dòng)Kafka集群的功能,只有單個(gè)主機(jī)節(jié)點(diǎn)啟動(dòng)Kafka進(jìn)程的腳本??梢酝ㄟ^封裝單個(gè)節(jié)點(diǎn)啟動(dòng)Kafka進(jìn)程的步驟,來實(shí)現(xiàn)分布式啟動(dòng)Kafka集群,具體見代碼2-2。代碼2-2Kafka分布式啟動(dòng)8.驗(yàn)證啟動(dòng)Kafka集群后,可以通過一些簡單的Kafka命令來驗(yàn)證集群是否正常。具體如下。執(zhí)行后,Linux終端會(huì)打印出所有的Kafka主題(Topic)名稱,如圖2-10所示。圖2-10Kafka主題(Topic)名稱預(yù)覽從圖2-10中可以看出,除打印Kafka業(yè)務(wù)數(shù)據(jù)的主題(Topic)名稱外,還打印出Kafka系統(tǒng)內(nèi)部主題——__consumer_offsets,該主題用來記錄Kafka消費(fèi)者(Consumer)產(chǎn)生的消費(fèi)記錄,其中包含偏移量(Offset)、時(shí)間戳(Timestamp)和線程名等信息。提示:這里讀者有一個(gè)大致的了解即可,后面的章會(huì)詳細(xì)介紹Kafka系統(tǒng)的內(nèi)部主題。\h2.4實(shí)例5:安裝與配置Kafka監(jiān)控工具在實(shí)際業(yè)務(wù)場景中,需要頻繁關(guān)注Kafka集群的運(yùn)行情況。例如,查看集群的代理(Broker)節(jié)點(diǎn)健康狀態(tài)、主題(Topic)列表、消費(fèi)組(ConsumerGroup)列表、每個(gè)主題所對應(yīng)的分區(qū)(Partition)列表等。當(dāng)業(yè)務(wù)場景并不復(fù)雜時(shí),可以使用Kafka提供的命令工具,配合Zookeeper客戶端命令來快速地實(shí)現(xiàn)。但是,隨著業(yè)務(wù)場景的復(fù)雜化,消費(fèi)組和主題的增加,再使用Kafka和Zookeeper命令監(jiān)控則會(huì)增加維護(hù)的成本,這時(shí)Kafka監(jiān)控系統(tǒng)便顯得尤為重要。實(shí)例描述在Github開源社區(qū)中下載KafkaEagle源代碼,編譯獲取安裝包,然后執(zhí)行安裝步驟,并觀察執(zhí)行結(jié)果。\h2.4.1獲取并編譯KafkaEagle源代碼KafkaEagle監(jiān)控系統(tǒng)的源代碼托管在Github上。1.下載打開瀏覽器,輸入“”進(jìn)入Github官網(wǎng),然后搜索“KafkaEagle”關(guān)鍵字,獲取具體下載地址為/smartloli/kafka-eagle。然后直接單擊“Cloneordownload”按鈕進(jìn)行下載,將下載的kafka-eagle-master.zip文件上傳到Linux服務(wù)器中。提示:也可以在Linux服務(wù)器上執(zhí)行以下Git命令下載KafkaEagle源代碼:[hadoop@dn1~]$gitclone/smartloli/kafka-eagle2.編譯KafkaEagle是用Java語言開發(fā)的,通過Maven構(gòu)建。Maven是對Java語言進(jìn)行編譯的一個(gè)工具。截止到本書編寫完時(shí),KafkaEagle發(fā)布了1.2.1版本,支持在Mac、Linux和Windows環(huán)境下運(yùn)行,同時(shí)兼容Kafka-0.8.x、Kafka-0.9.x、Kafka-0.10.x和Kafka-1.0.x及以上版本。KafkaEagle源代碼編譯在MacOS、Linux和Windows環(huán)境下均可操作。這里以MacOS環(huán)境來演示,具體操作命令如下。編譯成功后,會(huì)在kafka-egale/kafka-eagle-web/target目錄中生成打包好的壓縮文件,編譯結(jié)果如圖2-11所示。圖2-11編譯KafkaEagle的結(jié)果\h2.4.2安裝與配置KafkaEagle1.解壓縮安裝并重命名將編譯好的kafka-eagle-web-1.2.1-bin.tar.gz安裝包進(jìn)行解壓縮安裝并重命名:2.配置環(huán)境變量在.bash_profile文件中配置KE_HOME環(huán)境變量:然后使用source命令使配置的環(huán)境變量立即生效:3.配置KafkaEagle系統(tǒng)文件進(jìn)入$KE_HOME/conf目錄中,編輯perties配置文件,配置內(nèi)容見代碼2-3。代碼2-3KafkaEagle配置文件4.啟動(dòng)KafkaEagle系統(tǒng)配置完成后,在Linux控制臺(tái)執(zhí)行啟動(dòng)命令:啟動(dòng)成功后,控制臺(tái)會(huì)打印出對應(yīng)的日志信息,如圖2-12所示。圖2-12啟動(dòng)KafkaEagle系統(tǒng)控制臺(tái)日志中顯示了一個(gè)用戶名為admin、密碼為123456的賬號(hào),可用于登錄系統(tǒng)。5.預(yù)覽(1)在瀏覽器中輸入http://dn1:8048/ke,訪問KafkaEagle系統(tǒng),之后按要求輸入用戶名和密碼,如圖2-13所示。輸入正確的用戶名和密碼后單擊“Signin”按鈕。圖2-13KafkaEagle登錄界面(2)進(jìn)入KafkaEagle系統(tǒng)主界面中,如圖2-14所示。圖2-14KafkaEagle主界面6.停止KafkaEagle系統(tǒng)停止KafkaEagle系統(tǒng)的方式有兩種:①通過執(zhí)行$KE_HOME/bin/ke.sh腳本來停止;②通過Linux操作系統(tǒng)的kill命令來直接停止。(1)通過指定stop參數(shù)來停止KafkaEagle系統(tǒng):(2)通過Linux操作系統(tǒng)的kill命令停止KafkaEagle系統(tǒng):\h2.5實(shí)例6:編譯Kafka源代碼在學(xué)習(xí)Kafka技術(shù)時(shí),閱讀Kafka的源代碼是很有必要的。在實(shí)際生產(chǎn)環(huán)境中,Kafka系統(tǒng)可能會(huì)隨業(yè)務(wù)場景的復(fù)雜化、數(shù)據(jù)量的增加等出現(xiàn)異常,要修復(fù)這類異常問題則需要打補(bǔ)丁,然后重新編譯Kafka源代碼。本節(jié)將介紹在MacOS操作系統(tǒng)下編譯Kafka源代碼。在其他操作系統(tǒng)中,編譯Kafka源代碼的過程基本類似,只不過是環(huán)境變量配置有所區(qū)別。Kafka系統(tǒng)的核心模塊是使用Scala語言編寫的,所以,可以使用Gradle工具進(jìn)行編譯和構(gòu)建。實(shí)例描述編譯Kafka源代碼需要準(zhǔn)備如下環(huán)境:(1)安裝與配置Scala運(yùn)行環(huán)境;(2)安裝與配置Gradle。同時(shí),執(zhí)行2.5.3小節(jié)的編譯步驟,觀察執(zhí)行結(jié)果。\h2.5.1安裝與配置Scala運(yùn)行環(huán)境本書所使用的Kafka版本是,從Kafka官方網(wǎng)站可知,該版本所需要的Scala版本在2.10以上。本書中所選擇的Kafka安裝包是kafka_2.11-.tgz,所以,這里選擇最新的Scala-2.12版本進(jìn)行安裝與配置,如圖2-15所示。圖2-15Kafka系統(tǒng)依賴的Scala版本1.下載Scala安裝包訪問Scala官方網(wǎng)站,獲取軟件包下載地址:/download,然后選擇對應(yīng)的安裝包進(jìn)行下載,如圖2-16所示圖2-16下載Scala安裝包2.安裝Scala下載完成后,將Scala安裝包解壓縮到指定目錄進(jìn)行安裝,具體操作命令如下。3.配置Scala環(huán)境變量完成安裝后,在.bash_profile文件中配置Scala運(yùn)行環(huán)境變量,具體操作命令如下。然后用source命令使配置的環(huán)境變量立即生效,具體操作命令如下。4.驗(yàn)證安裝與配置好Scala環(huán)境后,在操作系統(tǒng)終端中輸入Scala命令來驗(yàn)證環(huán)境是否配置成功。具體操作命令如下。如打印出如圖2-17所示的信息,則表示安裝與配置成功。圖2-17Scala版本信息\h2.5.2安裝與配置Gradle通過瀏覽器訪問Gradle的官方地址/install,獲取MacOS操作系統(tǒng)安裝與配置Gradle的方法。通過以下命令可以一鍵完成Gradle的安裝與配置。安裝與配置完成后,在操作系統(tǒng)終端中輸入以下Gradle命令來進(jìn)行版本驗(yàn)證。如打印出如圖2-18所示的信息,則表示安裝與配置成功。圖2-18Gradle版本信息\h2.5.3了解Kafka源代碼的編譯過程訪問Kafka官網(wǎng)地址/downloads下載Kafka源代碼壓縮包。本書使用的Kafka版本是kafka-,這里選擇kafka--src.tgz壓縮包。將下載的Kafka源代碼解壓到MacOS操作系統(tǒng)的指定目錄,Kafka源代碼目錄結(jié)構(gòu)如圖2-19所示。圖2-19Kafka源代碼目錄結(jié)構(gòu)1.離線下載依賴包如果編譯環(huán)境網(wǎng)絡(luò)狀況不好,則在執(zhí)行編譯命令之前可以先下載核心依賴包gradle-3.3-all.zip,然后再將它移到gradle/wrapper/目錄中,最后修改gradle/wrapper/perties。具體修改內(nèi)容見代碼2-4。代碼2-4修改編譯配置文件提示:gradle-3.3-all.zip包的下載地址為/distributions。2.在線編譯Kafka源代碼如果編譯網(wǎng)絡(luò)環(huán)境狀態(tài)良好,則無需配置任何配置文件,直接執(zhí)行以下編譯命令即可。成功執(zhí)行上述編譯命令后,會(huì)自動(dòng)下載gradle-3.3-bin.zip依賴包,下載完成后會(huì)存放在/Users/dengjie/.gradle/wrapper/dists目錄中。下載過程所需的時(shí)間,完全取決于當(dāng)時(shí)的網(wǎng)絡(luò)狀況。編譯成功后,操作系統(tǒng)控制臺(tái)會(huì)打印出如圖2-20所示的信息。圖2-20成功編譯Kafka源代碼編譯之后的Kafka二進(jìn)制壓縮包文件,會(huì)自動(dòng)存放在core/build/distributions目錄中。這里的壓縮包文件和在Kafka官網(wǎng)上提供的一樣,讀者可以直接使用編譯好的Kafka安裝包。\h2.6實(shí)例7:將Kafka源代碼導(dǎo)入編輯器在實(shí)際應(yīng)用場景中,可能會(huì)遇到一些Kafka異常問題,需要閱讀Kafka源代碼來分析異常問題產(chǎn)生的原因。如果直接打開Kafka源代碼查看,則閱讀起來會(huì)很不方便,所以需要借助代碼編輯器來閱讀Kafka源代碼。這里列舉兩種常見的代碼編輯器——IntelliJIDEA和Eclipse??梢酝ㄟ^訪問各自的官方網(wǎng)站來獲取軟件安裝包,其下載地址見表2-2。表2-2代碼編輯器下載地址實(shí)例描述從表2-2中獲取編輯器安裝包,按照下列兩種情況將Kafka源代碼導(dǎo)入:(1)在IntelliJIDEA編輯器中導(dǎo)入Kafka源代碼;(2)在Eclipse編輯器中導(dǎo)入Kafka源代碼。\h2.6.1導(dǎo)入IntelliJIDEA編輯器IntelliJIDEA簡稱IDEA,是Java語言開發(fā)的集成環(huán)境。它在智能代碼提示、重構(gòu)、版本控制工具(如Git、SVN等)、代碼分析等方面的功能非常完善。IDEA是JetBrains公司的產(chǎn)品,目前分為旗艦版和社區(qū)版?!衿炫灠姘泄δ埽切枰顿M(fèi)購買;●社區(qū)版屬于免費(fèi)產(chǎn)品,功能較少,但對于閱讀Kafka源代碼來說已足夠了。1.將Kafka源代碼轉(zhuǎn)成IDEA結(jié)構(gòu)Kafka源代碼中提供了Gradle工具,可以很方便地將Kafka源代碼轉(zhuǎn)換成IDEA結(jié)構(gòu)。只需執(zhí)行一條轉(zhuǎn)換命令即可,具體操作命令如下。執(zhí)行命令后,如果轉(zhuǎn)換成功,則控制臺(tái)會(huì)打印出如圖2-21所示的信息。圖2-21轉(zhuǎn)成IDEA結(jié)構(gòu)之后,在Kafka源代碼目錄會(huì)生產(chǎn)三個(gè)文件——kafka.iml、kafka.iws和kafka.ipr,如圖2-22所示。圖2-22IDEA結(jié)構(gòu)文件2.導(dǎo)入Kafka代碼打開IDEA社區(qū)版代碼編輯器,然后選擇菜單“File”-“Open”命令,在彈出的對話框中選中Kafka源代碼目錄并單擊“Open”按鈕,彈出如圖2-23所示對話框供用戶選擇。圖2-23IDEA代碼編輯器對話框單擊“NewWindow”按鈕,表示重新在一個(gè)新的IDEA編輯器窗口中導(dǎo)入Kafka源代碼。之后等待代碼編輯器自動(dòng)下載需要的依賴包。初始化完成后會(huì)出現(xiàn)如圖2-24所示的結(jié)果。圖2-24IDEA完成代碼導(dǎo)入\h2.6.2導(dǎo)入Eclipse編輯器Eclipse是一款著名的跨平臺(tái)開源集成開發(fā)環(huán)境,最開始主要用于Java語言開發(fā)。通過安裝不同的插件,Eclipse可以支持不同的計(jì)算機(jī)編程語言,比如Scala、C++、

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論