Flume是Cloudera提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統。Flume基於流式架構,靈活簡單。web
主要做用:實時讀取服務器本地磁盤數據,將數據寫入HDFS;apache
優勢:緩存
Flume使用兩個獨立的事務分別負責從soucrce到channel,以及從channel到sink的事件傳遞。一旦事務中全部的數據所有成功提交到channel,那麼source才認爲該數據讀取完成。同理,只有成功被sink寫出去的數據,纔會從channel中移除;失敗後就從新提交;安全
組成:Agent 由 source+channel+sink構成;服務器
source是數據來源的抽象,sink是數據去向的抽象;網絡
Source
Source是負責接收數據到Flume Agent的組件。Source組件能夠處理各類類型、各類格式的日誌數據
數據輸入端輸入類型:spooling directory(spooldir)文件夾裏邊的數據不停的滾動、exec 命令的執行結果被採集
syslog系統日誌、avro上一層的flume、netcat網絡端傳輸的數據架構
Channel
Channel是位於Source和Sink之間的緩衝區。所以,Channel容許Source和Sink運做在不一樣的速率上。Channel是線程安全的,能夠同時處理幾個Source的寫入操做和幾個Sink的讀取操做。
Flume自帶兩種Channel:Memory Channel和File Channel。
Memory Channel是內存中的隊列。Memory Channel在不須要關心數據丟失的情景下適用。若是須要關心數據丟失,那麼Memory Channel就不該該使用,由於程序死亡、機器宕機或者重啓都會致使數據丟失。
File Channel將全部事件寫到磁盤。所以在程序關閉或機器宕機的狀況下不會丟失數據。負載均衡
Channel選擇器是決定Source接收的一個特定事件寫入哪些Channel的組件,它們告知Channel處理器,而後由其將事件寫入到每一個Channel。dom
Channel Selector有兩種類型:Replicating Channel Selector(default,會把全部的數據發給全部的Channel)和Multiplexing Chanell Selector(選擇把哪一個數據發到哪一個channel)和自定義選擇器;分佈式
Source 發送的 Event 經過 Channel 選擇器來選擇以哪一種方式寫入到 Channel 中,Flume 提供三種類型 Channel 選擇器,分別是複製、複用和自定義選擇器。
複製選擇器: 一個 Source 以複製的方式將一個 Event 同時寫入到多個 Channel 中,不一樣的 Sink 能夠從不一樣的 Channel 中獲取相同的 Event,好比一份日誌數據同時寫 Kafka 和 HDFS,一個 Event 同時寫入兩個 Channel,而後不一樣類型的 Sink 發送到不一樣的外部存儲。該選擇器複製每一個事件到經過Source的channels參數所指定的全部的Channels中。複製Channel選擇器還有一個可選參數optional,該參數是空格分隔的channel名字列表。此參數指定的全部channel都認爲是可選的,因此若是事件寫入這些channel時,如有失敗發生,會忽略。而寫入其餘channel失敗時會拋出異常。
2.(多路)複用選擇器: 須要和攔截器配合使用,根據 Event 的頭信息中不一樣鍵值數據來判斷 Event 應該寫入哪一個 Channel 中。
還有一種是kafka channel,它是沒有sink;
3. 自定義選擇器
Sink
數據去向常見的目的地有:HDFS、Kafka、logger(記錄INFO級別的日誌)、avro(下一層的Flume)、File、Hbase、solr、ipc、thrift自定義等
Sink不斷地輪詢Channel中的事件且批量地移除它們,並將這些事件批量寫入到存儲或索引系統、或者被髮送到另外一個Flume Agent。
Sink是徹底事務性的。在從Channel批量刪除數據以前,每一個Sink用Channel啓動一個事務。批量事件一旦成功寫出到存儲系統或下一個Flume Agent,Sink就利用Channel提交事務。事務一旦被提交,該Channel從本身的內部緩衝區刪除事件。
Sink groups容許組織多個sink到一個實體上。 Sink processors(處理器)可以提供在組內全部Sink之間實現負載均衡的能力,並且在失敗的狀況下可以進行故障轉移從一個Sink到另外一個Sink。簡單的說就是一個source 對應一個Sinkgroups,即多個sink,這裏實際上覆用/複製狀況差很少,只是這裏考慮的是可靠性與性能,即故障轉移與負載均衡的設置。
DefaultSink Processor 接收單一的Sink,不強制用戶爲Sink建立Processor
FailoverSink Processor故障轉移處理器會經過配置維護了一個優先級列表。保證每個有效的事件都會被處理。
工做原理是將連續失敗sink分配到一個池中,在那裏被分配一個冷凍期,在這個冷凍期裏,這個sink不會作任何事。一旦sink成功發送一個event,sink將被還原到live 池中。
Load balancing Processor負載均衡處理器提供在多個Sink之間負載平衡的能力。實現支持經過① round_robin(輪詢)或者② random(隨機)參數來實現負載分發,默認狀況下使用round_robin
事務
Put事務流程:
doPut將批數據先寫入臨時緩衝區putList; doCommit:檢查channel內存隊列是否足夠合併; doRollback:channel內存隊列空間不足,回滾數據;
嘗試put先把數據put到putList裏邊,而後commit提交,查看channel中事務是否提交成功,若是都提交成功了就把這個事件從putList中拿出來;若是失敗就重寫提交,rollTback到putList;
Take事務:
doTake先將數據取到臨時緩衝區takeList; doCommit若是數據所有發送成功,則清除臨時緩衝區takeList; doRollback數據發送過程當中若是出現異常,rollback將臨時緩存takeList中的數據歸還給channel內存隊列;
拉取事件到takeList中,嘗試提交,若是提交成功就把takeList中數據清除掉;若是提交失敗就重寫提交,返回到channel後重寫提交;
這種事務:flume有可能有重複的數據;
傳輸單元,Flume數據傳輸的基本單元,以事件的形式將數據從源頭送至目的地。 Event由可選的header和載有數據的一個byte array 構成。Header是容納了key-value字符串對的HashMap。
攔截器(interceptor)
攔截器是簡單插件式組件,設置在Source和Source寫入數據的Channel之間。每一個攔截器實例只處理同一個Source接收到的事件。
由於攔截器必須在事件寫入channel以前完成轉換操做,只有當攔截器已成功轉換事件後,channel(和任何其餘可能產生超時的source)纔會響應發送事件的客戶端或sink。
Flume官方提供了一些經常使用的攔截器,也能夠自定義攔截器對日誌進行處理。自定義攔截器只需如下幾步:
實現org.apache.flume.interceptor.Interceptor接口
① 串聯:channel多,但flume層數不宜過多;這種模式是將多個flume給順序鏈接起來了,從最初的source開始到最終sink傳送的目的存儲系統。此模式不建議橋接過多的flume數量, flume數量過多不只會影響傳輸速率,並且一旦傳輸過程當中某個節點flume宕機,會影響整個傳輸系統。
② 單source,多channel、sink; 一個channel對應多個sink; 多個channel對應多個sink;
---->sink1 ---->channel1 --->sink1
單source ---> channel----->sink2 source
----->sink3 ------>channel2---->sink2
Flume支持將事件流向一個或者多個目的地。這種模式將數據源複製到多個channel中,每一個channel都有相同的數據,sink能夠選擇傳送的不一樣的目的地。
③ 負載均衡 Flume支持使用將多個sink邏輯上分到一個sink組,flume將數據發送到不一樣的sink,主要解決負載均衡和故障轉移問題。
負載均衡 :並排的三個channel都是輪詢,好處是增大流量而且保證數據的安全;(一個掛了,三個不會都掛;緩衝區比較長,若是hdfs出現問題,兩層的channel,多個flune的並聯能夠保證數據的安全且增大緩衝區)
④ Flume agent聚合 平常web應用一般分佈在上百個服務器,大者甚至上千個、上萬個服務器。產生的日誌,處理起來也很是麻煩。用flume的這種組合方式能很好的解決這一問題,每臺服務器部署一個flume採集日誌,傳送到一個集中收集日誌的flume,再由此flume上傳到hdfs、hive、hbase、jms等,進行日誌分析。
監控端口數據:
端口(netcat)--->flume--->Sink(logger)到控制檯
實時讀取本地文件到HDFS:
hive.log(exec)--->flume--->Sink(HDFS)
取Linux系統中的文件,就得按照Linux命令的規則執行命令。因爲Hive日誌在Linux系統中因此讀取文件的類型選擇:exec即execute執行的意思。表示執行Linux命令來讀取文件。
實時讀取目錄文件到HDFS:
目錄dir(spooldir)--->flume--->Sink(HDFS)
單Source多Channel、Sink
單數據源多出口(選擇器):單Source多Channel、Sink
hive.log(exec)---->flume1--Sink1(avro)-->flume2--->Sink(HDFS)
---Sink2(avro)-->flume3--->Sink(file roll本地目錄文件data)
單Source、Channel多Sink(負載均衡)
Flume 的負載均衡和故障轉移
目的是爲了提升整個系統的容錯能力和穩定性。簡單配置就能夠輕鬆實現,首先須要設置 Sink 組,同一個 Sink 組內有多個子 Sink,不一樣 Sink 之間能夠配置成負載均衡或者故障轉移。
單數據源多出口(Sink組): flum1-load_balance
端口(netcat)--->flume1---Sink1(avro)-->flume2---Sink(Logger控制檯)
---Sink2(avro)-->flume3---Sink(Logger控制檯)
多Source彙總數據到單Flume