flume面試理論和應用
理論
- 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事件是一個資料流單元。
快取乾的事:上下游速度不一樣問題,比如採集的快,下沉的慢
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.檢視
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
相關文章
- 【帶權並查集】理論和應用並查集
- Flume面試題整理面試題
- 【分散式】CAP理論及其應用分散式
- OPF理論在回合RPG中的分析和應用
- 從眾理論想到的分析應用
- Flume架構以及應用介紹[轉]架構
- 大資料流處理:Flume、Kafka和NiFi對比大資料KafkaNifi
- 變點理論CUSUM在擇時交易中的應用
- 應用TRIZ理論優化設計便捷式榨汁機優化
- 物流理論在專案成本控制中的應用(轉)
- 重用體系理論實際應用的初步探索(轉)
- 面向面試題和實際應用談Promise面試題Promise
- 快速入門——深度學習理論解析與實戰應用深度學習
- 理論+應用,帶你瞭解資料庫資源池資料庫
- 理論+案例,帶你掌握Angular依賴注入模式的應用Angular依賴注入模式
- TRIZ理論在洗碗機設計中應用探討
- 金山AI團隊:從理論突破到應用場景落地AI
- 關於 Service Worker 和 Web 應用對應關係的討論Web
- Redis專案實戰---應用及理論(二)---Redis叢集原理Redis
- TRIZ理論在電極材料應用中的可行性分析
- 完全開源!快速上手 AI 理論及應用實戰來了AI
- 如何應用TRIZ理論設計機械式打瓜排種器?
- TRIZ理論在數字化轉型中的應用體現
- 前端面試題目蒐集——理論知識篇前端面試題
- 如何運用TRIZ理論與企業自身需求融合應用進行創新?
- Flume+Kafka收集Docker容器內分散式日誌應用實踐KafkaDocker分散式
- 針對flume中扇出複用(源exec)原始碼修改,並編譯flume原始碼編譯
- 關於“斯金納箱”及相關理論在遊戲設計中應用的討論遊戲設計
- [技術討論]再談新概念的建立和應用
- 應用TRIZ理論解決AGV產品靈活性差的問題
- 混沌理論和專案管理(轉)專案管理
- Flume學習——Flume的架構架構
- 分散式理論(二) - BASE理論分散式
- 一些實用的職場理論
- 騰訊遊戲學院專家:PBR渲染模型的理論及具體應用遊戲模型
- TRIZ理論在提高AGV導航系統可靠性中的應用
- 基於ERP理論對軟體中物料“單位”應用分析(轉)
- 大資料開發-Flume-頻繁產生小檔案原因和處理大資料