flume--入門概念與配置詳解

目錄

Flume概述

安裝教程

配置文件解析

------------聲明部分

------------定義sources部分

------------定義channels部分

------------定義sinks部分

------------綁定部分

Flume概述

Flume定義
Flume是Cloudera提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統。Flume基於流式架構,靈活簡單。
在這裏插入圖片描述

2 Flume的優點

  • 可以和任意存儲進程集成。
  • 輸入的的數據速率大於寫入目的存儲的速率,flume會進行緩衝,減小hdfs的壓力。
  • flume中的事務基於channel,使用了兩個事務模型(sender + receiver),確保消息被可靠發送。
    Flume使用兩個獨立的事務分別負責從soucrce到channel,以及從channel到sink的事件傳遞。一旦事務中所有的數據全部成功提交到channel,那麼source才認爲該數據讀取完成。同理,只有成功被sink寫出去的數據,纔會從channel中移除。

3 Flume組成架構
Flume組成架構如圖1-1,圖1-2所示:
在這裏插入圖片描述
在這裏插入圖片描述

下面我們來詳細介紹一下Flume架構中的組件。

Agent

Agent是一個JVM進程,它以事件的形式將數據從源頭送至目的。
Agent主要有3個部分組成,Source、Channel、Sink。

Source

Source是負責接收數據到Flume Agent的組件。Source組件可以處理各種類型、各種格式的日誌數據,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。

Channel

Channel是位於Source和Sink之間的緩衝區。因此,Channel允許Source和Sink運作在不同的速率上。Channel是線程安全的,可以同時處理幾個Source的寫入操作和幾個Sink的讀取操作。
Flume自帶兩種Channel:Memory Channel和File Channel。
Memory Channel是內存中的隊列。Memory Channel在不需要關心數據丟失的情景下適用。如果需要關心數據丟失,那麼Memory Channel就不應該使用,因爲程序死亡、機器宕機或者重啓都會導致數據丟失。
File Channel將所有事件寫到磁盤。因此在程序關閉或機器宕機的情況下不會丟失數據。

Sink

Sink不斷地輪詢Channel中的事件且批量地移除它們,並將這些事件批量寫入到存儲或索引系統、或者被髮送到另一個Flume Agent。
Sink是完全事務性的。在從Channel批量刪除數據之前,每個Sink用Channel啓動一個事務。批量事件一旦成功寫出到存儲系統或下一個Flume Agent,Sink就利用Channel提交事務。事務一旦被提交,該Channel從自己的內部緩衝區刪除事件。
Sink組件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定義。

Event

傳輸單元,Flume數據傳輸的基本單元,以事件的形式將數據從源頭送至目的地。 Event由可選的header和載有數據的一個byte array 構成。Header是容納了key-value字符串對的HashMap。
在這裏插入圖片描述

Flume拓撲結構

-串聯模式

這種模式是將多個flume給順序連接起來了,從最初的source開始到最終sink傳送的目的存儲系統。此模式不建議橋接過多的flume數量, flume數量過多不僅會影響傳輸速率,而且一旦傳輸過程中某個節點flume宕機,會影響整個傳輸系統。

在這裏插入圖片描述

.- 單source多源

在這裏插入圖片描述

  • 負載

Flume支持使用將多個sink邏輯上分到一個sink組,flume將數據發送到不同的sink,主要解決負載均衡和故障轉移問題。

在這裏插入圖片描述

  • Agent聚合

種模式是我們最常見的,也非常實用,日常web應用通常分佈在上百個服務器,大者甚至上千個、上萬個服務器。產生的日誌,處理起來也非常麻煩。用flume的這種組合方式能很好的解決這一問題,每臺服務器部署一個flume採集日誌,傳送到一個集中收集日誌的flume,再由此flume上傳到hdfs、hive、hbase、jms等,進行日誌分析。

在這裏插入圖片描述

Flume Agent內部原理

在這裏插入圖片描述

安裝步驟(基於linux)

  • 下載安裝包
    http://archive.apache.org/dist/flume/
  • 安裝部署
    1)將apache-flume-1.7.0-bin.tar.gz上傳到linux的/opt/software目錄下
    2)解壓apache-flume-1.7.0-bin.tar.gz到/opt/module/目錄下
    [@hadoop102 software]$ tar -zxf apache-flume-1.7.0-bin.tar.gz -C /opt/module/
    3)修改apache-flume-1.7.0-bin的名稱爲flume
    [@hadoop102 module]$ mv apache-flume-1.7.0-bin flume
    4)將flume/conf下的flume-env.sh.template文件修改爲flume-env.sh,並配置flume-env.sh文件
    [@hadoop102 conf]$ mv flume-env.sh.template flume-env.sh
    [@hadoop102 conf]$ vi flume-env.sh
    export JAVA_HOME=/opt/module/jdk1.8.0_144

