flume面試理論和應用

Take your time_發表於2020-10-20

理論

  • Flume是一個分散式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統
  • Flume可以採集檔案,socket資料包、檔案、資料夾、kafka等各種形式源資料,又可以將採集到的資料(下沉sink)輸出到HDFS、hbase、hive、kafka等眾多外部儲存系統中
  • 一般的採集需求,通過對flume的簡單配置即可實現
  • Flume針對特殊場景也具備良好的自定義擴充套件能力,
    因此,flume可以適用於大部分的日常資料採集場景

Flume分散式系統中最核心的角色是agent,flume採集系統就是由一個個agent所連線起來形成

每一個agent相當於一個資料傳遞員,內部有三個元件:

  • Source:採集元件,用於跟資料來源對接,以獲取資料
  • Channel:傳輸通道元件,用於從source將資料傳遞到sink,類似於快取
  • Sink:下沉元件,用於往下一級agent傳遞資料或者往最終儲存系統傳遞資料
  • Source 到 Channel 到 Sink之間傳遞資料的形式是Event事件;Event事件是一個資料流單元。

快取乾的事:上下游速度不一樣問題,比如採集的快,下沉的慢

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-xZP6HpoK-1603156924527)(4032AF22E895430DB7B6DC4505ED1984)]

在這裡插入圖片描述

flume是什麼?

flume是一個分散式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統

flume分散式系統中最核心的角色是什麼?

是agent,flume採集系統就是由一個個agent所連線起來形成的

flume中,每一個agent相當於一個資料傳遞員,內部有三個元件,是什麼?

  • source:負責採集
    • 可採集socket資料包、檔案、資料夾、kafka等各種形式源資料
    • netcat (資料包的形式)
    • spooldir(目錄的形式)
    • exec(檔案的形式)
    • avro source(可以級聯)
  • Channel:負責傳輸,類似於快取
  • Sink:負責下沉
    • 可下沉輸出到HDFS、hbase、hive、kafka等外部儲存系統中
    • hdfs、avro sink

source到channel到sink之間傳遞資料的形式是什麼?

event事件,event事件是一個資料流單元

flume常用的source有哪些?

socket資料包、檔案、資料夾、kafka等各種形式資料來源

flume常用的channel有哪些?

  • Menory channel
    • 基於記憶體的,對資料要求不是很高 丟了沒事,比較快,佔記憶體,可能會資料丟失
  • file channel
    • 會落地磁碟
  • kafka channel
    • 採集到資料之間下沉到kafka

flume常用的sink有哪些

hdsf、hbase、hive、kafka等外部儲存系統

瞭解flume的負載均衡和故障轉移嗎?

設定sink組,同一個sink組內有多個sink,不同sink之間可以配置負載均衡或故障轉移。

  • 負載均衡
source中的event流經channel,進入sink group,在sink group中根據負載演算法選擇sink,然後選擇不同機器上的agent實現負載均衡。
  • 故障轉移
故障轉移機制的工作方式是將失敗的sink放到一個池中,
並在池中為它們分配一段冷凍期,在重試之前隨著連續的失敗而增加。
一個sink成功傳送event後,將其恢復到活動池。
sink有一個與它們相關聯的優先順序,數字越大表示優先順序越高。
如果一個sink在傳送event時失敗,則下一個具有最高優先順序的sink將被嘗試用於傳送事件。

1.採集目錄到hdfs

採集需求:某伺服器的某特定目錄下,會不斷產生新的檔案,每當有新檔案出現,就需要把檔案採集到HDFS中去
根據需求,首先定義以下3大要素

  • 資料來源元件,即source ——監控檔案目錄 : spooldir
spooldir特性:
   1、監視一個目錄,只要目錄中出現新檔案,就會採集檔案中的內容
   2、採集完成的檔案,會被agent自動新增一個字尾:COMPLETED
   3、所監視的目錄中不允許重複出現相同檔名的檔案
  • 下沉元件,即sink——HDFS檔案系統 : hdfs sink
  • 通道元件,即channel——可用file channel 也可以用記憶體channel

