Linux環境Flume安裝配置及使用
1. 認識Flume
(1) Flume介紹
- 日誌收集系統
- 官網:http://flume.apache.org/
- 概述:Flume是一種分散式,可靠且可用的服務,用於有效地收集,聚合和移動大量日誌資料。它具有基於流資料流的簡單靈活的架構。它具有可靠的可靠性機制和許多故障轉移和恢復機制,具有強大的容錯性。它使用簡單的可擴充套件資料模型,允許線上分析應用程式。
- 大資料階段:
- <1>. 資料採集(爬蟲/日誌資料/flume)
- <2>. 資料儲存(hdfs/hive/hbase(nosql))
- <3>. 資料計算(mapreduce/hive/sparkSQL/sparkStreaming/flink)
- <4>. 資料視覺化(echart/quickBI)
(2) Flume角色
- <1>. source
- 資料來源,使用者從資料發生器採集接收資料,source產生資料流,同時會把產生的資料流以Flume的event格式傳輸到一個或者多個channel。
- <2>. channel
- 傳輸通道,短暫的儲存容器,將從source處接收到的event格式的資料以佇列形式快取起來,直到它們被sinks消費掉,它在source和sink間起橋樑的作用,channal是一個完整的事務,這一點保證了資料在收發的時候的一致性. 並且它可以和任意數量的source和sink連結。
- <3>. sink
- 下沉,用於消費channel傳輸的資料,將資料來源傳遞到目標源,目標可能是另一個sink,也可能HDFS、HBase,最終將資料儲存到集中儲存器。
- <4>. event
- 在flume中使用事件作為傳輸的基本單元。
(3) Flume使用
- 簡單易用,只需要寫配置檔案即可。
2. Flume-1.6.0安裝配置流程
(1) Flume環境前提:
- Java執行環境
(2) 解壓apache-flume-1.6.0-bin.tar.gz安裝包到目標目錄下:
tar -zxvf .tar.gz -C 目標目錄
(3) 為後續方便,重新命名Flume資料夾:
mv apache-flume-1.6.0-bin/ flume-1.6.0
(4) 修改配置檔案:
- 進入flume-1.6.0/conf路徑,重新命名配置檔案:
mv flume-env.sh.template flume-env.sh
- 修改flume-env.sh資訊:
vi flume-env.sh
-
# Enviroment variables can be set here. export JAVA_HOME=jdk路徑 複製程式碼
(5) 配置環境變數:
- 修改配置檔案:
vi /etc/profile
- 增加以下內容:
export FLUME_HOME=flume安裝路徑
export PATH=$PATH:$FLUME_HOME/bin
- 宣告環境變數:
source /etc/profile
(6) 啟動
flume-ng agent
使用ng啟動agent--conf YYYY/
指定配置所在的資料夾--name a1
指定的agent別名--conf-file YYYY/XXXXXX
指定配置檔案-Dflume.root.logger=INFO,console
可選,指定日誌輸出級別(輸出到控制檯)&
可選,Flume在後臺執行- 舊版本:flume-og ——在bin目錄下檢視
3. Flume監聽埠
(1) 編輯配置檔案:
- 在flume/conf目錄下,建立配置檔案flumejob_telnet.conf:
vi flumejob_telnet.conf
-
# Flume監聽埠——配置檔案 # Name the components on this agent 定義變數方便呼叫 加s可以有多個此角色 a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source 描述source角色 進行內容定製 # 此配置屬於tcp source 必須是netcat型別 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(file) 使用記憶體 總大小1000 每次傳輸100 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel 一個source可以繫結多個channel # 一個sink繫結一個channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 複製程式碼
- 儲存並退出:
:wq
(2) NetCat
- 介紹:netcat是網路工具中的“瑞士軍刀”,它能通過TCP和UDP在網路中讀寫資料。通過與其他工具結合和重定向,你可以在指令碼中以多種方式使用它。netcat所做的就是在兩臺電腦之間建立連結並返回兩個資料流。
- 安裝:
yum install nc
(3) Telnet
- 介紹:telnet協議是TCP/IP協議族中的一員,是Internet遠端登入服務的標準協議和主要方式。它為使用者提供了在本地計算機上完成遠端主機工作的能力。在終端使用者的電腦上使用telnet程式,用它連線到伺服器。終端使用者可以在telnet程式中輸入命令,這些命令會在伺服器上執行,就像直接在伺服器的控制檯上輸入一樣。可以在本地就能控制伺服器。
- 安裝:
yum install telnet.x86_64
(4) 執行:
- 啟動Flume:
flume-ng agent --conf conf/ --name a1 --conf-file conf/flumejob_telnet.conf -Dflume.root.logger=INFO,console
- 開啟客戶端副本:
telnet localhost 44444
- 在副本輸入資料,客戶端會收到相關監聽資訊
4. Flume監聽本地Linux-hive日誌檔案採集到HDFS
(1) 編輯配置檔案:
- 在flume/conf目錄下,建立配置檔案flumejob_hdfs.conf:
vi flumejob_hdfs.conf
-
# Flume監聽本地Linux-hive日誌檔案採集到HDFS——配置檔案 # Name the components on this agent agent別名設定 a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source 設定資料來源監聽本地檔案配置 # exec 執行一個命令的方式去檢視檔案 tail -F 實時檢視 a1.sources.r1.type = exec # 要執行的指令碼command tail -F 預設10行 man tail 檢視幫助 # 監聽hive操作日誌 a1.sources.r1.command = tail -F /tmp/root/hive.log # 執行這個command使用的是哪個指令碼 -c 指定使用什麼命令 # whereis bash # bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz a1.sources.r1.shell = /usr/bin/bash -c # Describe the sink 設定sink # 指定sink型別 a1.sinks.k1.type = hdfs # 指定HDFS路徑 %Y%m%d/%H%M%S 日期時間 ————修改項 a1.sinks.k1.hdfs.path = hdfs://bigdata01:9000/flume/%Y%m%d/%H-%M #上傳檔案的字首 a1.sinks.k1.hdfs.filePrefix = logs- #是否按照時間滾動資料夾 a1.sinks.k1.hdfs.round = true #多少時間單位建立一個新的資料夾 秒 (預設30s) a1.sinks.k1.hdfs.roundValue = 1 #重新定義時間單位(每分鐘滾動一個資料夾) a1.sinks.k1.hdfs.roundUnit = minute #是否使用本地時間戳 a1.sinks.k1.hdfs.useLocalTimeStamp = true #積攢多少個 Event 才 flush 到 HDFS 一次 a1.sinks.k1.hdfs.batchSize = 500 #設定檔案型別,可支援壓縮 a1.sinks.k1.hdfs.fileType = DataStream #多久生成一個新的檔案 秒 a1.sinks.k1.hdfs.rollInterval = 30 #設定每個檔案的滾動大小 位元組(最好128M) a1.sinks.k1.hdfs.rollSize = 134217700 #檔案的滾動與 Event 數量無關 a1.sinks.k1.hdfs.rollCount = 0 #最小冗餘數(備份數 生成滾動功能則生效roll hadoop本身有此功能 無需配置) 1份 不冗餘 a1.sinks.k1.hdfs.minBlockReplicas = 1 # Use a channel which buffers events in memory 設定channel 使用記憶體 總大小1000 每次傳輸100 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel 指定channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 複製程式碼
- 儲存並退出:
:wq
(2) Flume+Hive
- 把Hive相關Hadoop依賴包匯入Flume:
- 進入Flume包路徑:
cd /XXXX/flume/lib
- 上傳相關jar包
- 進入Flume包路徑:
(3) 執行:
- 啟動Flume:
flume-ng agent --conf conf/ --name a1 --conf-file conf/flumejob_hdfs.conf
- 之後操作Hive,相關日誌檔案上傳至hdfs指定目錄
5. Flume監聽本地資料夾
(1) 編輯配置檔案:
- 在flume/conf目錄下,建立配置檔案flumejob_dir.conf:
vi flumejob_dir.conf
-
# Flume監聽資料夾 # Name the components on this agent agent別名設定 a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source 設定資料來源監聽本地檔案配置 a1.sources.r1.type = spooldir # 監控的資料夾 a1.sources.r1.spoolDir = /root/testdir # 上傳成功後顯示字尾名 a1.sources.r1.fileSuffix = .COMPLETED # 加絕對路徑的檔名 預設為false a1.sources.r1.fileHeader = true # 忽略所有以.tmp結尾的檔案(正在被寫入) # ^以任何開頭 出現無限次 以.tmp結尾的檔案 a1.sources.r1.ignorePattern = ([^ ]*\.tmp) # Describe the sink 設定sink 下沉到hdfs # 指定sink型別 a1.sinks.k1.type = hdfs # 指定HDFS路徑 %Y%m%d/%H%M%S 日期時間 ————修改項 a1.sinks.k1.hdfs.path = hdfs://bigdata01:9000/flume/testdir/%Y%m%d/%H-%M # 上傳檔案的字首 a1.sinks.k1.hdfs.filePrefix = testdir- #是否按照時間滾動資料夾 a1.sinks.k1.hdfs.round = true #多少時間單位建立一個新的資料夾 (預設30s) a1.sinks.k1.hdfs.roundValue = 1 #重新定義時間單位 a1.sinks.k1.hdfs.roundUnit = hour #是否使用本地時間戳 a1.sinks.k1.hdfs.useLocalTimeStamp = true #積攢多少個 Event 才 flush 到 HDFS 一次 a1.sinks.k1.hdfs.batchSize = 100 #設定檔案型別,可支援壓縮 a1.sinks.k1.hdfs.fileType = DataStream #多久生成一個新的檔案 秒 a1.sinks.k1.hdfs.rollInterval = 600 #設定每個檔案的滾動大小 位元組(最好128M) a1.sinks.k1.hdfs.rollSize = 134217700 #檔案的滾動與 Event 數量無關 a1.sinks.k1.hdfs.rollCount = 0 #最小冗餘數(備份數 生成滾動功能則生效roll hadoop本身有此功能 無需配置) 1份 不冗餘 a1.sinks.k1.hdfs.minBlockReplicas = 1 # Use a channel which buffers events in memory 設定channel 使用記憶體 總大小1000 每次傳輸100 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel 指定channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 複製程式碼
- 儲存並退出:
:wq
(2) 執行:
- 啟動Flume:
flume-ng agent --conf conf/ --name a1 --conf-file conf/flumejob_dir.conf
- 之後對指定的資料夾進行操作,相關資料夾檔案資訊上傳至hdfs指定目錄。
- 注意資料夾內只能有檔案不能有目錄。
6. Flume多channel結構配置
(1) 實現目標
- 獲取資料來源後由Flume-a1進行處理,分兩個埠傳送資料,Flume-a2接收到資料後經過處理下沉到hdfs,Flume-a3接收到資料後經過處理下沉到本地。
- 流程圖如下:
(2) 編輯配置檔案1:
- 在flume/conf目錄下,建立配置檔案flumejob_a1.conf:
vi flumejob_a1.conf
-
# Flume多channel結構配置a1 # Name the components on this agent agent別名設定 a1.sources = r1 a1.sinks = k1 k2 a1.channels = c1 c2 # 將資料流複製給多個channel a1.sources.r1.selector.type = replicating # Describe/configure the source 設定資料來源監聽本地檔案配置 # exec 執行一個命令的方式去檢視檔案 tail -F 實時檢視 a1.sources.r1.type = exec # 要執行的指令碼command tail -F 預設10行 man tail 檢視幫助 # 監聽hive操作日誌 a1.sources.r1.command = tail -F /tmp/root/hive.log # 執行這個command使用的是哪個指令碼 -c 指定使用什麼命令 # whereis bash # bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz a1.sources.r1.shell = /usr/bin/bash -c # Describe the sink 設定sink # 分兩個埠傳送資料 a1.sinks.k1.type = avro a1.sinks.k1.hostname = bigdata01 a1.sinks.k1.port = 4141 a1.sinks.k2.type = avro a1.sinks.k2.hostname = bigdata01 a1.sinks.k2.port = 4142 # Use a channel which buffers events in memory 設定channel 使用記憶體 總大小1000 每次傳輸100 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 a1.channels.c2.type = memory a1.channels.c2.capacity = 1000 a1.channels.c2.transactionCapacity = 100 # Bind the source and sink to the channel 指定channel a1.sources.r1.channels = c1 c2 a1.sinks.k1.channel = c1 a1.sinks.k2.channel = c2 複製程式碼
- 儲存並退出:
:wq
(3) 編輯配置檔案2:
- 在flume/conf目錄下,建立配置檔案flumejob_a2.conf:
vi flumejob_a2.conf
-
# Flume多channel結構配置a2 # 接收a1資料下沉到hdfs # Name the components on this agent agent別名設定 a2.sources = r1 a2.sinks = k1 a2.channels = c1 # Describe/configure the source 設定資料來源監聽本地檔案配置 a2.sources.r1.type = avro # 獲取資料 a2.sources.r1.bind = bigdata01 a2.sources.r1.port = 4141 # Describe the sink 設定sink # 指定sink型別 a2.sinks.k1.type = hdfs # 指定HDFS路徑 %Y%m%d/%H%M%S 日期時間 ————修改項 a2.sinks.k1.hdfs.path = hdfs://bigdata01:9000/flume1/%Y%m%d/%H-%M # 上傳檔案的字首 a2.sinks.k1.hdfs.filePrefix = flume1- # 是否按照時間滾動資料夾 a2.sinks.k1.hdfs.round = true # 多少時間單位建立一個新的資料夾 (預設30s) a2.sinks.k1.hdfs.roundValue = 1 # 重新定義時間單位(每分鐘滾動一個資料夾) a2.sinks.k1.hdfs.roundUnit = hour # 是否使用本地時間戳 a2.sinks.k1.hdfs.useLocalTimeStamp = true # 積攢多少個 Event 才 flush 到 HDFS 一次 a2.sinks.k1.hdfs.batchSize = 100 # 設定檔案型別,可支援壓縮 a2.sinks.k1.hdfs.fileType = DataStream # 多久生成一個新的檔案 秒 a2.sinks.k1.hdfs.rollInterval = 600 # 設定每個檔案的滾動大小 位元組(最好128M) a2.sinks.k1.hdfs.rollSize = 134217700 # 檔案的滾動與 Event 數量無關 a1.sinks.k1.hdfs.rollCount = 0 # 最小冗餘數(備份數 生成滾動功能則生效roll hadoop本身有此功能 無需配置) 1份 不冗餘 a2.sinks.k1.hdfs.minBlockReplicas = 1 # Use a channel which buffers events in memory 設定channel 使用記憶體 總大小1000 每次傳輸100 a2.channels.c1.type = memory a2.channels.c1.capacity = 1000 a2.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel 指定channel a2.sources.r1.channels = c1 a2.sinks.k1.channel = c1 複製程式碼
- 儲存並退出:
:wq
(4) 編輯配置檔案3:
- 在flume/conf目錄下,建立配置檔案flumejob_a3.conf:
vi flumejob_a3.conf
-
# Flume多channel結構配置a3 # 接收a1資料下沉到本地 # Name the components on this agent agent別名設定 a3.sources = r1 a3.sinks = k1 a3.channels = c1 # Describe/configure the source 設定資料來源監聽本地檔案配置 a3.sources.r1.type = avro # 獲取資料 a3.sources.r1.bind = bigdata01 a3.sources.r1.port = 4142 # Describe the sink 設定sink # 指定sink型別 a3.sinks.k1.type = file_roll a3.sinks.k1.sink.directory = /root/flume1 # Use a channel which buffers events in memory 設定channel 使用記憶體 總大小1000 每次傳輸100 a3.channels.c1.type = memory a3.channels.c1.capacity = 1000 a3.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel 指定channel a3.sources.r1.channels = c1 a3.sinks.k1.channel = c1 複製程式碼
- 儲存並退出:
:wq
- **注意:**本地資料夾需要提前建立好
(5) 執行:
- 啟動Flume-a1:
flume-ng agent --conf conf/ --name a1 --conf-file conf/flumejob_a1.conf
- 啟動Flume-a2:
flume-ng agent --conf conf/ --name a2 --conf-file conf/flumejob_a2.conf
- 啟動Flume-a3:
flume-ng agent --conf conf/ --name a3 --conf-file conf/flumejob_a3.conf
- a1最先啟動,a2、a3先後啟動順序無限制。