配置文件詳解

flume配置文件整體分爲五個部分,

  • 聲明sources,sinks,channels
  • 定義sources
  • 定義sinks
  • 定義channels
  • 綁定sources,sinks,channels

舉例:(監聽44444端口)

看不懂?沒關係,後面會分五個部分進行解析,看完了再回來看這個案列

# 聲明
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# 定義 source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

#定義 sink
a1.sinks.k1.type = logger

#定義 channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 綁定
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

聲明

這裏聲明一個agent叫a1,併爲a1聲明瞭sources,sinks,channels

a1.sources = r1
a1.sinks = k1
a1.channels = c1

定義sources

  • Flume中常用的Source有NetCat,Avro,Exec,Spooling Directory,Taildir,也可以根據業務場景的需要自定義Source,具體介紹如下。

NetCat Source

  • 用於監聽端口數據
type@              –          類型指定爲:netcat
bind@              –          綁定機器名或IP地址
port@              –          端口號
max-line-length   512         一行的最大字節數
ack-every-event   true        對成功接受的Event返回OK
selector.type   replicating   選擇器類型replicating or multiplexing
selector.*                    選擇器相關參數
interceptors       –          攔截器列表,多個以空格分隔
interceptors.*                攔截器相關參數

Avro Source

  • 用於不同主機的兩個flume Agent的互相綁定
type@                        –              類型指定爲:avro
bind@                        –              監聽的主機名或IP地址
port@                        –              端口號
threads                      –              傳輸可使用的最大線程數
selector.type        
selector.*       
interceptors                 –              攔截器列表
interceptors.*       
compression-type            none            可設置爲“none” 或 “deflate”. 壓縮類型需要和AvroSource匹配

Exec Source

  • 用於監聽文件,通過執行給定的Unix命令處理傳輸結果數據,如,cat,tail -F等,
type@                       –                    類型指定爲:exec
command@                    –                    需要去執行的命令
shell                       –                    運行命令的shell腳本文件
restartThrottle           10000                  嘗試重啓的超時時間
restart                   false                  如果命令執行失敗,是否重啓
logStdErr                 false                  是否記錄錯誤日誌
batchSize                  20                    批次寫入channel的最大日誌數量
batchTimeout              3000                   批次寫入數據的最大等待時間(毫秒)
selector.type          replicating               選擇器類型replicating or multiplexing
selector.*                                       選擇器其他參數
interceptors                –                    攔截器列表,多個空格分隔
interceptors.*       

如:

a1.sources.r1.type = exec
#指定監聽的文件
a1.sources.r1.command = tail -F /opt/module/hive/logs/hive.log
a1.sources.r1.shell = /bin/bash -c

Spooling Directory Source

  • 用於監聽整個目錄的文件變化
  • 使用Spooling Directory Source需要注意的兩點是:
  • 1)不能對被監控的文件夾下的新增的文件做出任何更改,
  • 2)新增到監控文件夾的文件名稱必須是唯一的。由於是對整個新增文件的監控,Spooling Directory Source的實時性相對較低,不過可以採用對文件高粒度分割達到近似實時。
type@                            –                類型指定:spooldir.
spoolDir@                        –                被監控的文件夾目錄
fileSuffix                  .COMPLETED            完成數據傳輸的文件後綴標誌
deletePolicy                   never              刪除已經完成數據傳輸的文件時間:never or immediate
fileHeader                     false              是否在header中添加文件的完整路徑信息
fileHeaderKey                   file              如果header中添加文件的完整路徑信息時key的名稱
basenameHeader                 false              是否在header中添加文件的基本名稱信息
basenameHeaderKey             basename            如果header中添加文件的基本名稱信息時key的名稱
includePattern                 ^.*$               使用正則來匹配新增文件需要被傳輸數據的文件
ignorePattern                   ^$                使用正則來忽略新增的文件
trackerDir                  .flumespool           存儲元數據信息目錄
consumeOrder                  oldest              文件消費順序:oldest, youngest and random.
maxBackoff                     4000               如果channel容量不足,嘗試寫入的超時時間,如果仍然不能寫入,則會拋出ChannelException
batchSize                      100                批次處理粒度
inputCharset                  UTF-8               輸入碼錶格式
decodeErrorPolicy              FAIL               遇到不可解碼字符後的處理方式:FAIL,REPLACE,IGNORE
selector.type               replicating           選擇器類型:replicating or multiplexing
selector.*                                        選擇器其他參數
interceptors                    –                 攔截器列表,空格分隔
interceptors.*  

