目錄
------------聲明部分
------------定義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六大實戰案列(待更新)