Apache NiFi是由NSA(美國(guó)國(guó)家安全局)開源并貢獻(xiàn)給的Apache社區(qū)的易于使用且功能強(qiáng)大的數(shù)據(jù)處理和分發(fā)系統(tǒng)瑞信,可以幫助用戶建立和管理復(fù)雜的數(shù)據(jù)流寄纵,NiFi在近幾年大數(shù)據(jù)項(xiàng)目的數(shù)據(jù)接入層得到了廣泛應(yīng)用左刽。在物聯(lián)網(wǎng)(IoT)場(chǎng)景下,系統(tǒng)中有大量的設(shè)備(例如傳感器店茶,路由器鲫咽,零售終端等)需要進(jìn)行數(shù)據(jù)的采集和上報(bào),如果采用中央NiFi集群溃斋,就需要處理大量設(shè)備的連接問題界拦,加大了NiFi的壓力。于是梗劫,旨在直接在數(shù)據(jù)產(chǎn)生的源頭收集和處理數(shù)據(jù)的子項(xiàng)目MiNiFi就應(yīng)運(yùn)而生了享甸。
本文將簡(jiǎn)要探討MiNiFi的原理截碴,部署與配置,如何運(yùn)行數(shù)據(jù)流以及與NiFi的集成蛉威。
說(shuō)句題外話日丹,MiNiFi應(yīng)該怎么讀?根據(jù)MiNiFi項(xiàng)目的FAQs(堪稱史上最簡(jiǎn)短的FAQs~ )蚯嫌,MiNiFi應(yīng)該讀作min-uh-fahy
原理
MiNiFi作為NiFi的子項(xiàng)目哲虾,是對(duì)NiFi數(shù)據(jù)流管理核心原則的擴(kuò)展,聚焦于如何從數(shù)據(jù)產(chǎn)生的源頭收集數(shù)據(jù)择示;MiNiFi解決了數(shù)據(jù)在產(chǎn)生源頭和消費(fèi)者之間相互傳遞和管理的困難束凑,可以作為數(shù)字信號(hào)的“第一或最后一英里”,通過實(shí)現(xiàn)邊緣設(shè)備智能(edge intelligence)來(lái)調(diào)整數(shù)據(jù)流的雙向通信对妄。MiNiFi設(shè)計(jì)的具體目標(biāo)包括:
- 更小的體積和更低的資源消耗
- 集中管理Agents
- 可以生成數(shù)據(jù)世系(Data Provenance)
- 可以和NiFi集成
因?yàn)閿?shù)據(jù)采集的初段是分布式且通常涉及大量的終端設(shè)備(例如物聯(lián)網(wǎng))湘今,MiNiFi具備NiFi的除了前端頁(yè)面和部分管理命令行之外的所有核心能力,可以創(chuàng)建和部署數(shù)據(jù)流剪菱,使大量設(shè)備的統(tǒng)一管理成為可能摩瞎。
- MiNiFi的配置由聲明式的配置文件(YAML)驅(qū)動(dòng),可以通過主流的自動(dòng)化管理工具輔助進(jìn)行配置下發(fā)來(lái)管理大量的MiNiFi實(shí)例
- MiNiFi Agents通過點(diǎn)對(duì)點(diǎn)協(xié)議(例如HTTP/HTTPs)來(lái)將收集的數(shù)據(jù)傳送到中央的NiFi集群中
- MiNiFi聚焦于對(duì)NiFi的精簡(jiǎn)孝常,所以NiFi并沒有包含NiFi支持的全部Processor旗们,Java Agents可以通過添加NiFi既有的NAR包來(lái)擴(kuò)展processor種類,滿足用戶在設(shè)計(jì)和部署自己的數(shù)據(jù)流時(shí)對(duì)數(shù)據(jù)源的多樣化需求
- MiNiFi與NiFi之間可以實(shí)現(xiàn)雙向通信(Bi-directional Communication)构灸,雙向通信使得處理流程的動(dòng)態(tài)更新能通過數(shù)據(jù)流的重新設(shè)計(jì)和重新部署來(lái)實(shí)現(xiàn)上渴,并且將從數(shù)據(jù)中獲得的洞察轉(zhuǎn)化為可以應(yīng)用的新的數(shù)據(jù)流設(shè)計(jì)
下載與部署
MiNiFi要能夠被部署到邊緣(edge)設(shè)備上,則其安裝包必須比NiFi小很多(NiFi的安裝包超過900MB喜颁!)稠氮。MiNiFi的安裝包小于60MB,具體大小取決于不同的版本半开,MiNiFi提供了Java和C++兩個(gè)版本:
- Java版本為可以運(yùn)行大部分的NiFi processors隔披,但是體積也更大(約59MB)同時(shí)需要消耗額外的系統(tǒng)資源(默認(rèn)24MB的max JVM heapsize);如果用戶希望最大程度的集成NiFi在處理數(shù)據(jù)上的能力寂拆,Java 版本是最好的選擇奢米;(本文中我們以Java Agent為例進(jìn)行測(cè)試)
- C++版本更加輕量化(只需要大約3MB),消耗更少的系統(tǒng)資源(大約5MB的內(nèi)存)纠永,但是只具備NiFi processors的有限的子集鬓长;如果用戶只是獲取數(shù)據(jù)然后把數(shù)據(jù)傳給下游系統(tǒng)(例如中央的NiFi集群)處理并且比較在乎系統(tǒng)資源的占用,那么C++版本比較合適尝江。
用戶可以從MiNiFi項(xiàng)目主頁(yè)下載MiNiFi的安裝包涉波,每個(gè)版本的MiNiFi安裝包都包括以下三個(gè)部分:
- MiNiFi:即MiNiFi安裝包,包含了MiNiFi的所有核心功能,部署和執(zhí)行用戶設(shè)計(jì)的數(shù)據(jù)流
- MiNiFi Toolki Binaries :一個(gè)用來(lái)將NiFi的數(shù)據(jù)流模版轉(zhuǎn)化為MiNiFi的配置文件的工具包
- MiNiFi Command and Control Server Binaries:即MiNiFi C2啤覆,用于輔助用戶管理和控制MiNiFi實(shí)例中的數(shù)據(jù)流
MiNiFi善延,MiNiFi Toolket和MiNiFi C2都供了tar.gz,zip和源碼包三種不同的形式城侧,用戶可以根據(jù)自己的需要進(jìn)行選擇。部署MiNiFi需要預(yù)先在服務(wù)器或者設(shè)備上安裝系統(tǒng)級(jí)別的依賴彼妻,其中Java版本預(yù)裝JVM嫌佑,C++版本則需要leveldb,libxml等依賴庫(kù)侨歉,具體如下:
安裝好依賴以后屋摇,用戶只需要將從項(xiàng)目主頁(yè)將所需的安裝包下載并解壓到目標(biāo)環(huán)境的任意目錄(如home目錄)中,就可以開始啟動(dòng)MiNiFi去執(zhí)行用戶設(shè)計(jì)數(shù)據(jù)流了幽邓。
MiNiFi安裝包解壓后如下:
其中炮温,bin/目錄下是MiNiFi的管理命令,conf/目錄下是MiNiFi的數(shù)據(jù)流配置文件(其中config.yml定義了MiNiFi上執(zhí)行的數(shù)據(jù)流)牵舵,lib/目錄下是MiNiFi核心的jar包和nar包柒啤,啟動(dòng)之后還會(huì)生成一個(gè)記錄日志的logs/目錄。
設(shè)計(jì)與部署數(shù)據(jù)流
在使用MiNiFi之前畸颅,首先需要檢查NiFi的配置($NIFI_HOME/conf/nifi.properties)担巩,需要確保NiFi實(shí)例已經(jīng)配置了nifi.remote.input.socket.port(默認(rèn)是未指定的),否則NiFi收不到MiNiFi上傳的數(shù)據(jù)没炒。具體配置項(xiàng)如下:
# Site to Site properties
nifi.remote.input.host=
nifi.remote.input.secure=false
nifi.remote.input.socket.port=1206
nifi.remote.input.http.enabled=true
nifi.remote.input.http.transaction.ttl=30 sec
如果沒有指定涛癌,則按上述配置修改$NIFI_HOME/conf/nifi.properties,然后重啟NiFi實(shí)例即可送火。
由于MiNiFi本身并沒有提供類似NiFi的用于設(shè)計(jì)數(shù)據(jù)流的前端頁(yè)面拳话,所以用戶可以用NiFi的前端頁(yè)面設(shè)計(jì)數(shù)據(jù)流,然后生成NiFi數(shù)據(jù)流模版(template)种吸,再將模版文件加載到MiNiFi所在環(huán)境中弃衍,具體步驟如下:
- 在NiFi中設(shè)計(jì)數(shù)據(jù)流
我們可以設(shè)計(jì)一個(gè)簡(jiǎn)單的數(shù)據(jù)流用于監(jiān)控MiNiFi所在服務(wù)器上的一個(gè)文本文件(在home下面創(chuàng)建一個(gè)用于測(cè)試的文本文件,文件里內(nèi)容為“test minifi”)骨稿,將文件的內(nèi)容發(fā)送給NiFi實(shí)例笨鸡,然后NiFi實(shí)例再把文本內(nèi)容寫入Kafka集群的topic里。實(shí)現(xiàn)整個(gè)數(shù)據(jù)流坦冠,需要MiNiFi和NiFi配合完成:
在MiNiFi側(cè)形耗,數(shù)據(jù)流由一個(gè)TailFile類型的processor和一個(gè)Remote Processor Group組成,TailFile類型的processor用于監(jiān)控并采集指定文件的內(nèi)容辙浑,Remote Processor Group用于將采集的數(shù)據(jù)發(fā)送到遠(yuǎn)端的NiFi實(shí)例:
MiNiFi與NiFi采用HTTP協(xié)議相互通信激涤,Remote Processor Group需要配置NiFi實(shí)例的URL和協(xié)議類型,具體配置如下:
在NiFi側(cè),數(shù)據(jù)流需要一個(gè)Input Port和一個(gè)PublishKafka類型的processor倦踢,Input Port用來(lái)接收發(fā)送自MiNiFi的數(shù)據(jù)送滞,PublishKafka類型的processor用于將收到的數(shù)據(jù)寫入Kafka的指定topic中:
- 在NiFi中,將所設(shè)計(jì)的MiNiFi側(cè)的數(shù)據(jù)流創(chuàng)建為模版并下載為XML格式的模版文件辱挥,再將模版文件拷貝到MiNiFi所在的環(huán)境中
- 利用MiNiFi ToolKit將數(shù)據(jù)流模版文件轉(zhuǎn)換為MiNiFi的配置文件(即$MINIFI_HOME/conf/config.yml犁嗅,舊的config.yml可以刪除或直接替換),轉(zhuǎn)換命令如下
./bin/config.sh transform /path/to/template.xml $MINIFI_HOME/conf/config.yml
- 修改生成的config.yml晤碘,在config.yml最后的Input Ports Section里添加NiFi實(shí)例的host和port(即NiFi實(shí)例配置的nifi.remote.input.socket.port)屬性褂微,配置示例如下:
- 啟動(dòng)MiNiFi執(zhí)行數(shù)據(jù)流
./minifi.sh start
- MiNiFi啟動(dòng)后,可以在$MINIFI_HOME/logs/minifi-app.log中查看MiNiFi的運(yùn)行日志园爷。如果沒有問題的話宠蚂,很快就可以在Kafka的指定topic中看到輸出的文本內(nèi)容:
此外,我們也可以在NiFi的界面的各個(gè)processor看到數(shù)據(jù)的流入童社,例如查看PublishKafka processor的Data provenance:
至此求厕,MiNiFi中的數(shù)據(jù)流運(yùn)行成功,整個(gè)數(shù)據(jù)流會(huì)一直監(jiān)控指定文件的內(nèi)容扰楼,將文件內(nèi)容通過MiNiFi和NiFi接力傳送到Kafka集群中呀癣。
如果要對(duì)MiNiFi上運(yùn)行的數(shù)據(jù)流進(jìn)行修改,可以通過重復(fù)上面的步驟灭抑,即:通過NiFi修改數(shù)據(jù)流的設(shè)計(jì) -> 生成模版文件 -> 將模版文件轉(zhuǎn)換為config.yml -> 替換舊的config.yml -> 重啟MiNiFi十艾。
后續(xù)計(jì)劃
通過對(duì)MiNiFi短暫的研究和測(cè)試,筆者認(rèn)為MiNiFi會(huì)在未來(lái)的數(shù)據(jù)接入-尤其是物聯(lián)網(wǎng)場(chǎng)景下的大量設(shè)備和數(shù)據(jù)的接入中發(fā)揮很大的價(jià)值腾节,因?yàn)镸iNiFi的出現(xiàn)使得很多數(shù)據(jù)采集和預(yù)處理工作可以前置到邊緣設(shè)備(如網(wǎng)關(guān)忘嫉,自動(dòng)汽車,零售終端等)中完成案腺,大大減輕了NiFi集群的壓力庆冕。 本文只是初步的測(cè)試,關(guān)于MiNiFi還有很多問題值得研究劈榨,例如:如何在嵌入式設(shè)備中實(shí)際測(cè)試MiNiFi的資源消耗和性能访递,如何擴(kuò)展MiNiFi的processor,如何實(shí)現(xiàn)從NiFi到MiNiFi的數(shù)據(jù)流配置文件自動(dòng)下發(fā)等同辣。
期待日后結(jié)合實(shí)際場(chǎng)景進(jìn)一步探索MiNiFi~