如:

a3.sources.r3.type = spooldir

a3.sources.r3.spoolDir = /opt/module/flume/upload
a3.sources.r3.fileSuffix = .COMPLETED
a3.sources.r3.fileHeader = true

定義Channels

  • 官網提供的Channel有多種類型可供選擇,這裏介紹Memory Channel和File Channel。

Memory Channel

  • Memory Channel是使用內存來存儲Event,使用內存的意味着數據傳輸速率會很快,但是當Agent掛掉後,存儲在Channel中的數據將會丟失。
Property Name                 Default                Description
type@                            –                   類型指定爲:memory
capacity                        100                  存儲在channel中的最大容量
transactionCapacity             100                  從一個source中去或者給一個sink,每個事務中最大的事件數
keep-alive                       3                   對於添加或者刪除一個事件的超時的秒鐘
byteCapacityBufferPercentage    20                   定義緩存百分比
byteCapacity              see description            Channel中允許存儲的最大字節總數

如:

a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000
a1.channels.c2.transactionCapacity = 100

File Channel
File Channel使用磁盤來存儲Event,速率相對於Memory Channel較慢,但數據不會丟失。

Property Name            Default                  Description    
type@                      –                      類型指定:file.
checkpointDir   ~/.flume/file-channel/checkpoint  checkpoint目錄
useDualCheckpoints       false                    備份checkpoint,爲True,backupCheckpointDir必須設置
backupCheckpointDir        –                      備份checkpoint目錄
dataDirs    ~/.flume/file-channel/data           數據存儲所在的目錄設置
transactionCapacity      10000                    Event存儲最大值
checkpointInterval       30000                    checkpoint間隔時間
maxFileSize            2146435071                 單一日誌最大設置字節數
minimumRequiredSpace    524288000                 最小的請求閒置空間(以字節爲單位)
capacity                 1000000                  Channel最大容量
keep-alive                 3                      一個存放操作的等待時間值(秒)
use-log-replay-v1         false                   Expert: 使用老的回覆邏輯
use-fast-replay           false                   Expert: 回覆不需要隊列
checkpointOnClose         true         

定義Sinks

  • Flume常用Sinks有Log Sink,HDFS Sink,Avro Sink,Kafka Sink,當然也可以自定義Sink。

Logger Sink

  • Logger Sink以INFO 級別的日誌記錄到log日誌中,這種方式通常用於測試。
type@                   –               類型指定:logger
maxBytesToLog           16               能夠記錄的最大Event Body字節數  

HDFS Sink

  • Sink數據到HDFS,目前支持text 和 sequence files兩種文件格式,支持壓縮,並可以對數據進行分區,分桶存儲。
type@                     –                  指定類型:hdfs
hdfs.path@                –                  HDFS的路徑,eg hdfs://namenode/flume/webdata/
hdfs.filePrefix        FlumeData             保存數據文件的前綴名
hdfs.fileSuffix           –                  保存數據文件的後綴名
hdfs.inUsePrefix          –                  臨時寫入的文件前綴名
hdfs.inUseSuffix         .tmp                臨時寫入的文件後綴名
hdfs.rollInterval         30                 間隔多長將臨時文件滾動成最終目標文件,單位:秒,
                                             如果設置成0,則表示不根據時間來滾動文件
hdfs.rollSize            1024                當臨時文件達到多少(單位:bytes)時,滾動成目標文件,
                                             如果設置成0,則表示不根據臨時文件大小來滾動文件
hdfs.rollCount            10                 當 events 數據達到該數量時候,將臨時文件滾動成目標文件,
                                             如果設置成0,則表示不根據events數據來滾動文件
hdfs.idleTimeout          0                  當目前被打開的臨時文件在該參數指定的時間(秒)內,
                                             沒有任何數據寫入,則將該臨時文件關閉並重命名成目標文件
