flume1.8 开发指南学习感悟
概述:
Apache Flume是一個分布式、可用的系統(tǒng),用于從許多不同的sources有效的收集并移動大量日志數(shù)據(jù)用于集中存儲數(shù)據(jù)。
架構(gòu)及數(shù)據(jù)流動模型:
flume實際上就是一個Agent。Agent里面包含三大組件:Source、Channel、Sink。
Flume agent流動的數(shù)據(jù)單位為一個Event。一個Flume agent 是一個JVM進(jìn)程,維持允許Events從一個外部source流動到一個外部目的地的組件。
Events被外部source(例如web server)發(fā)送到Source,被發(fā)送的Events要有特定的格式。例如,AvroSource可以用來接受來自客戶端的Avro Events或者其他Flume agent。當(dāng)Source接受Event時,Source存儲Event進(jìn)一個或多個Channels。該Channel是一個活的存儲,保存Event直到它被Sink消費。Sink把Event從Channel中移除并把Event放進(jìn)外部存儲庫,如HDFS。Source和Sink在Agent里面是異步運行的。
Client--開發(fā)自定義組件:
Client在events的來源地操作,并把獲取到的events發(fā)送到Flume agent。Client通常在它們消耗數(shù)據(jù)的應(yīng)用過程操作。Flume一般支持Avro,log4j,syslog,和Http POST(帶有JSON body)作為途徑方式去從轉(zhuǎn)換來自外部Source的數(shù)據(jù)。在上圖中的web server就相當(dāng)于一個Client。
在條件無法滿足的情況下,可以創(chuàng)建一個自定義機(jī)制發(fā)送數(shù)據(jù)給Flume。有兩種實現(xiàn)方式:第一種是創(chuàng)建自定義client與Flume已存在的sources,如AvroSource或者SyslogTcpSource,聯(lián)系交流。這里client需要把數(shù)據(jù)轉(zhuǎn)換成Flume Sources能夠識別的信息。另外一種是去編寫自定義Flume Source,它能直接與你已存在的使用IPC或者RPC協(xié)議的client應(yīng)用交流,然后轉(zhuǎn)換client數(shù)據(jù)為Flume Events用于發(fā)送。
RPC client 接口
Flume的RpcClient接口的實現(xiàn)封裝了flume支持的RPC機(jī)制。用戶的應(yīng)用可以簡單的調(diào)用Flume Client SDK的append(Event)或者appendBatch(List<Event>)去發(fā)送數(shù)據(jù),而不用擔(dān)心底層消息交換的細(xì)節(jié)。用戶提供要求的Event的方式有兩種,一種是可以通過直接實現(xiàn)Event接口,如SimpleEvent類,二是通過使用EventBuilder的withBody()方法。
RPC clients - Avro和Thrift
Avro是默認(rèn)的RPC協(xié)議,NettyAvroRpcClient和ThriftRpcClient實現(xiàn)RpcClient接口。client需要創(chuàng)建帶有host和port的目標(biāo)Flume agent,然后可以使用RpcClient發(fā)送數(shù)據(jù)到agent。
Flume Client (Avro Client)配置解析
① 分別給Channels、Sources、Sinks命名為c1、r1、k1;
②標(biāo)明channels c1的類型,為memory內(nèi)存存儲;
③注明sources r1需要連接的channels為c1,然后標(biāo)明sources r1的類型為avro,即client為avroClient類型,發(fā)送到source的數(shù)據(jù)格式為avro;其次把client的host和port寫明;
④注明sinks k1需要連接的channels為c1,然后表明sinks類型為loggger存儲方式。
事務(wù)接口:
事務(wù)接口是Flume可靠性的基礎(chǔ)。全部的主要組件(如Sources,Sinks和Channels)必須使用Flume事務(wù);
事務(wù)是在Channle實現(xiàn)過程中實現(xiàn)的。每一個Source和Sink連接到的Channel,其必須包含Transaction對象。Sources使用ChannelProcessor去管理Transactions,Sinks通過其配置的Channel管理Transactions。把event放進(jìn)Channel或者從Channel移除event的操作是在一個活的Transaction中完成的。
?Sink:
Sink的目的是把Events從Channel移除并把它們發(fā)送到下一個Flume Agent或者在外部存儲庫存儲它們。一個Sink恰好連接一個Channels,在Flume配置文件中配置。有個SinkRunner實例連接每一個配置的Sink,當(dāng)Flume框架調(diào)用SinkRunner.start(),一個新線程被創(chuàng)建去驅(qū)動Sink(使用SinkRunner.PollingRunner作為線程的Runnable)。這個線程管理Sink的生命周期。該Sink需要實現(xiàn)start()和stop()方法,這些方法是LifecycleAware的接口。Sink.start()方法應(yīng)該初始化Sink和帶它到一個能使Event前進(jìn)到下一個目的地的狀態(tài)。Sink.process()方法應(yīng)該執(zhí)行把Event從Channel移除并使它前進(jìn)的核心進(jìn)程。Sink.stop()方法應(yīng)該執(zhí)行必要的清除(如釋放資源)
Source:
Source的目的是接收來自外部Client的數(shù)據(jù)和把它存儲在配置好的Channels。Source可以通過它本身的ChannelProcessor得到一個實例,用來處理一個Event,并在Channel本地transaction提交。類似于SinkRunner.PollingRunner Runnable,有PollingRunner Runnable在一個新線程中執(zhí)行,當(dāng)Flume框架調(diào)用PollableSourceRunner.start(),該線程會被創(chuàng)建。每一個配置的PollableSource與它本來的運行一個PollingRunnable的線程關(guān)聯(lián)。該線程管理PollableSource的生命周期,例如starting和stopping。一個PollableSource實現(xiàn)必須實現(xiàn)strat()和stop()方法,它們在LifecycleAware接口中聲明。PollableSource運行調(diào)用Source的process()方法。process()方法應(yīng)該檢查新的數(shù)據(jù)并把它以Flume Events的形式存儲在Channel中。注意這里有兩種Sources。PollableSource已經(jīng)被提及啦。另一種是EventDrivenSource。EventDrivenSource,不同于PollableSource,必須有它自己的調(diào)用機(jī)制去識別新數(shù)據(jù)并把新數(shù)據(jù)存在Channel。EventDrivenSources不是由它們本身的線程驅(qū)動的。
Channel:
暫無
轉(zhuǎn)載于:https://www.cnblogs.com/swordfall/p/8093464.html
總結(jié)
以上是生活随笔為你收集整理的flume1.8 开发指南学习感悟的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 P2818 天使的起誓
- 下一篇: Java 读书笔记 (十一) Numbe