Flume---大數據協作框架

flume是什麼

Apache Flume是一個分佈式的、可靠的、易用的系統,可以有效地將來自很多不同源系統的大量日誌數據收集、彙總或者轉移到一個數據中心存儲。

Apache Flume的作用不僅限於日誌彙總,因爲數據源是可以自定義的,Flume也可以被用於傳輸大量的事件數據,包括但不限於網絡流量數據、社交媒體產生的數據、電子郵件和幾乎所有可能的數據源。

安裝flume

  
  
  
  1. tar -zxvf flume-ng-1.5.0-cdh5.3.6.tar.gz -C /opt/cdh-5.3.6

  2. vi flume-env.sh

  3. export JAVA_HOME=/opt/modules/jdk1.7.0_67

架構圖

<img src="https://github.com/lilang-jianxin/images/blob/master/flume/flume%E6%9E%B6%E6%9E%84%E5%9B%BE.PNG?raw=true" alt="!image" />

flume特點

flume的數據流由事件(Event)貫穿始終。事件是Flume的基本數據單位,它攜帶日誌數據(字節數組形式)並且攜帶有頭信息,這些Event由Agent外部的Source生成,當Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel中。可以把Channel看作是一個緩衝區,它將保存事件直到Sink處理完該事件。Sink負責持久化日誌或者把事件推向另一個Source。

flume可靠性

當節點出現故障時,日誌能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:end-to-end(收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;如果數據發送失敗,可以重新發送。),Store on failure(這也是scribe採用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送),Besteffort(數據發送到接收方後,不會進行確認)。

flume的一些核心概念

Agent使用JVM 運行Flume。每臺機器運行一個agent,但是可以在一個agent中包含多個sources和sinks。

Client生產數據,運行在一個獨立的線程。

Source從Client收集數據,傳遞給Channel。

Sink從Channel收集數據,運行在一個獨立線程。

Channel連接 sources 和 sinks ,這個有點像一個隊列。

Events可以是日誌記錄、 avro 對象等。

Flume提供了大量內置的Source、Channel和Sink類型。不同類型的Source,Channel和Sink可以自由組合。組合方式基於用戶設置的配置文件,非常靈活。比如:Channel可以把事件暫存在內存裏,也可以持久化到本地硬盤上。Sink可以把日誌寫入HDFS, HBase,甚至是另外一個Source等等

flume的使用

  • 設置代理
    Flume代理配置存儲在本地配置文件中。這是一個遵循Java屬性文件格式的文本文件。一個或多個代理的配置可以在同一個配置文件中指定。配置文件包括代理中每個源,宿和通道的屬性以及它們如何連接在一起以形成數據流。

  • 小例子

  
  
  
  1. example.conf:單節點Flume配置

  2. #將該代理商的組件命名爲

  3. a1.sources  =  r1

  4. a1.sinks  =  k1

  5. a1.channels  =  c1

  6. #描述/配置源

  7. a1.sources.r1.type  =  netcat

  8. a1.sources.r1.bind  =  hadoop.jianxin.com

  9. a1.sources.r1.port  =  44444

  10. #描述sink

  11. a1.sinks.k1.type  =  logger

  12. #使用緩衝內存中事件的通道

  13. a1.channels.c1.type  =  memory

  14. a1.channels.c1.capacity  =  1000

  15. a1.channels.c1.transactionCapacity  =  100

  16. #將信源和信宿綁定到信道

  17. a1.sources.r1.channels  =  c1

  18. a1.sinks.k1.channel  =  c1

啓動方式

  
  
  
  1. bin / flume-ng agent --conf conf --conf -file example.conf --name a1 -Dflume.root.logger = INFOconsole