hdfs.batchSize           100                 每個批次刷新到 HDFS 上的 events 數量
hdfs.codeC                –                  文件壓縮格式,包括:gzip, bzip2, lzo, lzop, snappy
hdfs.fileType         SequenceFile           文件格式,包括:SequenceFile, DataStream,CompressedStre,
                                             當使用DataStream時候,文件不會被壓縮,不需要設置hdfs.codeC;
                                             當使用CompressedStream時候,必須設置一個正確的hdfs.codeC值;
hdfs.maxOpenFiles        5000                最大允許打開的HDFS文件數,當打開的文件數達到該值,
                                             最早打開的文件將會被關閉
hdfs.minBlockReplicas     –                  HDFS副本數,寫入 HDFS 文件塊的最小副本數。
                                             該參數會影響文件的滾動配置,一般將該參數配置成1,纔可以按照配置正確滾動文件
hdfs.writeFormat        Writable             寫 sequence 文件的格式。包含:Text, Writable(默認)
hdfs.callTimeout         10000               執行HDFS操作的超時時間(單位:毫秒)
hdfs.threadsPoolSize      10                 hdfs sink 啓動的操作HDFS的線程數
hdfs.rollTimerPoolSize    1                  hdfs sink 啓動的根據時間滾動文件的線程數
hdfs.kerberosPrincipal    –                  HDFS安全認證kerberos配置
hdfs.kerberosKeytab       –                  HDFS安全認證kerberos配置
hdfs.proxyUser                               代理用戶
hdfs.round              false                是否啓用時間上的”捨棄”
hdfs.roundValue           1                  時間上進行“捨棄”的值
hdfs.roundUnit          second               時間上進行”捨棄”的單位,包含:second,minute,hour
hdfs.timeZone         Local Time             時區。
hdfs.useLocalTimeStamp  false                是否使用當地時間
hdfs.closeTries 0       Number               hdfs sink 關閉文件的嘗試次數;
                                             如果設置爲1,當一次關閉文件失敗後,hdfs sink將不會再次嘗試關閉文件,
                                             這個未關閉的文件將會一直留在那,並且是打開狀態;
                                             設置爲0,當一次關閉失敗後,hdfs sink會繼續嘗試下一次關閉,直到成功
hdfs.retryInterval        180                hdfs sink 嘗試關閉文件的時間間隔,
                                             如果設置爲0,表示不嘗試,相當於於將hdfs.closeTries設置成1
serializer               TEXT                序列化類型
serializer.*                 

如:


# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://hadoop102:9000/flume/%Y%m%d/%H
#上傳文件的前綴
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照時間滾動文件夾
a2.sinks.k2.hdfs.round = true
#多少時間單位創建一個新的文件夾
a2.sinks.k2.hdfs.roundValue = 1
#重新定義時間單位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地時間戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#積攢多少個Event才flush到HDFS一次
a2.sinks.k2.hdfs.batchSize = 1000
#設置文件類型,可支持壓縮
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一個新的文件
a2.sinks.k2.hdfs.rollInterval = 60
#設置每個文件的滾動大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滾動與Event數量無關
a2.sinks.k2.hdfs.rollCount = 0

Avro Sink

  • 同source avro ,用於與不同主機的flume Agent連接
    type@                        –                  指定類型:avro.
    hostname@                    –                  主機名或IP
    port@                        –                  端口號
    batch-size                  100                 批次處理Event數
    connect-timeout            20000                連接超時時間
    request-timeout            20000                請求超時時間
    compression-type            none                壓縮類型,“none” or “deflate”.
    compression-level            6                  壓縮級別,0表示不壓縮,1-9數字越大,壓縮比越高
    ssl                        false                使用ssl加密

Kafka Sink

  • 傳輸數據到Kafka中,需要注意的是Flume版本和Kafka版本的兼容性
Property Name              Default             Description
type                         –                 指定類型:org.apache.flume.sink.kafka.KafkaSink
kafka.bootstrap.servers      –                 kafka服務地址
kafka.topic          default-flume-topic       kafka Topic
flumeBatchSize              100                批次寫入kafka Event數
kafka.producer.acks          1                 多少個副本確認後才能確定消息傳遞成功,0表示不需要確認
                                               1表示只需要首要的副本得到確認,-1表示等待所有確認。

綁定

這裏爲Agent(a1)的sources綁定了一個channel c1,
爲sinks幫定channels c1

# 綁定
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

最後,知道了配置文件如何配置,該怎麼啓動服務呢?詳情請看下一篇文章

flume六大實戰案列(待更新)

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