最近在學習flume原始碼,所以想寫乙份flume原始碼學習的筆記供需要的朋友一起學習參考。
flume是cloudera公司開源的一款分布式、可靠地進行大量日誌資料採集、聚合和並轉移到儲存中;通過事務機制提供了可靠的訊息傳輸支援,自帶負載均衡機制來支撐水平擴充套件;並且提供了一些預設元件供直接使用。
flume目前常見的應用場景:日誌--->flume--->實時計算(如kafka+storm) 、日誌--->flume--->離線計算(如hdfs、hbase)、日誌--->flume--->elasticsearch。
flume主要分為三個元件:source、channel、sink;資料流如下圖所示:
1、source負責日誌流入,比如從檔案、網路、kafka等資料來源流入資料,資料流入的方式有兩種輪訓拉取和事件驅動;
2、channel負責資料聚合/暫存,比如暫存到記憶體、本地檔案、資料庫、kafka等,日誌資料不會在管道停留很長時間,很快會被sink消費掉;
3、sink負責資料轉移到儲存,比如從channel拿到日誌後直接儲存到hdfs、hbase、kafka、elasticsearch等,然後再有如hadoop、storm、elasticsearch之類的進行資料分析或查詢。
乙個agent會同時存在這三個元件,source和sink都是非同步執行的,相互之間不會影響。
假設我們有採集並索引nginx訪問日誌,我們可以按照如下方式部署:
1、agent和web server是部署在同一臺機器;
2、source使用execsource並使用tail命令採集日誌;
3、channel使用memorychannel,因為日誌資料丟點也不算什麼大問題;
4、sink使用elasticsearchsink寫入到elasticsearch,此處可以配置多個elasticsearch伺服器ip:port列表以便提公升處理能力。
以上介紹了日誌是如何流的,對於複雜的日誌採集,我們需要對source日誌進行過濾、寫到多個channel、對sink進行失敗處理/負載均衡等處理,這些flume預設都提供了支援:
1、source採集的日誌會傳入channelprocessor元件,其首先通過interceptor進行日誌過濾,如果接觸過servlet的話這個概念是類似的,可以參考《servlet3.1規範翻譯——過濾器 》 ;過濾器可以過濾掉日誌,也可以修改日誌內容;
2、過濾完成後接下來會交給channelselector進行處理,預設提供了兩種選擇器:複製或多路復用選擇器;複製即把乙個日誌複製到多個channel;而多路復用會根據配置的選擇器條件,把符合條件的路由到相應的channel;在寫多個channel時可能存在存在失敗的情況,對於失敗的處理有兩種:稍後重試或者忽略。重試一般採用指數級時間進行重試。
我們之前說過source生產日誌給channel、sink從channel消費日誌;它倆完全是非同步的,因此sink只需要監聽自己關係的channel變化即可。
到此我們可以對source日誌進行過濾/修改,把乙個訊息複製/路由到多個channel,對於sink的話也應該存在寫失敗的情況,flume預設提供了如下策略:
預設策略就是乙個sink,失敗了則這個事務就失敗了,會稍後重試。
flume還提供了故障轉移策略:
failover策略是給多個sink定義優先順序,假設其中乙個失敗了,則路由到下乙個優先順序的sink;sink只要丟擲一次異常就會被認為是失敗了,則從存活sink中移除,然後指數級時間等待重試,預設是等待1s開始重試,最大等待重試時間是30s。
flume也提供了負載均衡策略:
負載均衡演算法預設提供了兩種:輪訓和隨機;其通過抽象乙個類似
channelselector
的sinkselector
進行選擇,失敗補償機制和
failover
中的演算法類似,但是預設是關閉失敗補償的,需要配置
backoff
引數為true
開啟。
到此flume涉及的一些核心元件就介紹完了,對於source和sink如何非同步、channel提供的事務機制等我們後續分析元件時再講。
假設我們需要採集非常多的客戶端日誌並對他們進行一些緩衝或集中的處理,就可以部署乙個聚合層,整體架構類似於如下:
1、首先是日誌採集層,該層的agent和應用部署在同一臺機器上,負責採集如nginx訪問日誌;然後通過rpc將日誌流入到收集/聚合層;在這一層應該快速的採集到日誌然後流入到收集/聚合層;
2、收集/聚合層進行日誌的收集或聚合,並且可以進行容錯處理,如故障轉移或負載均衡,以提公升可靠性;另外可以在該層開啟檔案channel,做資料緩衝區;
3、收集/聚合層對資料進行過濾或修改然後進行儲存或處理;比如儲存到hdfs,或者流入kafka然後通過storm對資料進行實時處理。
到此從flume核心元件到一般的部署架構我們就大體了解了,而涉及的一些實現細節在接下來的部分進行詳細介紹。
Spark原始碼分析 Spark整體架構
術語 描述使用者編寫的程式。driver端的sparkcontext sparkconf和執行在executors上使用者編寫的業務邏輯 即map reduce reducebykey等 driver 執行使用者編寫應用程式的main 方法並建立sparkcontext worker 具體執行應用程...
jquery原始碼之整體架構分析
jquery的整體 架構簡化如下 function window,undefined jquery.fn jquery.prototype jquery.fn.init.prototype jquery.fn if typeof window object typeof window.documen...
jquery原始碼 整體架構
對外提供了jquery。可以通過jquery或者 來找到jquery function window,undefined window.jquery window.jquery 對外介面 window jquery本身是乙個建構函式,包括了很多靜態方法 工具方法 和例項方法。靜態方法更底層。func...