常用的source

  • NetCat source:用來監聽一個指定端口,並將接收到的數據的每一行轉換爲一個事件。

  • avro source:avro可以監聽和收集指定端口的日誌,使用avro的source需要說明被監聽的主機ip和端口號

  
  
  
  1. #將該代理商的組件命名爲

  2. a1.sources  =  r1

  3. a1.sinks  =  k1

  4. a1.channels  =  c1

  5. #描述/配置源

  6. a1.sources.r1.type  =  avro

  7. a1.sources.r1.bind  =  hadoop.jianxin.com

  8. a1.sources.r1.port  =  3306

  9. #描述sink

  10. a1.sinks.k1.type  =  logger

  11. #使用緩衝內存中事件的通道

  12. a1.channels.c1.type  =  memory

  13. a1.channels.c1.capacity  =  100

  14. a1.channels.c1.transactionCapacity  =  10

  15. #將信源和信宿綁定到信道

  16. a1.sources.r1.channels  =  c1

  17. a1.sinks.k1.channel  =  c1

  • exec source:可以通過指定的操作對日誌進行讀取,使用exec時需要指定shell命令,對日誌進行讀取


  • Spooling-directory source:可以讀取文件夾裏的日誌,使用時指定一個文件夾,可以讀取該文件夾中的所有文件,當出現新文件時會讀取該文件並獲取數據.需要注意的是該文件夾中的文件在讀取過程中不能修改,同時文件名也不能修改。


  1. spoolDirectory是監控目錄,不能爲空,沒有默認值。這個source不具有監控子目錄的功能,也就是不能遞歸監控。如果需要,這需要自己去實現,http://blog.csdn.net/yangbutao/article/details/8835563 這裏有遞歸檢測的實現;


  2. completedSuffix是文件讀取完畢後給完成文件添加的標記後綴,默認是".COMPLETED";


  3. deletePolicy這是是否刪除讀取完畢的文件,默認是"never",就是不刪除,目前只支持"never"和“IMMEDIATE”;


  4. fileHeader是否在event的Header中添加文件名,boolean類型, 默認false


  5. fileHeaderKey這是event的Header中的key,value是文件名


  6. batchSize這個是一次處理的記錄數,默認是100;


  7. inputCharset編碼方式,默認是"UTF-8";


  8. ignorePattern忽略符合條件的文件名


  9. trackerDirPath被處理文件元數據的存儲目錄,默認".flumespool"


  10. deserializerType將文件中的數據序列化成event的方式,默認是“LINE”---org.apache.flume.serialization.LineDeserializer


  11. deserializerContext這個主要用在Deserializer中設置編碼方式outputCharset和文件每行最大長度maxLineLength。


常見的channel

  • memory channel:內存

  
  
  
  1. a1.channels = c1

  2. a1.channels.c1.type = memory

  3. a1.channels.c1.capacity = 10000

  4. a1.channels.c1.transactionCapacity = 10000

  5. a1.channels.c1.byteCapacityBufferPercentage = 20

  6. a1.channels.c1.byteCapacity = 800000

  • Kafka Channel

  
  
  
  1. a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel

  2. a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9092,kafka-2:9092,kafka-3:9092

  3. a1.channels.channel1.kafka.topic = channel1

  4. a1.channels.channel1.kafka.consumer.group.id = flume-consumer

  • File Channel