1.配置檔案編寫

cd  /export/servers/apache-flume-1.6.0-cdh5.14.0-bin/conf

mkdir -p /export/servers/dirfile

vim spooldir.conf
整個配置檔案就四步
1.source
2.channel
3.sink
4.三者的拓撲關係


# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
##注意:不能往監控目中重複丟同名檔案
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /export/servers/dirfile
a1.sources.r1.fileHeader = true
# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = hdfs://node01:8020/spooldir/files/%y-%m-%d/%H%M/
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollInterval = 3
a1.sinks.k1.hdfs.rollSize = 20
a1.sinks.k1.hdfs.rollCount = 5
a1.sinks.k1.hdfs.batchSize = 1
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#生成的檔案型別,預設是Sequencefile,可用DataStream,則為普通文字
a1.sinks.k1.hdfs.fileType = DataStream
# 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

Channel引數解釋:

  • capacity:預設該通道中最大的可以儲存的event數量
  • trasactionCapacity:每次最大可以從source中拿到或者送到sink中的event數量
  • keep-alive:event新增到通道中或者移出的允許時間

2.啟動

cd /export/servers/apache-flume-1.6.0-cdh5.14.0-bin/

bin/flume-ng agent -c ./conf -f ./conf/spooldir.conf -n a1 -Dflume.root.logger=INFO,console

3.上傳檔案

上傳檔案到指定目錄

將不同的檔案上傳到下面目錄裡面去,注意檔案不能重名

cd /export/servers/dirfile

4.檢視

在這裡插入圖片描述

在這裡插入圖片描述

2.採集檔案到hdfs

採集需求:比如業務系統使用log4j生成的日誌,日誌內容不斷增加,需要把追加到日誌檔案中的資料實時採集到hdfs

根據需求,首先定義以下3大要素

  • 採集源,即source——監控檔案內容更新 : exec ‘tail -F file’
  • 下沉目標,即sink——HDFS檔案系統 : hdfs sink
  • Source和sink之間的傳遞通道——channel,可用file channel 也可以用 記憶體channel

1.配置檔案

cd /export/servers/apache-flume-1.6.0-cdh5.14.0-bin/conf

vim tail-file.conf
agent1.sources = source1
agent1.sinks = sink1
agent1.channels = channel1

# Describe/configure tail -F source1
agent1.sources.source1.type = exec
agent1.sources.source1.command = tail -F /export/servers/taillogs/access_log
agent1.sources.source1.channels = channel1

#configure host for source
#agent1.sources.source1.interceptors = i1
#agent1.sources.source1.interceptors.i1.type = host
#agent1.sources.source1.interceptors.i1.hostHeader = hostname

# Describe sink1
agent1.sinks.sink1.type = hdfs
#a1.sinks.k1.channel = c1
agent1.sinks.sink1.hdfs.path = hdfs://node01:8020/weblog/flume-collection/%y-%m-%d/%H-%M
agent1.sinks.sink1.hdfs.filePrefix = access_log
agent1.sinks.sink1.hdfs.maxOpenFiles = 5000
agent1.sinks.sink1.hdfs.batchSize= 100
agent1.sinks.sink1.hdfs.fileType = DataStream
agent1.sinks.sink1.hdfs.writeFormat =Text
agent1.sinks.sink1.hdfs.rollSize = 102400
agent1.sinks.sink1.hdfs.rollCount = 1000000
agent1.sinks.sink1.hdfs.rollInterval = 60
agent1.sinks.sink1.hdfs.round = true
agent1.sinks.sink1.hdfs.roundValue = 10
agent1.sinks.sink1.hdfs.roundUnit = minute
agent1.sinks.sink1.hdfs.useLocalTimeStamp = true

