ID:-
結(jié)合的常見(jiàn)應(yīng)用需求,我們從生態(tài)鏈中選取了一些重要技術(shù)和實(shí)現(xiàn)方法。用于支撐的平臺(tái)可采用如圖1所示的架構(gòu)模式。
圖1 大數(shù)據(jù)生態(tài)鏈的網(wǎng)絡(luò)安全態(tài)勢(shì)感知應(yīng)用架構(gòu)
的核心就是從大量數(shù)據(jù)中挖掘出價(jià)值,而我們的首要工作就是要明確有哪些數(shù)據(jù)以及怎樣采集。
在計(jì)算機(jī)信息系統(tǒng)中,一般按照形態(tài)的不同可將數(shù)據(jù)分為結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。結(jié)構(gòu)化數(shù)據(jù)的特點(diǎn)是結(jié)構(gòu)固定,每個(gè)字段都有特定的語(yǔ)義和長(zhǎng)度,可用二維表結(jié)構(gòu)來(lái)邏輯表達(dá)實(shí)現(xiàn),領(lǐng)域常見(jiàn)的這類數(shù)據(jù)包括報(bào)警、事件日志、數(shù)據(jù)、摘要分析結(jié)構(gòu)化描述記錄以及各種相關(guān)的信息。非結(jié)構(gòu)化數(shù)據(jù)是不規(guī)則或不完整的數(shù)據(jù),其特點(diǎn)是格式非常多樣,不方便用二維邏輯表來(lái)表現(xiàn),需要先對(duì)數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換或信息提取,領(lǐng)域常見(jiàn)的這類數(shù)據(jù)包括各類辦公文檔、文本、報(bào)表、HTML、XML、聲音、圖像文件等。
在應(yīng)用中,按照應(yīng)用場(chǎng)景計(jì)算需求的不同可將分為靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)(流式數(shù)據(jù))。靜態(tài)數(shù)據(jù)就像水庫(kù)里的水一樣,看上去靜止不動(dòng),很多數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)存儲(chǔ)的就是這類數(shù)據(jù);這些數(shù)據(jù)一般來(lái)自不同數(shù)據(jù)源,利用ETL工具加載到數(shù)據(jù)倉(cāng)庫(kù)中,也一般不會(huì)更新,技術(shù)人員可利用數(shù)據(jù)挖掘和OLAP分析工具從這些靜態(tài)數(shù)據(jù)中發(fā)現(xiàn)價(jià)值。動(dòng)態(tài)數(shù)據(jù)也就是流式數(shù)據(jù),是一組順序、大量、快速、連續(xù)到達(dá)的數(shù)據(jù)序列,被視為一個(gè)隨時(shí)間延續(xù)而無(wú)限增長(zhǎng)的動(dòng)態(tài)數(shù)據(jù)集合。它像流水一樣,不是一次過(guò)來(lái)而是一點(diǎn)一點(diǎn)“流”過(guò)來(lái),處理流式數(shù)據(jù)時(shí)也是一點(diǎn)一點(diǎn)處理,因?yàn)槿绻渴盏綌?shù)據(jù)后再處理會(huì)有較大延遲,消耗大量?jī)?nèi)存,如對(duì)PM2.5的監(jiān)測(cè),因?yàn)樾枰獙?shí)時(shí)顯示空氣質(zhì)量情況,監(jiān)測(cè)系統(tǒng)會(huì)對(duì)數(shù)據(jù)源源不斷地回傳并進(jìn)行實(shí)時(shí)分析,預(yù)判空氣質(zhì)量變化趨勢(shì)。
在的應(yīng)用中,按照數(shù)據(jù)來(lái)源和特點(diǎn)可以將數(shù)據(jù)分為四類。一是環(huán)境業(yè)務(wù)類數(shù)據(jù),主要包括被感知環(huán)境中的各類資產(chǎn)和屬性;二是網(wǎng)絡(luò)層面數(shù)據(jù),主要包括包捕獲數(shù)據(jù)、會(huì)話或流數(shù)據(jù)、包字符串?dāng)?shù)據(jù);三是層面日志數(shù)據(jù),包括各種系統(tǒng)、應(yīng)用所產(chǎn)生的日志數(shù)據(jù)等;四是告警數(shù)據(jù),通常來(lái)自、等安全設(shè)備或軟件的報(bào)警信息。當(dāng)然,如果對(duì)涉及的重要數(shù)據(jù)進(jìn)行羅列,大致可以包括以下類型:完整內(nèi)容數(shù)據(jù)、提取內(nèi)容數(shù)據(jù)、會(huì)話數(shù)據(jù)、統(tǒng)計(jì)數(shù)據(jù)、元數(shù)據(jù)、日志數(shù)據(jù)和告警數(shù)據(jù)等。
對(duì)于不同類型、不同來(lái)源的數(shù)據(jù),我們采用的數(shù)據(jù)采集方法也是不盡相同的。總的來(lái)說(shuō)可分為主動(dòng)式采集和被動(dòng)式采集。其中與平臺(tái)關(guān)聯(lián)性較強(qiáng)的技術(shù)和方法主要有以下幾種:
● 傳感器
● 網(wǎng)絡(luò)爬蟲(chóng)
● 日志收集系統(tǒng)
● 數(shù)據(jù)抽取工具
● 分布式消息隊(duì)列系統(tǒng)
1、傳感器
傳感器()俗稱探針,以軟件和硬件的形式安裝在網(wǎng)絡(luò)中,用于采集和發(fā)送數(shù)據(jù),以及監(jiān)控網(wǎng)段內(nèi)各類資產(chǎn)的信息,它工作在網(wǎng)卡的嗅探模式。比較常見(jiàn)的情況是,一個(gè)傳感器是由代理和插件所共同構(gòu)成的具有網(wǎng)絡(luò)行為監(jiān)控功能的組合。傳感器的功能主要包括數(shù)據(jù)采集、、、異常檢測(cè)、協(xié)議識(shí)別等。
根據(jù)放置的位置不同,可將傳感器分為內(nèi)置型和外置型。前者一般部署在、等網(wǎng)絡(luò)設(shè)備中以直接采集數(shù)據(jù),大部分現(xiàn)代企業(yè)級(jí)和都能配置成傳感器,并可以通過(guò)網(wǎng)絡(luò)將所采集的數(shù)據(jù)導(dǎo)出來(lái),當(dāng)然也可以將許多開(kāi)源的工具軟件安裝在硬件上并配置成傳感器。后者即各種網(wǎng)絡(luò)設(shè)備已經(jīng)部署完畢,無(wú)法移動(dòng)原有網(wǎng)絡(luò),需要外置部署,往往與線纜、網(wǎng)絡(luò)分路器、匯聚和探針配合使用。
根據(jù)網(wǎng)絡(luò)規(guī)模的大小及其所面臨的威脅類型,傳感器有著不同的作用和類型,如表1所示。
表1 傳感器類型
有的傳感器只需將采集到的數(shù)據(jù)記錄在磁盤(pán)上,有時(shí)會(huì)基于已采集的數(shù)據(jù)再生成其他數(shù)據(jù),這種類型的傳感器功能簡(jiǎn)單,屬于輕量化的傳感器,通常沒(méi)有額外安裝的插件。有的傳感器則不僅需要采集數(shù)據(jù),還需要執(zhí)行檢測(cè)任務(wù),當(dāng)需要分析數(shù)據(jù)時(shí)會(huì)把數(shù)據(jù)“拉”到分析設(shè)備上進(jìn)行,而非在傳感器上,這種傳感器最為常見(jiàn),即帶有一定檢測(cè)能力的傳感器。還有一種類型的傳感器,其功能十分強(qiáng)大,集采集、檢測(cè)和分析理解于一身,這種傳感器除了配備采集和檢測(cè)工具之外,還會(huì)安裝一些分析插件,其好處是節(jié)約硬件資源,但缺點(diǎn)是容易因?yàn)閷?duì)數(shù)據(jù)進(jìn)行了不恰當(dāng)?shù)奶幚矶鴮?dǎo)致一些重要數(shù)據(jù)的損失。畢竟機(jī)器的分析能力有限,還是需要一些人工輔助,才能更好地進(jìn)行。
在這三種類型的傳感器中,第二種傳感器最為常見(jiàn),也是優(yōu)先推薦的類型。因?yàn)閮H僅采集數(shù)據(jù)的傳感器的功能確實(shí)過(guò)于單一有限,而集采集、檢測(cè)和分析于一體的傳感器又容易造成數(shù)據(jù)的缺失和分析能力的受限。兼具采集和檢測(cè)功能是傳感器較為有效且合理的功能設(shè)置,更安全且更有保障,對(duì)數(shù)據(jù)進(jìn)行檢測(cè)后再提交給平臺(tái),也方便平臺(tái)以及安全管理人員進(jìn)行進(jìn)一步的深度分析理解。
由于傳感器主要負(fù)責(zé)截取數(shù)據(jù),因此需要具有較好的數(shù)據(jù)轉(zhuǎn)發(fā)能力和較高的容量。為了對(duì)數(shù)據(jù)進(jìn)行檢測(cè)和解析處理,傳感器還應(yīng)具備一定的端口檢測(cè)能力,對(duì)于一些高級(jí)的傳感器還可增加自動(dòng)學(xué)習(xí)并識(shí)別高層次協(xié)議的能力,即協(xié)議智能識(shí)別能力。總之,根據(jù)我們的實(shí)際需要,選擇并設(shè)計(jì)合適的傳感器進(jìn)行數(shù)據(jù)采集。
2、網(wǎng)絡(luò)爬蟲(chóng)
隨著的迅速發(fā)展,產(chǎn)生了大量的信息,如何獲取并利用這些海量信息成為一個(gè)重要問(wèn)題,于是應(yīng)運(yùn)而生。(Web )又常稱為網(wǎng)頁(yè)蜘蛛、網(wǎng)絡(luò)機(jī)器人、網(wǎng)絡(luò)鏟,它是一種按照一定規(guī)則自動(dòng)抓取萬(wàn)維網(wǎng)信息的程序或者腳本。其行為一般是先“爬”到對(duì)應(yīng)的網(wǎng)頁(yè)上,再把需要的信息“鏟”下來(lái),它比普通的網(wǎng)絡(luò)搜索引擎(比如百度、谷歌)更具有針對(duì)性、更精準(zhǔn),能定向抓取相關(guān)網(wǎng)頁(yè)資源。當(dāng)然,其也可以作為搜索引擎抓取系統(tǒng)的重要組成部分。
(1)網(wǎng)絡(luò)爬蟲(chóng)的工作原理
簡(jiǎn)單的能夠從一個(gè)或若干個(gè)網(wǎng)頁(yè)的URL(統(tǒng)一資源定位符)開(kāi)始,獲得初始網(wǎng)頁(yè)上的URL,在抓取網(wǎng)頁(yè)的過(guò)程中不斷從當(dāng)前頁(yè)面上抽取新的URL放入隊(duì)列,直到滿足一定停止條件。復(fù)雜一些的能夠根據(jù)一定的網(wǎng)頁(yè)分析,過(guò)濾與主題無(wú)關(guān)的鏈接,只保留有用的鏈接,并將其放入等待抓取的URL隊(duì)列中,然后根據(jù)一定的搜索策略從隊(duì)列中選擇下一步要抓取的網(wǎng)頁(yè)URL并重復(fù)上述過(guò)程,直到達(dá)到系統(tǒng)的某一條件時(shí)停止。所有被抓取的網(wǎng)頁(yè)將會(huì)被系統(tǒng)存儲(chǔ),并進(jìn)行一定的分析、過(guò)濾,最后建立索引硬件信息收集 腳本,以便之后的查詢和檢索。一個(gè)通用的工作流程框架如圖2所示。
圖2 網(wǎng)絡(luò)爬蟲(chóng)工作流程
● 首先選取一部分種子URL。
● 然后將這些URL放入待抓取URL隊(duì)列中。
● 從待抓取URL隊(duì)列中取出待抓取的URL,解析其,獲得IP,將URL對(duì)應(yīng)的網(wǎng)頁(yè)下載下來(lái),存儲(chǔ)到已下載網(wǎng)頁(yè)庫(kù)中,并將這些URL放入已抓取URL隊(duì)列。
● 分析已抓取到的網(wǎng)頁(yè)內(nèi)容中的其他URL,再將這些URL放入待抓取URL隊(duì)列中,進(jìn)入下一個(gè)循環(huán)過(guò)程。
(2)網(wǎng)絡(luò)爬蟲(chóng)的類型結(jié)構(gòu)
已逐漸成為人們主動(dòng)獲取萬(wàn)維網(wǎng)上信息的重要方式,其種類多樣、可性強(qiáng)。按照系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)技術(shù),大致可分為以下幾種類型:通用、聚焦、增量式、深層等。在現(xiàn)實(shí)中,抓取系統(tǒng)往往是一個(gè)分布式的三層結(jié)構(gòu),最底層分布在不同地理位置的數(shù)據(jù)中心,在每個(gè)數(shù)據(jù)中心有若干臺(tái)抓取,而每臺(tái)抓取上可以部署若干套爬蟲(chóng)程序。對(duì)于一個(gè)數(shù)據(jù)中心的不同抓取,其協(xié)同工作方式大致有主從式和對(duì)等式兩種,可根據(jù)實(shí)際需要進(jìn)行選擇。
(3)網(wǎng)絡(luò)爬蟲(chóng)的爬取和更新策略
在系統(tǒng)中,待抓取URL隊(duì)列是很重要的一部分。如何對(duì)URL進(jìn)行排序是一個(gè)重要的問(wèn)題,這也就是我們要介紹的的爬取策略,因?yàn)樗鼪Q定了抓取頁(yè)面的順序。比較常見(jiàn)的爬取策略有深度優(yōu)先遍歷策略、寬度優(yōu)先遍歷策略、反向鏈接數(shù)策略、大站優(yōu)先策略、OPIC策略以及策略等。對(duì)于何時(shí)更新以前已經(jīng)下載過(guò)的頁(yè)面,也有相應(yīng)的網(wǎng)頁(yè)更新策略,常見(jiàn)的有歷史參考策略、用戶體驗(yàn)策略和聚類抽樣策略等。
總的來(lái)說(shuō),技術(shù)還是比較成熟的,提供了很多很好的類庫(kù),用實(shí)現(xiàn)一個(gè)簡(jiǎn)單的爬蟲(chóng)程序并不難,且所需的代碼量非常少。
3、日志收集系統(tǒng)
數(shù)據(jù)中有相當(dāng)一大部分是各種設(shè)備、系統(tǒng)和應(yīng)用中所產(chǎn)生的日志數(shù)據(jù),它們往往隱藏了許多有用信息。在過(guò)去,因?yàn)椴杉治鍪侄蔚娜笔В@些日志常常存儲(chǔ)一段時(shí)間就被清理了。而隨著技術(shù)的成熟,日志的價(jià)值重新得到重視。如何將分布在各個(gè)設(shè)備、系統(tǒng)和應(yīng)用中的日志數(shù)據(jù)收集起來(lái)進(jìn)行高效的匯總?我們會(huì)用到一些高性能的分布式日志收集系統(tǒng),如Flume、 、 等,這里重點(diǎn)介紹Flume。
(1)Flume的產(chǎn)生背景
Flume是提供的一個(gè)高可用、高可靠、分布式海量日志采集、聚合和傳輸?shù)南到y(tǒng)。設(shè)計(jì)Flume的宗旨是向批量導(dǎo)入基于事件的海量數(shù)據(jù)。Flume支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù),同時(shí)Flume具有對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理并寫(xiě)到各種數(shù)據(jù)接收方的功能。一個(gè)典型的例子就是利用Flume從一組中收集日志文件,然后將這些文件中的日志事件轉(zhuǎn)移到一個(gè)新的HDFS匯總文件中以做進(jìn)一步的處理,其終點(diǎn)通常為HDFS。
(2)Flume系統(tǒng)架構(gòu)
Flume采用三層架構(gòu),分別為Agent(代理)、(收集器)和(存儲(chǔ)器),每一層都可以水平擴(kuò)展。在這三個(gè)層次中,Agent和均由統(tǒng)一管理,進(jìn)行統(tǒng)一監(jiān)控和維護(hù),并且可以有多個(gè)(用進(jìn)行管理和),能有效地避免單點(diǎn)故障。Flume系統(tǒng)架構(gòu)如圖3所示。
圖3 Flume系統(tǒng)架構(gòu)
(3)Flume的工作原理
在使用Flume的時(shí)候,需要運(yùn)行Flume代理(Agent),因?yàn)镕lume由一組以分布式拓?fù)浣Y(jié)構(gòu)相互連接的代理所組成。Flume代理是由持續(xù)運(yùn)行的(數(shù)據(jù)來(lái)源)、Sink(數(shù)據(jù)目標(biāo))和(連接數(shù)據(jù)源和數(shù)據(jù)目標(biāo)的渠道)所構(gòu)成的進(jìn)程。“代理們”是這樣運(yùn)作的:產(chǎn)生事件并將其傳送給,存儲(chǔ)這些事件并轉(zhuǎn)發(fā)給Sink。這種--Sink的組合即為基本的Flume構(gòu)件。因此,使用Flume的主要工作就是通過(guò)配置代理使得各個(gè)組件連接在一起。Flume工作過(guò)程大致如圖4所示。
圖4 Flume工作過(guò)程
在實(shí)際應(yīng)用當(dāng)中,可以采用多Agent串聯(lián)(一個(gè)接一個(gè))的方式,也可以采用多Agent合并(并聯(lián))的方式,此外,還可以對(duì)單一進(jìn)行多種處理(即一個(gè)有多個(gè)和Sink),多種使用模式可任意挑選。
4、數(shù)據(jù)抽取工具
最大的優(yōu)勢(shì)就在于能夠支持不同形式和不同來(lái)源的數(shù)據(jù),并對(duì)其進(jìn)行存儲(chǔ)和解析,進(jìn)而抽取出相關(guān)信息將多個(gè)數(shù)據(jù)集組成非常有用的結(jié)果。目前的實(shí)際情況是很多有價(jià)值的數(shù)據(jù)都是以結(jié)構(gòu)化形式存儲(chǔ)在許多組織的關(guān)系型系統(tǒng)中,如何將這些關(guān)系型所存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù)抽取到平臺(tái)中;以用于進(jìn)一步的分析處理,是一項(xiàng)重要且有意義的工作。這里,我們介紹一款專門(mén)用于數(shù)據(jù)抽取的工具Sqoop。
(1)Sqoop簡(jiǎn)介
Sqoop是SQL-to-的縮寫(xiě),它也是生態(tài)系統(tǒng)中的一員,主要用于在和關(guān)系型(結(jié)構(gòu)化存儲(chǔ)器)之間交換數(shù)據(jù),可以改進(jìn)數(shù)據(jù)的互操作性。通過(guò)Sqoop可以很方便地將數(shù)據(jù)從、等關(guān)系型中導(dǎo)入,或者將數(shù)據(jù)從導(dǎo)出到關(guān)系型中,使得傳統(tǒng)關(guān)系型和之間的數(shù)據(jù)遷移變得非常方便。Sqoop主要通過(guò)JDBC與關(guān)系型進(jìn)行交互,理論上,支持JDBC的關(guān)系型都可以使用Sqoop與進(jìn)行數(shù)據(jù)交互。Sqoop專門(mén)為集而設(shè)計(jì),支持增量更新,可以將新記錄添加到最近一次導(dǎo)出的數(shù)據(jù)源上,或者指定上次修改的時(shí)間戳。Sqoop已經(jīng)過(guò)兩個(gè)版本的發(fā)展,是命令行工具,不提供 API,很難嵌入其他程序中,其中所有的連接器都必須掌握所有輸出格式,而具有用以運(yùn)行作業(yè)的組件和一整套客戶端,包括命令行接口、網(wǎng)站用戶界面、 API等,還能使用其他執(zhí)行引擎(如Spark)。
(2)Sqoop基礎(chǔ)組件——連接器
Sqoop擁有一個(gè)可擴(kuò)展的框架,使得它可以從(向)任何支持批量數(shù)據(jù)傳輸?shù)耐獠看鎯?chǔ)系統(tǒng)中導(dǎo)入(導(dǎo)出)數(shù)據(jù)。一個(gè)Sqoop連接器()就是這個(gè)框架下的基礎(chǔ)模塊化組件,用于支持Sqoop的導(dǎo)入和導(dǎo)出。這種連接器有很多種類,比如通用的JDBC連接器可以連接所有支持JDBC協(xié)議的,還有針對(duì)、、DB2、 SQL 等關(guān)系型的專用連接器。這些常用的連接器一般會(huì)內(nèi)置在Sqoop中。還有很多針對(duì)各種數(shù)據(jù)存儲(chǔ)器的第三方連接器可以使用,如支持企業(yè)級(jí)數(shù)據(jù)倉(cāng)庫(kù)如和NoSQL存儲(chǔ)器的連接器,它們往往需要另外單獨(dú)下載安裝。
(3)Sqoop的工作原理
Sqoop最重要的功能就是把數(shù)據(jù)導(dǎo)入。它通過(guò)一個(gè)作業(yè)從中導(dǎo)入一個(gè)表,這個(gè)作業(yè)從表中抽取一行行記錄,然后將記錄寫(xiě)入HDFS中,圖5展示了Sqoop的導(dǎo)入過(guò)程。
圖5 Sqoop導(dǎo)入過(guò)程
在向HDFS導(dǎo)入數(shù)據(jù)時(shí),最重要的是確保訪問(wèn)的數(shù)據(jù)源是一致的,而從中并行讀取數(shù)據(jù)的Map任務(wù)分布運(yùn)行在不同的進(jìn)程中,因此不可能共享同一個(gè)事務(wù)。保持一致性的最好方法就是在導(dǎo)入時(shí)不允許運(yùn)行任何對(duì)表中現(xiàn)有數(shù)據(jù)進(jìn)行更新的進(jìn)程。
Sqoop的導(dǎo)出功能架構(gòu)與其導(dǎo)入功能架構(gòu)非常相似。在執(zhí)行導(dǎo)出操作之前,Sqoop會(huì)根據(jù)連接字符串來(lái)選擇一個(gè)導(dǎo)出方法,對(duì)于大多數(shù)系統(tǒng)來(lái)說(shuō),Sqoop都會(huì)選擇JDBC;然后Sqoop會(huì)根據(jù)目標(biāo)表的定義生成一個(gè)類(class),這個(gè)類能從文本文件中解析出記錄,并且能夠向表中插入類型合適的值;然后會(huì)啟動(dòng)一個(gè)作業(yè),從HDFS中讀取源數(shù)據(jù)文件,使用生成的類解析出記錄,并且執(zhí)行選定的導(dǎo)出方法。圖6展示了使用并行執(zhí)行導(dǎo)出的過(guò)程。
圖6 Sqoop導(dǎo)出過(guò)程
5、分布式消息隊(duì)列系統(tǒng)
在大規(guī)模分布式系統(tǒng)中常使用消息隊(duì)列,它是在消息傳輸過(guò)程中保存消息的容器或,主要目的是提供消息路由、數(shù)據(jù)分發(fā)并保障消息可靠傳遞,為分布式系統(tǒng)的各個(gè)構(gòu)件之間傳遞消息并提供承載。目前常見(jiàn)的分布式消息隊(duì)列產(chǎn)品有Kafka、、和等。從性能和可擴(kuò)展性上看,、Kafka、、依次遞減。從功能種類和應(yīng)用廣度上看和強(qiáng)于Kafka和。綜合比較的話,與和相比較Kafka算是輕量級(jí)系統(tǒng),同時(shí)又能提供消息持久化保證(不像),性能、高可用和可擴(kuò)展方面表現(xiàn)也很優(yōu)異,平均得分最高,目前應(yīng)用場(chǎng)景較多,也非常適合用于平臺(tái),因此我們重點(diǎn)介紹Kafka消息隊(duì)列。
(1)Kafka的產(chǎn)生背景
在系統(tǒng)中常常會(huì)遇到一個(gè)問(wèn)題:整個(gè)由各個(gè)子系統(tǒng)組成,數(shù)據(jù)需要在各個(gè)子系統(tǒng)中高性能、低延遲地不停流轉(zhuǎn)。傳統(tǒng)的企業(yè)消息系統(tǒng)并不適合大規(guī)模數(shù)據(jù)處理。為了既能處理在線應(yīng)用(消息),也能處理離線應(yīng)用(數(shù)據(jù)文件和日志),Kafka應(yīng)運(yùn)而生。Kafka是開(kāi)源的分布式消息隊(duì)列系統(tǒng),誕生于2010年,具有極高的吞吐量和較強(qiáng)的擴(kuò)展性和高可用性,主要用于處理活躍的流式數(shù)據(jù)。
最初,Kafka被用于進(jìn)行日志收集、用戶行為實(shí)時(shí)收集以及機(jī)器狀態(tài)監(jiān)控等,后來(lái),還可作為流式計(jì)算系統(tǒng)的底層構(gòu)件,如的流式計(jì)算系統(tǒng)Samza就是構(gòu)建在Kafka和YARN之上的。對(duì)于像這樣的傳統(tǒng)日志分析系統(tǒng),其能夠提供離線處理日志消息的能力,但要是進(jìn)行實(shí)時(shí)處理,就會(huì)有較大延遲,而通過(guò)的并行加載機(jī)制加載Kafka消息隊(duì)列系統(tǒng)后就能夠統(tǒng)一線上和離線的消息,提供實(shí)時(shí)或近實(shí)時(shí)消息處理能力。總的來(lái)說(shuō),Kafka可以起到兩個(gè)作用:一是降低系統(tǒng)組網(wǎng)復(fù)雜度,二是降低復(fù)雜度,各個(gè)子系統(tǒng)不再是相互協(xié)商接口,各個(gè)子系統(tǒng)類似插口插在插座上,Kafka承擔(dān)高速數(shù)據(jù)總線的作用。
(2)Kafka的整體架構(gòu)
Kafka的整體架構(gòu)非常簡(jiǎn)單,是顯式的分布式架構(gòu),主要涉及三個(gè)角色:
消息生產(chǎn)者():消息()和數(shù)據(jù)的生產(chǎn)者,產(chǎn)生特定主題(Topic)的消息并傳入代理集群。
代理服務(wù)器():也稱緩存代理,是Kafka集群中的一臺(tái)或多臺(tái)。
消息消費(fèi)者():消息和數(shù)據(jù)消費(fèi)者,訂閱Topic并處理其發(fā)布的消息。
Kafka的架構(gòu)如圖7所示。
圖7 Kafka整體架構(gòu)圖
其中,、和都可以有多個(gè)。和實(shí)現(xiàn)Kafka注冊(cè)的接口,數(shù)據(jù)從發(fā)送到,承擔(dān)一個(gè)中間緩存和分發(fā)的作用。的作用類似于緩存,是活躍的數(shù)據(jù)和離線處理系統(tǒng)之間的緩存,主要把數(shù)據(jù)分發(fā)注冊(cè)到系統(tǒng)中的。客戶端和端的通信是基于簡(jiǎn)單、高性能且與語(yǔ)言無(wú)關(guān)的實(shí)現(xiàn)的。
(3)Kafka消息發(fā)送流程
Kafka消息發(fā)送流程如圖8所示。
圖8 Kafka消息發(fā)送流程
首先補(bǔ)充一個(gè)基本概念——(分區(qū)),它是Topic物理上的分組,一個(gè)Topic可以分為多個(gè),每個(gè)是一個(gè)有序、可持續(xù)添加的隊(duì)列,中的每條消息都會(huì)被分配一個(gè)有序的序列號(hào)id,稱之為(偏移量),在每個(gè)中此偏移量都是唯一的。
Kafka消息發(fā)送的流程大致為:根據(jù)指定的分區(qū)方法(例如Round-robin、Hash等),將消息發(fā)布到指定Topic的中;Kafka集群接收到發(fā)過(guò)來(lái)的消息后,將其持久化到硬盤(pán),并保留消息指定時(shí)長(zhǎng)(可配置),而不關(guān)注消息是否被消費(fèi);從Kafka集群里pull(拉)數(shù)據(jù),并控制獲取消息的。
(4)Kafka的主要特點(diǎn)
Kafka有以下幾個(gè)主要特點(diǎn):
● 同時(shí)為發(fā)布和訂閱提供高吞吐量。據(jù)了解,Kafka每秒可以生產(chǎn)約25萬(wàn)條消息(50 MB),每秒處理55萬(wàn)條消息(110 MB)。
● 可進(jìn)行持久化操作。將消息持久化到磁盤(pán),因此可用于批量消費(fèi),如ETL等。通過(guò)將數(shù)據(jù)持久化到硬盤(pán)以及實(shí)現(xiàn)多副本,從而防止數(shù)據(jù)丟失。
● 分布式系統(tǒng),易于向外擴(kuò)展,可以與結(jié)合。所有的、和都會(huì)有多個(gè),均為分布式的,無(wú)需停機(jī)即可擴(kuò)展機(jī)器。
● 消息被處理的狀態(tài)是在端維護(hù),而不是由端維護(hù),當(dāng)失敗時(shí)能自動(dòng)平衡。
● 支持在線應(yīng)用和離線應(yīng)用的場(chǎng)景。
(5)Kafka的應(yīng)用場(chǎng)景
Kafka的應(yīng)用場(chǎng)景主要有以下幾種:
消息隊(duì)列:比起大多數(shù)傳統(tǒng)的消息系統(tǒng),如或,Kafka有更好的吞吐量、內(nèi)置的分區(qū)、冗余及容錯(cuò)性,這使得Kafka成為一個(gè)很好的大規(guī)模消息處理應(yīng)用的解決方案。普通的消息系統(tǒng)一般吞吐量相對(duì)較低,當(dāng)需要更小的端到端延時(shí)的時(shí)候,可依賴于Kafka提供的強(qiáng)大的持久性保障。
行為跟蹤:可用于跟蹤用戶瀏覽頁(yè)面、搜索及其他行為,以發(fā)布–訂閱的模式實(shí)時(shí)地記錄到對(duì)應(yīng)的Topic中。當(dāng)這些結(jié)果被訂閱者拿到后,就可以做進(jìn)一步的實(shí)時(shí)處理或放到離線數(shù)據(jù)倉(cāng)庫(kù)里進(jìn)行處理。
日志收集:用于日志收集的開(kāi)源系統(tǒng)有很多硬件信息收集 腳本,如前面介紹的Flume等。Kafka也能進(jìn)行日志收集或者說(shuō)是日志聚合,其特別之處在于,Kafka會(huì)忽略文件的細(xì)節(jié),將其更清晰地抽象成一個(gè)個(gè)日志或事件的消息流,這就讓Kafka處理過(guò)程延遲更低,更容易支持多數(shù)據(jù)源和分布式數(shù)據(jù)處理,在提供同樣高效的性能的同時(shí)具有更高的耐用性。
數(shù)據(jù)監(jiān)控和交換:可作為操作記錄的監(jiān)控模塊來(lái)使用,即匯集和記錄一些操作信息。在很多組織的生態(tài)系統(tǒng)中可以把Kafka作為數(shù)據(jù)交換樞紐,將不同類型的分布式系統(tǒng)(如關(guān)系、NoSQL、離線系統(tǒng)、流處理系統(tǒng)、圖計(jì)算系統(tǒng)等)統(tǒng)一接入Kafka,從而實(shí)現(xiàn)與各個(gè)組件之間的不同類型數(shù)據(jù)的實(shí)時(shí)高速交換,很好地解決不同系統(tǒng)之間的數(shù)據(jù)生成/消費(fèi)速率不同的問(wèn)題。
流處理:這是最為廣泛的應(yīng)用場(chǎng)景,通過(guò)收集并保存流式數(shù)據(jù),提供之后與之對(duì)接的Storm或其他流式計(jì)算框架來(lái)進(jìn)行處理。很多用戶會(huì)將原始Topic的數(shù)據(jù)進(jìn)行階段性處理、匯總和擴(kuò)充,或者以其他的方式轉(zhuǎn)換到新的Topic下再繼續(xù)后續(xù)處理,Storm和Samza就是非常著名的用于實(shí)現(xiàn)這種類型數(shù)據(jù)轉(zhuǎn)換的計(jì)算框架。
持久性日志:Kafka可以為一種外部的持久性日志的分布式系統(tǒng)提供服務(wù)。這種日志可以在節(jié)點(diǎn)間備份數(shù)據(jù),并為故障節(jié)點(diǎn)數(shù)據(jù)恢復(fù)提供一種重新同步的機(jī)制,Kafka中的日志壓縮功能為這種用法提供了條件。