1.為什麼要有Flume?
客戶端伺服器,與叢集伺服器是分開的,而日誌檔案業務資料都是在客戶端伺服器產生的,所以需要在客戶端伺服器安裝一個工具,將資料傳送到叢集伺服器或者其他地方,這個工具就是Flume。
2.Flume架構
source :專門用於收集資料的,可以處理各種型別、格式的資料。
channel:負責聚合資料,對採集到的資料進行快取的,這是防止資料採集和傳送速度不均衡完成擁堵。
sink:專門用於傳送資料的,可以傳送到不同的目的地,去hdfs,kafka,hbase。
event:Flume資料傳輸的基本單元,對資料進行序列化,包含header(頭資訊),body(資料本身)
攔截器:可以在攔截器內實時處理資料,對於資料非常有用
由於source收集和sink傳送速度不均衡,容易造成擁堵,所以需要一箇中轉站暫時存放資料,就是channel
File Channel:資料儲存於磁碟,安全可靠。
Memory Channel:資料儲存於記憶體,速度快。
Kafka Channel:資料儲存於 Kafka,傳輸速度最快,省去sink階段,如果果下一級是 Kafka,優先選擇。
資料可能有各種來源,收集的方式不同,這是source 的主要工作,可以設定不同的收集方式:
採集某個檔案的資料
指定接收某個埠的資料
採集檔案的增加資料
資料可能要傳送給不同的物件,傳送的方式不同,這是sink的主要工作,可以設定不同的傳送方式:
列印到控制檯
指定伺服器:埠進行傳送
傳送到hdfs叢集
傳送到kafka
3.Flume 有哪些元件,Flume 的 source、channel、sink 具體是做什麼的?
(1).source:用於採集資料,Source 是產生資料流的地方,同時 Source 會將產生的資料流傳輸到 Channel,這個有點類似於 Java IO 部分的 Channel。
(2).channel:用於橋接 Sources 和 Sinks,類似於一個佇列。
(3).sink:從 Channel 收集資料,將資料寫到目標源(可以是下一個 Source,也可以是 HDFS或者 HBase)。
4.如何實現Flume資料傳輸的實時監控
使用第三方框架Ganglia實時監控Flume。
1)採用Ganglia監控器,監控到Flume嘗試提交的次數遠遠大於最終成功的次數,說明Flume執行比較差。主要是記憶體不夠導致的。
2)解決辦法?
(1)自身:Flume預設記憶體2000m。考慮增加Flume記憶體,在flume-env.sh配置檔案中修改Flume記憶體為4-6g
-Xmx與-Xms最好設定一致,減少記憶體抖動帶來的效能影響,如果設定不一致容易導致頻繁fullgc。
(2)找朋友:增加伺服器臺數
搞活動 618 —> 增加伺服器 —> 用完在退出
日誌伺服器配置:8-16g記憶體、磁碟8T
5.Channel selectors是什麼
events或者說資料要可以透過不同的channel 傳送到不同的sink中去,那麼events要傳送到哪個channel 就是由於channel selectors決定的。
channel selectors包括了
Replicating channel selectors 複製選擇器
Multiplexing channel selectors 多路選擇器
預設的是複製選擇器,即每個channel的資料都是一樣的,多路選擇權就需要按照制定的規則去判斷了。
6.Flume引數調優思路
首先就是啟動多個Flume
source :如果採集速度比較慢,可以考慮
啟動多個source 進行採集;
調整batchSize,決定了source 一次批次運輸events到channel 的條數,適當調大可以提高source 搬運events到channel 的效能
channel:
快取方式(type)選擇記憶體(memory)時,channel效能最好,但是會有丟失資料的風險;選擇磁碟(file)時,可靠性更好,但是效能差一點,可以選擇多個不同盤下的目錄來提高效能;
引數Capacity決定了channel 可容納最大的events條數;引數transactionCapacity決定了每次source往channel寫/sink從channel讀的最大enents條數。注意:transactionCapacity要大於source和sink的batchsize
sink:增加sink的個數;引數batchsize決定了sink一次批次從channel 讀取的events條數
7.Flume的事務機制
Flume使用兩個獨立事務put和take,分別負責從source 到channel 、channel 到sink,記錄事件狀態,保證兩個過程的資料不會丟失
8.Flume的資料會丟失嗎?
根據Flume的事務機制,Flume的資料一般不會丟失,除非使用的時候memory channel ,在機器當機的時候會導致資料丟失,或者channel 滿了,sources無法寫入導致資料丟失
此外,也有可能完成資料重複,比如sink接收到一批資料,處理到一半當機了,處理完的資料沒有給channel 傳送響應,導致channel 重新傳送資料,造成資料重複。
9.零點漂移問題,在Flume中如何解決?
零點漂移問題:舉個例子,我有一些日誌檔案,需要透過Flume按照日期存放到hdfs中,那麼就需要用到日期了,而HdfsSink是預設繼續event的heard生成的時間戳進行分割槽存放的,這個時間是生成event的時間,而不是資料的生成時間,所以存在一個時間差。如果剛好這個時間跨過了一天,那麼就會導致日期增加了一天,這個就是零點漂移。
解決:在source元件內增加攔截器,從event的body中拿出資料生成時間,替換掉header的時間
10.Flume組成,Put事物,Task事務?
答:Flume組成,Put事物,Task事務
a. Taildir Source:斷點續傳、多目錄
b. File Channel:資料儲存在磁碟中,當機資料可以儲存。傳輸速率慢,適合對資料傳輸可靠性要求高的場景,例如:金融行業
c. Memory Channel:資料儲存在記憶體中,當機資料容易丟失。傳輸效率快,適合對資料傳輸可靠性要求不高的場景,例如:日誌資料
d. Kafka Channel:減少Flume的Sink階段,提高了傳輸效率
Source到Channel是Put事務
Channel到Sink是Task事務
11.Flume Event?
Event是資料流的基本單元,由一個裝載資料的位元組陣列(byte payload)和一系列可選的字串屬性來組成(可選頭部)。
12.Flume的事務機制
答:Flume的事務機制(類似資料庫的事務機制):Flume使用兩個獨立的事務分別負責從Soucrce到Channel,以及從Channel到Sink的事件傳遞。比如spooling directory source 為檔案的每一行建立一個事件,一旦事務中所有的事件全部傳遞到Channel且提交成功,那麼Soucrce就將該檔案標記為完成。同理,事務以類似的方式處理從Channel到Sink的傳遞過程,如果因為某種原因使得事件無法記錄,那麼事務將會回滾。且所有的事件都會保持到Channel中,等待重新傳遞。
13.Flume 和 Kafka 採集日誌區別,採集日誌時中間停了,怎麼記錄之前的日誌?
答:(1)Flume 採集日誌是透過流的方式直接將日誌收集到儲存層,而 kafka 是將快取在 kafka叢集,待後期可以採集到儲存層。
(2)Flume 採集中間停了,可以採用檔案的方式記錄之前的日誌,而 kafka 是採用 offset 的方式記錄之前的日誌。
14.資料怎麼採集到 Kafka,實現方式?
答:使用官方提供的 flumeKafka 外掛,外掛的實現方式是自定義了 flume 的 sink,將資料從channle 中取出,透過 kafka 的producer 寫入到 kafka 中,可以自定義分割槽等。
15.Flume攔截器
1)攔截器注意事項
(1)ETL攔截器:主要是用來判斷json是否完整。沒有做複雜的清洗操作主要是防止過多的降低傳輸速率。
(2)時間戳攔截器:主要是解決零點漂移問題
2)自定義攔截器步驟
(1)實現 Interceptor
(2)重寫四個方法
- initialize 初始化
- public Event intercept(Event event) 處理單個Event
- public List<Event> intercept(List<Event> events) 處理多個Event,在這個方法中呼叫Event intercept(Event event)
- close方法
(3)靜態內部類,實現Interceptor.Builder
3)攔截器可以不用嗎?
ETL攔截器可以不用;需要在下一級Hive的dwd層和SparkSteaming裡面處理
時間戳攔截器建議使用。 如果不用需要採用延遲15-20分鐘處理資料的方式,比較麻煩。