1.概述
Flume是一個高可靠、高可用、分布式的用于不同數(shù)據(jù)源的流式數(shù)據(jù)采集、收集、聚合系統(tǒng)。flume最簡單的數(shù)據(jù)流模型如下圖所示。
Flume是Cloudera提供的一個高可靠、高可用、分布式的用于不同數(shù)據(jù)源的流式數(shù)據(jù)采集、收集、聚合系統(tǒng)。
Flume支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時,F(xiàn)lume提供對數(shù)據(jù)進(jìn)行簡單處理,并寫到各種數(shù)據(jù)接收方(可定制)的能力,一般的采集需求,通過對flume的簡單配置即可實現(xiàn)。針對特殊場景也具備良好的自定義擴(kuò)展能力。因此,flume可以適用于大部分的日常數(shù)據(jù)采集場景。。
Agent就是一個Java進(jìn)程,它接收來自外部的數(shù)據(jù),并將數(shù)據(jù)傳遞到數(shù)據(jù)中心(如HDFS、HBase等)或下一個Agent。一個Agent有Source、Channel、Sink三大組件組成,通過配置文件可以將組件連接在一起從而形成數(shù)據(jù)流。
Flume的核心是把數(shù)據(jù)從數(shù)據(jù)源(source)收集過來,再將收集到的數(shù)據(jù)送到指定的目的地(sink)。為了保證輸送的過程一定成功,在送到目的地(sink)之前,會先緩存數(shù)據(jù)(channel), 待數(shù)據(jù)真正到達(dá)目的地(sink)后,flume在刪除自己緩存的數(shù)據(jù)。
當(dāng)前Flume有兩個版本。Flume 0.9X版本的統(tǒng)稱Flume OG(original generation),F(xiàn)lume1.X版本的統(tǒng)稱Flume NG(next generation)。由于Flume NG經(jīng)過核心組件、核心配置以及代碼架構(gòu)重構(gòu),與Flume OG有很大不同,使用時請注意區(qū)分。改動的另一原因是將Flume納入 apache 旗下,Cloudera Flume 改名為 Apache Flume。
2. 基本概念
Client:Client生產(chǎn)數(shù)據(jù),運行在一個獨立的線程。
Event: 一個數(shù)據(jù)單元,消息頭和消息體組成。(Events可以是日志記錄、 avro 對象等。)
Flow: Event從源點到達(dá)目的點的遷移的抽象。
Agent: 一個獨立的Flume進(jìn)程,包含組件Source、 Channel、 Sink。(Agent使用JVM 運行Flume。每臺機(jī)器運行一個agent,但是可以在一個agent中包含多個sources和sinks。)
Source: 數(shù)據(jù)收集組件。(source從Client收集數(shù)據(jù),傳遞給Channel)
Channel: 中轉(zhuǎn)Event的一個臨時存儲,保存由Source組件傳遞過來的Event。(Channel連接 sources 和 sinks ,這個有點像一個隊列。)
Sink: 從Channel中讀取并移除Event, 將Event傳遞到FlowPipeline中的下一個Agent(如果有的話)(Sink從Channel收集數(shù)據(jù),運行在一個獨立線程。)
3.運行機(jī)制
Flume系統(tǒng)中核心的角色是agent,agent本身是一個Java進(jìn)程,一般運行在日志收集節(jié)點。

每一個agent相當(dāng)于一個數(shù)據(jù)傳遞員,內(nèi)部有三個組件:
Source:采集源,用于跟數(shù)據(jù)源對接,以獲取數(shù)據(jù);
Sink:下沉地,采集數(shù)據(jù)的傳送目的,用于往下一級agent傳遞數(shù)據(jù)或者往最終存儲系統(tǒng)傳遞數(shù)據(jù);
Channel:agent內(nèi)部的數(shù)據(jù)傳輸通道,用于從source將數(shù)據(jù)傳遞到sink;
在整個數(shù)據(jù)的傳輸?shù)倪^程中,流動的是event,它是Flume內(nèi)部數(shù)據(jù)傳輸?shù)淖罨締卧?。event將傳輸?shù)臄?shù)據(jù)進(jìn)行封裝。如果是文本文件,通常是一行記錄,event也是事務(wù)的基本單位。event從source,流向channel,再到sink,本身為一個字節(jié)數(shù)組,并可攜帶headers(頭信息)信息。event代表著一個數(shù)據(jù)的最小完整單元,從外部數(shù)據(jù)源來,向外部的目的地去。
Event是Flume數(shù)據(jù)流傳輸過程中的一個基本單位,由一個可選的header(鍵值對)和body組成。header主要用于表示數(shù)據(jù)屬性及路由信息,body部分存儲的是byte數(shù)組,用于表示數(shù)據(jù)本身。Event也是事務(wù)的基本單位。
4.Flume采集系統(tǒng)結(jié)構(gòu)圖
4.1.簡單結(jié)構(gòu)
單個agent采集數(shù)據(jù)

4.2.復(fù)雜結(jié)構(gòu)
多級agent之間串聯(lián)

5. 安裝啟動
安裝包下載安裝
[kevin@hadoop112 software]$ tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /opt/module/
- 改名
[kevin@hadoop112 software]$ cd /opt/module/
[kevin@hadoop112 module]$ mv apache-flume-1.9.0-bin flume-1.9.0
- 配置
[kevin@hadoop112 module]$ cd flume-1.9.0/conf/
[kevin@hadoop112 conf]$ mv flume-env.sh.template flume-env.sh
[kevin@hadoop112 conf]$ vim flume-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_241
# 優(yōu)化項
export JAVA_OPTS="-Xms1024m -Xmx3072m -Dcom.sun.management.jmxremote"
測試--監(jiān)控端口數(shù)據(jù)官方案例
- 安裝 netcat 工具
[kevin@hadoop112 flume-1.9.0]$ sudo yum install -y nc
- 判斷 44444 端口是否被占用
[kevin@hadoop112 flume-1.9.0]$ sudo netstat -tunlp | grep 44444
- 創(chuàng)建 Flume Agent 配置文件 flume-netcat-logger.conf
[kevin@hadoop112 flume-1.9.0]$ mkdir jobs
[kevin@hadoop112 flume-1.9.0]$ cd jobs/
[kevin@hadoop112 jobs]$ touch flume-netcat-logger.conf
[kevin@hadoop112 jobs]$ vim flume-netcat-logger.conf
- 在 flume-netcat-logger.conf 文件中添加如下內(nèi)容。
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
- 先開啟 flume 監(jiān)聽端口
[kevin@hadoop112 flume-1.9.0]$ bin/flume-ng agent -c conf/ -n a1 -f jobs/flume-netcat-logger.conf -Dflume.root.logger=INFO,console
這里成了阻塞進(jìn)程
參數(shù)說明:
--conf/-c:表示配置文件存儲在 conf/目錄
--name/-n:表示給 agent 起名為 a1
--conf-file/-f:flume 本次啟動讀取的配置文件是在 job 文件夾下的 flume-telnet.conf
文件。
-Dflume.root.logger=INFO,console :-D 表示 flume 運行時動態(tài)修改 flume.root.logger
參數(shù)屬性值,并將控制臺日志打印級別設(shè)置為 INFO 級別。日志級別包括:log、info、warn、
error。
- 另開一個會話,使用 netcat 工具向本機(jī)的 44444 端口發(fā)送內(nèi)容
[kevin@hadoop112 ~]$ nc localhost 44444
# 然后在這個會話隨便輸入一些內(nèi)容,回車,回看上面的阻塞進(jìn)程是否接收到這里所輸入的內(nèi)容
- 退出 Ctrl + C