大數(shù)據(jù)的數(shù)據(jù)采集是大數(shù)據(jù)技術(shù)中非常重要、基礎(chǔ)的部分绵估,數(shù)據(jù)不會平白無故地跑到我們的數(shù)據(jù)平臺中,我們得用什么東西把它從現(xiàn)有的設(shè)備(比如服務(wù)器卡骂,路由器国裳、交換機(jī)、防火墻偿警、數(shù)據(jù)庫等)中采集過來躏救,再傳輸?shù)綌?shù)據(jù)平臺中,后面才有更加復(fù)雜的高難度的處理技術(shù)螟蒸。
在采集過程中盒使,如何應(yīng)對數(shù)據(jù)多樣性、數(shù)據(jù)量大七嫌、變化快等特點少办,如何保證數(shù)據(jù)采集的可靠性、性能诵原,如何避免重復(fù)數(shù)據(jù)英妓,如何保證數(shù)據(jù)質(zhì)量,如何降低資源成本绍赛,這些都是大數(shù)據(jù)采集面臨的難點問題蔓纠,所以,選擇一款合適的采集工具至關(guān)重要吗蚌。
目前腿倚,F(xiàn)lume和Logstash是比較主流的數(shù)據(jù)采集工具(主要用于日志采集)星瘾,以下將對這兩款工具進(jìn)行詳細(xì)介紹以及對比選型西乖。
首先介紹數(shù)據(jù)采集的通用模型滞详,如圖:
其中澄惊,數(shù)據(jù)采集和存儲是必要的環(huán)節(jié),其他并不一定需要硬贯。但這只是一個粗略的通用模型焕襟,不同開源社區(qū)或者廠家開發(fā)時都會有自己的考慮和目的。Flume和Logstash原則上都屬于數(shù)據(jù)采集這個范疇饭豹,但是兩者在技術(shù)上或多或少都自帶了一些緩沖鸵赖、過濾等功能。
一墨状、歷史簡介
Logstash:
Logstash誕生于2009年8月卫漫,2013年被ElasticSearch公司收購。Logstash是一個分布式日志收集框架肾砂,開發(fā)語言是JRuby列赎,經(jīng)常與ElasticSearch,Kibana配合使用組成著名的ELK技術(shù)棧镐确,所謂ELK就是ElasticSearch包吝、
Logstash、Kibana這三個組件(ES負(fù)責(zé)數(shù)據(jù)的存儲和索引源葫,Logstash負(fù)責(zé)數(shù)據(jù)采集和過濾轉(zhuǎn)換诗越,Kibana則負(fù)責(zé)圖形界面處理),后來這三個組件又先后被Elastic.co公司收購息堂。
Logstash非常適合做日志數(shù)據(jù)的采集嚷狞,可以采用ELK組合使用,也可以作為日志收集軟件單獨出現(xiàn)荣堰,單獨出現(xiàn)時可將日志存儲到多種存儲系統(tǒng)或臨時中轉(zhuǎn)系統(tǒng)床未,如MySQL,redis振坚,kakfa薇搁,HDFS, lucene,solr等渡八,并不一定是ElasticSearch啃洋。
Flume:
Flume誕生于2010年,最早由Cloudrea開發(fā)屎鳍,是一個高可用宏娄,高可靠,的分布式海量日志采集系統(tǒng)逮壁,支持定制各類數(shù)據(jù)發(fā)送方绝编,一般和 kafka 訂閱消息系統(tǒng)搭配較多。其設(shè)計原理也是基于將數(shù)據(jù)流,如日志數(shù)據(jù)從各種網(wǎng)站服務(wù)器上匯集起來存儲到HDFS十饥,HBase等集中存儲系統(tǒng)中。Flume目前有兩個版本祖乳,OG和NG逗堵,區(qū)別很大,初始的發(fā)行版本叫做FlumeOG眷昆,后被apache收購蜒秤,改名為Apache Flume,收購重構(gòu)后的版本統(tǒng)稱為
Flume NG(next generation下一代的意思)亚斋;所以現(xiàn)在Flume已經(jīng)是ApacheETL工具集中的一員作媚。
結(jié)論:兩者最初的設(shè)計目的就不太一樣。Flume本身最初設(shè)計的目的是為了把數(shù)
據(jù)傳入HDFS中(并不是為了采集日志而設(shè)計帅刊,這和Logstash有根本的區(qū)別)纸泡,所以理所應(yīng)當(dāng)側(cè)重于數(shù)據(jù)的傳輸,程序員要非常清楚整個數(shù)據(jù)的路由赖瞒,并且比Logstash還多了一個可靠性策略女揭,上文中的channel就是用于持久化目的,數(shù)據(jù)除非確認(rèn)傳輸?shù)较乱晃恢昧死敢駝t不會刪除吧兔,這一步是通過事務(wù)來控制的,這樣的設(shè)計使得可靠性非常好袍嬉。相反境蔼,Logstash則明顯側(cè)重對數(shù)據(jù)的預(yù)處理,因為日志的字段需要大量的預(yù)處理伺通,為解析做鋪墊箍土。
二、系統(tǒng)架構(gòu)
Logstash:
Logstash的設(shè)計非常規(guī)范泵殴,有三個組件涮帘,分工如下:
1、Shipper:負(fù)責(zé)日志收集笑诅。職責(zé)是監(jiān)控本地日志文件的變化调缨,并輸出到
Redis 緩存起來;
2吆你、Broker 可以看作是日志集線器弦叶,可以連接多個 Shipper 和多個 Indexer;
3妇多、Indexer 負(fù)責(zé)日志存儲伤哺。在這個架構(gòu)中會從 Redis 接收日志,寫入到本地文
件。
因為架構(gòu)比較靈活立莉,所以如果不想用 Logstash 的存儲绢彤,也可以對接到Elasticsearch,這也就是前面所說的 ELK 的套路了蜓耻。
如果繼續(xù)細(xì)分茫舶,Logstash也可以這么解剖來看
所以Logstash就是這么簡約,全部將代碼集成刹淌,程序員不需要關(guān)心里面是如何運轉(zhuǎn)的饶氏。
Logstash最值得一提的是,在Filter plugin部分具有比較完備的功能有勾,比如grok疹启,能通過正則解析和結(jié)構(gòu)化任何文本,Grok 目前是Logstash最好的方式對非結(jié)構(gòu)化日志數(shù)據(jù)解析成結(jié)構(gòu)化和可查詢化蔼卡。此外喊崖,Logstash還可以重命名、刪除菲宴、替換和修改事件字段贷祈,當(dāng)然也包括完全丟棄事件,如debug事件喝峦。
還有很多的復(fù)雜功能供程序員自己選擇势誊,你會發(fā)現(xiàn)這些功能Flume是絕對沒有(以它的輕量級線程也是不可能做到的)。當(dāng)然谣蠢,在input和output兩個插件部分也具有非常多類似的可選擇性功能粟耻,程序員可以自由選擇,這一點跟Flume是比較相似的眉踱。
Flume:
下圖是Flume NG的架構(gòu)圖:
Flume 從原理上看很簡單挤忙,三段式的結(jié)構(gòu):源(Source輸入)—存儲(Channel管道)—出口(Sink目標(biāo)輸出)。但也因為涉及到這三個結(jié)構(gòu)谈喳,所以做配置就比較復(fù)雜册烈,這里舉個例子,看看Flume在一些場景下是如何搭建布置的婿禽,如下圖是Flume的集群部署:
Flume支持一個Agent中有多個不同類型的channel和sink赏僧,我們可以選擇把
Source的數(shù)據(jù)復(fù)制,分發(fā)給不同的目的端口扭倾,如下圖(Flume的多重復(fù)使用):
其次淀零,F(xiàn)lume還自帶了分區(qū)和攔截器功能,所以Flume也是有過濾功能的膛壹,只是Flume的過濾功能比較弱驾中。Flume在集群中最擅長的事情就是做路由了唉堪,因為每一個Flume Agent相連就構(gòu)成了一條鏈路,這也是眾多采集工具中Flume非常出色的亮點肩民。但是也正因為如此唠亚,如果有一個Flume Agent出了問題,那么整個鏈路也會出現(xiàn)問題此改,所以在集群中需要設(shè)計分層架構(gòu)等來實現(xiàn)冗余備份趾撵。但這么一來,配置又會變得很麻煩共啃。
結(jié)論:我們會驚人的發(fā)現(xiàn),兩者是多么的相似暂题!Logstash的Shipper移剪、
Broker、Indexer分別和Flume的Source薪者、Channel纵苛、Sink各自對應(yīng)!只不過是Logstash集成了言津,Broker可以不需要攻人,而Flume需要單獨配置,且缺一不可悬槽,但這再一次說明了計算機(jī)的設(shè)計思想都是通用的怀吻!只是實現(xiàn)方式會不同而已。
三初婆、開發(fā)配置
從程序員的角度來說蓬坡,F(xiàn)lume配置比較繁瑣,你需要分別作source磅叛、channel屑咳、sink的手工配置,而且涉及到復(fù)雜的數(shù)據(jù)采集環(huán)境弊琴,你可能還要做多個配置兆龙,而Logstash的配置就非常簡潔清晰,三個部分的屬性都定義好了敲董,程序員自己去選擇就行紫皇,就算沒有,也可以自行開發(fā)插件臣缀,非常方便坝橡。當(dāng)然了,F(xiàn)lume的插件也很多精置,但Channel就只有內(nèi)存和文件這兩種(其實現(xiàn)在不止了计寇,但常用的也就兩種)。讀者可以看得出來,兩者其實配置都是非常靈活的番宁,只不過看場景取舍罷了元莫。
四、性能蝶押、可靠性
因為Logstash內(nèi)部是沒有persist queue(打印隊列)的機(jī)制踱蠢,所以在異常情況下,可能出現(xiàn)數(shù)據(jù)丟失的問題棋电。所以選擇Logstash一般認(rèn)為這個日志可能不重要茎截。而Flume在高可用(可靠性)方面做得比較好,有自己的內(nèi)部機(jī)制確保這個問題赶盔,所以可以用于一些更重要的業(yè)務(wù)日志場景下企锌。
性能上Logstash要高于Flume,因為Flume運用了一套安全機(jī)制,犧牲了部分性能于未。
五撕攒、插件
Logstash插件豐富,有幾十個插件烘浦,而且配置靈活抖坪,所以在擴(kuò)展功能上比較全面。Flume沒有豐富的插件闷叉,主要靠二次開發(fā)(其實source和sink的種類也有一二十個擦俐,channel就比較少了);
六片习、市場占有率級使用平臺
logstash是用的最多的捌肴,github上有4000+ stars,因為它好在有一套完整的日志收集(logstash)藕咏、日志存儲(elasticsearch)状知、日志展示分析(kibana)套件,搭建起來非常方便孽查。
Logstash用戶:
Flume用戶:美團(tuán)
七饥悴、總結(jié)
Logstash:
1、內(nèi)部沒有一個persist queue(打印隊列)盲再,異常情況可能會丟失部分?jǐn)?shù)據(jù)西设;
2、由ruby編寫答朋,需要ruby環(huán)境贷揽,插件很多;
3梦碗、偏重數(shù)據(jù)的預(yù)處理禽绪,為數(shù)據(jù)解析做鋪墊蓖救;
4、插件豐富印屁,Logstash有幾十個插件循捺,配置靈活;
5雄人、Logstash的input和Fillter還有output之間都存在buffer从橘,進(jìn)行緩沖;
6础钠、有ELK套件恰力,技術(shù)成熟,使用場景廣泛旗吁,但比較重量級
Flume:
1.分布式高可靠高可用的數(shù)據(jù)采集系統(tǒng)牺勾,高效的從不同數(shù)據(jù)源收集、聚合阵漏、遷移數(shù)據(jù)到一個集中的數(shù)據(jù)存儲;
2翻具、側(cè)重數(shù)據(jù)傳輸履怯,使用基于事務(wù)的數(shù)據(jù)傳遞方式保證事件傳遞的可靠性,確保不會丟數(shù)據(jù)裆泳,用于重要日志場景叹洲;
3、由java開發(fā)工禾,沒有豐富的插件运提,主要靠二次開發(fā)(source和sink的種類也有一二十個,channel就比較少了)闻葵;
4民泵、輕量級線程,輕量級框架槽畔,以配置文件為中心栈妆,提供了JavaAPI;
5厢钧、安裝部署比較復(fù)雜鳞尔,配置繁瑣,source早直,channel寥假,sink三大組件都需要配置;
6.三層架構(gòu):source霞扬、channel糕韧、sink枫振,是一個完整的基于插件的架構(gòu),有獨立開發(fā)的第三方插件兔沃;
7蒋得、Flume直接使用channel做持久化(可以理解為沒有filter)最后,flume是apache的乒疏,可以使用hadoop的hdfs额衙,后端分析用MapReduce,選擇靈活多樣怕吴,而Logstash其實更有點像通用的模型窍侧,讓一切都變的簡單,所以對新人來說理解起來更簡單转绷;Logstash就像是買來的臺式機(jī)伟件,主板、電源议经、硬盤斧账,機(jī)箱(Logstash)把里面的東西全部裝好了,你可以直接用煞肾,當(dāng)然也可以自己組裝修改咧织;Flume就像提供給你一套完整的主板,電源籍救、硬盤习绢,F(xiàn)lume沒有打包,只是像說明書一樣指導(dǎo)你如何組裝蝙昙,才能運行的起來闪萄。