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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論