常見的sink

  • logger sink:將收集到的日誌寫到flume的log

  • avro sink:可以將接受到的日誌發送到指定端口,供級聯agent的下一跳收集和接受日誌,使用時需要指定目的ip和端口

  
  
  
  1. a1.sinks=k1

  2. a1.sinks.k2.type = avro

  3. a1.sinks.k2.channel = c2

  4. a1.sinks.k2.hostname = hadoop03 (指定的主機名或ip)

  5. a1.sinks.k2.port = 16666  (指定的端口號)

  • hdfs sink:將收集到的日誌寫入到新創建的文件中保存起來,存儲路徑爲分佈式的文件系統hdfs的路徑,同時hdfs創建新文件的週期可以是時間,也可以是文件的大小,還可以是採集日誌的條數

  
  
  
  1. path:寫入hdfs的路徑,需要包含文件系統標識,比如:hdfs://namenode/flume/webdata/

  2. 可以使用flume提供的日期及%{host}表達式。

  3. filePrefix 默認值:FlumeData 寫入hdfs的文件名前綴,可以使用flume提供的日期及%{host}表達式。

  4. fileSuffix:寫入hdfs的文件名後綴,比如:.lzo .log等。

  5. inUsePrefix:臨時文件的文件名前綴,hdfs sink會先往目標目錄中寫臨時文件,再根據相關規則重命名成最終目標文件;

  6. inUseSuffi: 默認值:.tmp  臨時文件的文件名後綴。

  7. rollInterval:  默認值:30  hdfs sink間隔多長將臨時文件滾動成最終目標文件,單位:秒;

  8. 如果設置成0,則表示不根據時間來滾動文件;

  9. 注:滾動(roll)指的是,hdfs sink將臨時文件重命名成最終目標文件,並新打開一個臨時文件來寫入數據;

  10. rollSize  默認值:1024 當臨時文件達到該大小(單位:bytes)時,滾動成目標文件;

  11. 如果設置成0,則表示不根據臨時文件大小來滾動文件;

  12. rollCount  默認值:10  events數據達到該數量時候,將臨時文件滾動成目標文件;

  13. 如果設置成0,則表示不根據events數據來滾動文件;

  14. idleTimeout  默認值:0

  15. 當目前被打開的臨時文件在該參數指定的時間(秒)內,沒有任何數據寫入,則將該臨時文件關閉並重命名成目標文件;

  16. batchSize   默認值:100  每個批次刷新到HDFS上的events數量;

  17. codeC  文件壓縮格式,包括:gzip, bzip2, lzo, lzop, snappy

  18. fileType  默認值:SequenceFile

  19. 文件格式,包括:SequenceFile, DataStream,CompressedStream 當使用DataStream時候,文件不會被壓縮,不需要設置hdfs.codeC;當使用CompressedStream時候,必須設置一個正確的hdfs.codeC值;

  20. maxOpenFiles  默認值:5000 最大允許打開的HDFS文件數,當打開的文件數達到該值,最早打開的文件將會被關閉;

  21. minBlockReplicas  默認值:HDFS副本數   寫入HDFS文件塊的最小副本數。該參數會影響文件的滾動配置,一般將該參數配置成1,纔可以按照配置正確滾動文件。

  22. writeFormat  sequence文件的格式。包含:Text, Writable(默認)

  23. callTimeout  默認值:10000 執行HDFS操作的超時時間(單位:毫秒);

  24. threadsPoolSize  默認值:10  hdfs sink啓動的操作HDFS的線程數。

  25. rollTimerPoolSize  默認值:1  hdfs sink啓動的根據時間滾動文件的線程數。

  26. kerberosPrincipal HDFS安全認證kerberos配置;

  27. kerberosKeytab

  28. HDFS安全認證kerberos配置;

  29. proxyUser  代理用戶

  30. round 默認值:false  是否啓用時間上的”捨棄”,這裏的”捨棄”,類似於”四捨五入”,後面再介紹。如果啓用,則會影響除了%t的其他所有時間表達式;

  31. roundValue  默認值:1   時間上進行“捨棄”的值;

  32. roundUnit  默認值:seconds 時間上進行”捨棄”的單位,包含:second,minute,hour

  33. a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S

  34. a1.sinks.k1.hdfs.round = true

  35. a1.sinks.k1.hdfs.roundValue = 10

  36. a1.sinks.k1.hdfs.roundUnit = minute

  37. 當時間爲2015-10-16 17:38:59時候,hdfs.path依然會被解析爲:

  38. /flume/events/20151016/17:30/00

  39. 因爲設置的是捨棄10分鐘內的時間,因此,該目錄每10分鐘新生成一個。

  40. timeZone

  41. 默認值:Local Time  時區。

  42. useLocalTimeStamp 默認值:flase  是否使用當地時間。

  43. closeTries:默認值:0

  44. hdfs sink關閉文件的嘗試次數;

  45. 如果設置爲1,當一次關閉文件失敗後,hdfs sink將不會再次嘗試關閉文件,這個未關閉的文件將會一直留在那,並且是打開狀態。

  46. 設置爲0,當一次關閉失敗後,hdfs sink會繼續嘗試下一次關閉,直到成功。

  47. retryInterval

  48. 默認值:180(秒)

  49. hdfs sink嘗試關閉文件的時間間隔,如果設置爲0,表示不嘗試,相當於於將hdfs.closeTries設置成1.

  50. Serializer  默認值:TEXT

  51. 序列化類型。其他還有:avro_event或者是實現了EventSerializer.Builder的類名。

  • Hbase sink:hbase是一種數據庫,可以儲存日誌,使用時需要指定存儲日誌的表名和列族名,然後agent就可以將收集到的日誌逐條插入到數據庫中。

  
  
  
  1. tableName:要寫入的HBase數據表名,不能爲空;

  2. columnFamily:數據表對應的列簇名,這個sink目前只支持一個列簇,不能爲空;

  3. batchSize:每次事務可以處理的最大Event數量,默認是100

  4. eventSerializerType:用來將event寫入HBase,即將event轉化爲put。默認是org.apache.flume.sink.hbase.SimpleHbaseEventSerializer,還有一個是RegexHbaseEventSerializer,即適合HBaseSinkSerializer只有這倆,否則自己定製;

  5. serializerContext:是eventSerializerType的配置信息,就是配置文件中包含“serializer.”的項;

  6. 例子:

  7. agent1.sinks = k1

  8. agent1.sinks.k1.type = hbase

  9. agent1.sinks.k1.table = flume

  10. agent1.sinks.k1.columnFamily=fl_conf

  11. agent1.sinks.k1.serializer=org.apache.flume.sink.hbase.RegexHbaseEventSerializer