# Use a channel which buffers events in memory
agent1.channels.channel1.type = memory
agent1.channels.channel1.keep-alive = 120
agent1.channels.channel1.capacity = 500000
agent1.channels.channel1.transactionCapacity = 600

# Bind the source and sink to the channel
agent1.sources.source1.channels = channel1
agent1.sinks.sink1.channel = channel1

在這裡插入圖片描述

2.啟動flume

cd  /export/servers/apache-flume-1.6.0-cdh5.14.0-bin

bin/flume-ng agent -c conf -f conf/tail-file.conf -n agent1  -Dflume.root.logger=INFO,console

3.開發shell指令碼定時追加檔案內容

mkdir -p /export/servers/shells/

cd  /export/servers/shells/

vim tail-file.sh
#!/bin/bash
while true
do
 date >> /export/servers/taillogs/access_log;
  sleep 0.5;
done

建立資料夾

mkdir -p /export/servers/taillogs

啟動指令碼

sh /export/servers/shells/tail-file.sh

4.檢視

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-sC0hY6kA-1603156924549)(115B91956A5941919CEB1DDF4AAD379F)][外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-LllyUAQV-1603156924552)(E1DA630576CF46D78D458C17869C868F)][外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-mmG7nF5a-1603156924555)(F60D769225AB44829ABDCBB81DFBC93A)]

在這裡插入圖片描述

3.兩個agent級聯

  • 扇入 (多個agent採集 最後交給一個agent)

在這裡插入圖片描述

需求分析:

第一個agent負責收集檔案當中的資料,通過網路傳送到第二個agent當中去,第二個agent負責接收第一個agent傳送的資料,並將資料儲存到hdfs上面去

1.node02安裝flume

將node03機器上面解壓後的flume資料夾拷貝到node02機器上面去

cd  /export/servers
scp -r apache-flume-1.6.0-cdh5.14.0-bin/ node02:$PWD

2.node02配置flume配置檔案

在node02機器配置我們的flume

cd /export/servers/apache-flume-1.6.0-cdh5.14.0-bin/conf
vim tail-avro-avro-logger.conf
##################
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /export/servers/taillogs/access_log
a1.sources.r1.channels = c1
# Describe the sink
##sink端的avro是一個資料傳送者
a1.sinks = k1
a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 192.168.72.130
a1.sinks.k1.port = 4141
a1.sinks.k1.batch-size = 10
# 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

3.node02開發指令碼檔案往檔案寫入資料

直接將node03下面的指令碼和資料拷貝到node02即可,node03機器上執行以下命令

cd  /export/servers
scp -r shells/ taillogs/ node02:$PWD

4.node03開發flume配置檔案

在node03機器上開發flume的配置檔案

cd /export/servers/apache-flume-1.6.0-cdh5.14.0-bin/conf
vim avro-hdfs.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
##source中的avro元件是一個接收者服務
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = 192.168.72.130
a1.sources.r1.port = 4141
# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://node01:8020/avro/hdfs/%y-%m-%d/%H%M/
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollInterval = 3
a1.sinks.k1.hdfs.rollSize = 20
a1.sinks.k1.hdfs.rollCount = 5
a1.sinks.k1.hdfs.batchSize = 1
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#生成的檔案型別,預設是Sequencefile,可用DataStream,則為普通文字
a1.sinks.k1.hdfs.fileType = DataStream
# 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

5.順序啟動

  • node03機器啟動flume程式
cd /export/servers/apache-flume-1.6.0-cdh5.14.0-bin
bin/flume-ng agent -c conf -f conf/avro-hdfs.conf -n a1  -Dflume.root.logger=INFO,console  
  • node02機器啟動flume程式
cd /export/servers/apache-flume-1.6.0-cdh5.14.0-bin/
bin/flume-ng agent -c conf -f conf/tail-avro-avro-logger.conf -n a1  -Dflume.root.logger=INFO,console 
  • node02機器啟shell指令碼生成檔案
cd  /export/servers/shells
sh tail-file.sh

相關文章