Flume實戰開發配置

example 1.

實際開發中我們常用的是把Flume採集的日誌按照指定的格式傳到HDFS上,爲我們的離線分析提供數據支撐

我們使用二個主機進行數據的生產與採集,簡單的了寫了一個腳本,

服務器 hadoop1

#!/bin/bash
#打印100次文本到dynamic.log文本中
for((i=1;i<=100;i++))
do
  echo $i hello,wolrd   >>  /usr/local/dynamic.log
done
然後使用定時任務crontab 去定時執行

crontab -e去編譯定時任務

*/1 * * * *   sh /usr/local/printData.sh(一分鐘執行一次這個腳本)

crontab -l 查看我們編輯的定時任務

 

然後配置Flume來採集這臺機子的數據

#a2代表agent,一個agent由source,channel,sink組成
a2.sources = r1                   
a2.sinks = k1                    
a2.channels = c1                  
 
# Describe/configure the source  配置source組件
a2.sources.r1.type = exec         
a2.sources.r1.command =tail -F /usr/local/dynamic.log 
a2.sources.r1.shell= /bin/sh -c

# Describe the sink   
a2.sinks.k1.type = avro
a2.sinks.k1.channel = c1
a2.sinks.k1.hostname = hadoop3      (Arvo通過rpc 發送的數據IP,hadoop3我做了網絡映射可以直接寫Hadoop3,沒有做的過就寫你要傳送的機器ip)     
a2.sinks.k1.port = 16888                     (Arvo通過rpc 發送的數端口)


# Use a channel which buffers events in memory     
a2.channels.c1.type = memory          

       
# Bind the source and sink to the channel           
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1
 

我們hadoop1使用Flume架構是   Exec Source => Memory Channel=> Avro Sink

然後我們準備hadoop3服務器,作爲數據接收端來使用

Flume採用的架構是 Avro Source=> File Channel=> HDFS Sink

然後我們編輯conf

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = avro
a1.sources.r1.bind = hadoop3
a1.sources.r1.port = 16888


# Use a channel which buffers events in memory
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /usr/local/flume_data/checkpointDir
a1.channels.c1.dataDirs = /usr/local/flume_data/dir
a1.channels.c1.maxFileSize = 2146435071
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1.capacity = 10000000
 

#sink to hdfs
a1.sinks.k1.type = hdfs

#文件的格式是/flume/年月日/小時
a1.sinks.k1.hdfs.path = hdfs://hadoop3:8020/flume/%Y%m%d/%H
#文件的前綴
a1.sinks.k1.hdfs.filePrefix = logs-
#設置多少events寫到hdfs
a1.sinks.k1.hdfs.batchSize = 1000
#是否按照時間滾動文件夾
a1.sinks.k1.hdfs.round = true
##多少時間單位創建一個新的文件夾
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 = 1000
##多久生成一個新的文件
a1.sinks.k1.hdfs.rollInterval = 30
##設置每個文件的滾動大小
a1.sinks.k1.hdfs.rollSize = 134217700
##文件的滾動與 Event 數量無關
a1.sinks.k1.hdfs.rollCount = 0
 

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
 

注意:MemoryChannel提供高吞吐的性能,同時在斷電和程序崩潰之後會造成數據丟失。因此需要開發一個持久化的Channel。File Channel的目標是提供一個可靠的高吞吐Channel。File Channel保證當事務被提交後,不會因爲一系列程序崩潰或者掉電而造成數據丟失。所以開發我們一般都會纔會File Channel,測試的話就方便隨意了

 

然後我們hadoop3的Flume ng,注意一定要先啓動這個,這個是提供端口服務的。

nohup sh bin/flume-ng  agent --conf /usr/local/flume-1.8.0/ --conf-file conf/example4.conf --name a1 logger.conf -Dflume.root.logger=INFO,console &

我們採用的是後臺啓動 ,使用nohup 和&,日誌就會輸出在nohup.out

 

服務正常啓動,然後我們啓動hadoop1的Flume

 

然後我們的定時腳本就會一分鐘執行一次了,然後hadoop1的Flume就是收集這一分鐘的數據進行傳輸,然後查看你hadoop的文件夾的數據,這個example就到此結束了。

 

 

example2:

Flume採集數據,Sink到kafka的topic中,這纔是我們企業中常用的例子

配置還都使用上面的配置,只需要把hadoop3這臺機器sink的配置改成kafka就行了

# Describe the sink 
a2.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a2.sinks.k1.kafka.topic = bosir
a2.sinks.k1.kafka.bootstrap.servers = 192.168.1.4:9092
a2.sinks.k1.kafka.flumeBatchSize = 100
a2.sinks.k1.kafka.producer.acks = 1
a2.sinks.k1.kafka.producer.max.request.size = 500
 

其他的不變.

這樣我們就能通過hadoop1機器上的flume採集到的文件通過該avro傳輸到hadoop3的機器上,然後hadoop3在sink到kafka中,給sparkStreaming提供數據分析。

note:配置過程中如果沒有出現我們想到的結果可以檢測防火牆,端口,以及kafka的監聽端口

發現和解決問題的過程纔是愉快的,有問題歡迎加入qq羣 56461419,一起討論學習交流進步.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章