綜合小案例

  
  
  
  1. #將該代理商的組件命名爲

  2. a1.sources  =  r1

  3. a1.sinks  =  k1

  4. a1.channels  =  c1

  5. #描述/配置源

  6. a1.sources.r1.type  =  avro

  7. a1.sources.r1.bind  =  hadoop.jianxin.com

  8. a1.sources.r1.port  =  3306

  9. #描述sink

  10. a1.sinks.k1.type  =  logger

  11. #使用緩衝內存中事件的通道

  12. a1.channels.c1.type  =  memory

  13. a1.channels.c1.capacity  =  100

  14. a1.channels.c1.transactionCapacity  =  10

  15. #將信源和信宿綁定到信道

  16. a1.sources.r1.channels  =  c1

  17. a1.sinks.k1.channel  =  c1

  18. a2.sources=r2

  19. a2.sinks=k2

  20. a2.channels=c2

  21. #描述/配置源

  22. a2.sources.r2.type=exec

  23. a2.sources.r2.command=tail -f /opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6/logs/hive.log

  24. a2.sources.r2.shell=/bin/bash -c

  25. #使用緩衝內存中事件的通道

  26. a2.channels.c2.type=memory

  27. a1.channels.c2.capacity  =  100

  28. a1.channels.c2.transactionCapacity  =  10

  29. #描述sink

  30. a2.sinks.k2.type=hdfs

  31. a2.sinks.k2.hdfs.path=hdfs://hadoop.jianxin.com:9000/user/jianxin/flume/hive/date/%Y%m%d

  32. a2.sinks.k2.hdfs.fileType=DataStream

  33. a2.sinks.k2.hdfs.writeFormat=Text

  34. #Format for sequence file records. One of Text or Writable.

  35. #Set to Text before creating data files with Flume,

  36. #otherwise those files cannot be read by either Apache Impala (incubating) or Apache Hive.

  37. a2.sinks.k2.hdfs.batchSize=10

  38. #number of events written to file before it is flushed to HDFS

  39. a2.sinks.k2.hdfs.useLocalTimeStamp=true

  40. #將信源和信宿綁定到信道

  41. a2.sources.r2.channels=c2

  42. a2.sinks.k2.channel=c2

運行小案例

  
  
  
  1. #啓動的會是a2source

  2. bin/flume-ng agent --conf conf --conf-file conf/conf.file --name a2 -Dflume.root.logger=INFO,console

  3. nohup bin/flume-ng agent --conf conf --conf-file conf/conf.file --name a2 -Dflume.root.logger=INFO,console > /data/flume-1.5.0-cdh5.3.6/flume.log 2>&1 &

參考 https://blog.csdn.net/wei_hhh/article/details/77838999 flume 官網 http://flume.apache.org/FlumeUserGuide.html


本文分享自微信公衆號 - 我愛問讀書(wawds_)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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