1. 程式人生 > >flume1.8 開發指南學習感悟

flume1.8 開發指南學習感悟

應用 過程 進程 ans 可用 發送 簡單的 實現 保存

概述:

Apache Flume是一個分布式、可用的系統,用於從許多不同的sources有效的收集並移動大量日誌數據用於集中存儲數據。

架構及數據流動模型:

flume實際上就是一個Agent。Agent裏面包含三大組件:Source、Channel、Sink。

Flume agent流動的數據單位為一個Event。一個Flume agent 是一個JVM進程,維持允許Events從一個外部source流動到一個外部目的地的組件。

技術分享圖片

Events被外部source(例如web server)發送到Source,被發送的Events要有特定的格式。例如,AvroSource可以用來接受來自客戶端的Avro Events或者其他Flume agent。當Source接受Event時,Source存儲Event進一個或多個Channels。該Channel是一個活的存儲,保存Event直到它被Sink消費。Sink把Event從Channel中移除並把Event放進外部存儲庫,如HDFS。Source和Sink在Agent裏面是異步運行的。

Client--開發自定義組件:

Client在events的來源地操作,並把獲取到的events發送到Flume agent。Client通常在它們消耗數據的應用過程操作。Flume一般支持Avro,log4j,syslog,和Http POST(帶有JSON body)作為途徑方式去從轉換來自外部Source的數據。在上圖中的web server就相當於一個Client。

在條件無法滿足的情況下,可以創建一個自定義機制發送數據給Flume。有兩種實現方式:第一種是創建自定義client與Flume已存在的sources,如AvroSource或者SyslogTcpSource,聯系交流。這裏client需要把數據轉換成Flume Sources能夠識別的信息。另外一種是去編寫自定義Flume Source,它能直接與你已存在的使用IPC或者RPC協議的client應用交流,然後轉換client數據為Flume Events用於發送。

RPC client 接口

Flume的RpcClient接口的實現封裝了flume支持的RPC機制。用戶的應用可以簡單的調用Flume Client SDK的append(Event)或者appendBatch(List<Event>)去發送數據,而不用擔心底層消息交換的細節。用戶提供要求的Event的方式有兩種,一種是可以通過直接實現Event接口,如SimpleEvent類,二是通過使用EventBuilder的withBody()方法。

RPC clients - Avro和Thrift

Avro是默認的RPC協議,NettyAvroRpcClient和ThriftRpcClient實現RpcClient接口。client需要創建帶有host和port的目標Flume agent,然後可以使用RpcClient發送數據到agent。

Flume Client (Avro Client)配置解析

技術分享圖片

技術分享圖片

① 分別給Channels、Sources、Sinks命名為c1、r1、k1;

②標明channels c1的類型,為memory內存存儲;

③註明sources r1需要連接的channels為c1,然後標明sources r1的類型為avro,即client為avroClient類型,發送到source的數據格式為avro;其次把client的host和port寫明;

④註明sinks k1需要連接的channels為c1,然後表明sinks類型為loggger存儲方式。

事務接口:

事務接口是Flume可靠性的基礎。全部的主要組件(如Sources,Sinks和Channels)必須使用Flume事務;

技術分享圖片

事務是在Channle實現過程中實現的。每一個Source和Sink連接到的Channel,其必須包含Transaction對象。Sources使用ChannelProcessor去管理Transactions,Sinks通過其配置的Channel管理Transactions。把event放進Channel或者從Channel移除event的操作是在一個活的Transaction中完成的。

Sink:

Sink的目的是把Events從Channel移除並把它們發送到下一個Flume Agent或者在外部存儲庫存儲它們。一個Sink恰好連接一個Channels,在Flume配置文件中配置。有個SinkRunner實例連接每一個配置的Sink,當Flume框架調用SinkRunner.start(),一個新線程被創建去驅動Sink(使用SinkRunner.PollingRunner作為線程的Runnable)。這個線程管理Sink的生命周期。該Sink需要實現start()和stop()方法,這些方法是LifecycleAware的接口。Sink.start()方法應該初始化Sink和帶它到一個能使Event前進到下一個目的地的狀態。Sink.process()方法應該執行把Event從Channel移除並使它前進的核心進程。Sink.stop()方法應該執行必要的清除(如釋放資源)

Source:

Source的目的是接收來自外部Client的數據和把它存儲在配置好的Channels。Source可以通過它本身的ChannelProcessor得到一個實例,用來處理一個Event,並在Channel本地transaction提交。類似於SinkRunner.PollingRunner Runnable,有PollingRunner Runnable在一個新線程中執行,當Flume框架調用PollableSourceRunner.start(),該線程會被創建。每一個配置的PollableSource與它本來的運行一個PollingRunnable的線程關聯。該線程管理PollableSource的生命周期,例如starting和stopping。一個PollableSource實現必須實現strat()和stop()方法,它們在LifecycleAware接口中聲明。PollableSource運行調用Source的process()方法。process()方法應該檢查新的數據並把它以Flume Events的形式存儲在Channel中。註意這裏有兩種Sources。PollableSource已經被提及啦。另一種是EventDrivenSource。EventDrivenSource,不同於PollableSource,必須有它自己的調用機制去識別新數據並把新數據存在Channel。EventDrivenSources不是由它們本身的線程驅動的。

Channel:

暫無

flume1.8 開發指南學習感悟