Flume NG:Flume 發展史上的第一次革命

Flume 作爲 cloudera 開發的實時日誌收集系統,已經受到越來越多的關注。比如 IBM BigInsights 已經將 Flume 作爲產品的一部分。Flume 初始的發行版本目前被統稱爲 Flume OG(original generation),屬於 cloudera。但隨着 FLume 功能的擴展,Flume OG 代碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點暴露出來,尤其是在 Flume OG 的最後一個發行版本 0.94.0 中,日誌傳輸不穩定的現象尤爲嚴重,這點可以在 BigInsights 產品文檔的 troubleshooting 板塊發現。爲了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進行了里程碑式的改動:重構核心組件、核心配置以及代碼架構,重構後的版本統稱爲 Flume NG(next generation);改動的另一原因是將 Flume 納入 apache 旗下,cloudera Flume 改名爲 Apache Flume。本文將從基本組件以及用戶體驗的角度闡述 Flume OG 到 Flume NG 發生的革命性變化。

背景

Cloudera 開發的分佈式日誌收集系統 Flume,是 hadoop 周邊組件之一。其可以實時的將分佈在不同節點、機器上的日誌收集到 hdfs 中。Flume 初始的發行版本目前被統稱爲 Flume OG(original generation),屬於 cloudera。但隨着 FLume 功能的擴展,Flume OG 代碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點暴露出來,尤其是在 Flume OG 的最後一個發行版本 0.94.0 中,日誌傳輸不穩定的現象尤爲嚴重,這點可以在 BigInsights 產品文檔的 troubleshooting 板塊發現。爲了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進行了里程碑式的改動:重構核心組件、核心配置以及代碼架構,重構後的版本統稱爲 Flume NG(next generation);改動的另一原因是將 Flume 納入 apache 旗下,cloudera Flume 改名爲 Apache Flume。

下面將從核心組件變化、角色變化、用戶配置變化以及實戰等方面闡述 Flume NG 相對於 Flume OG 所發生的革命性變化。

核心組件變化

圖 1 和圖 3 是兩個版本的架構圖。

FLUM OG 的特點是:

  • FLUM OG 有三種角色的節點,如圖 1:代理節點(agent)、收集節點(collector)、主節點(master)。
  • agent 從各個數據源收集日誌數據,將收集到的數據集中到 collector,然後由收集節點彙總存入 hdfs。master 負責管理 agent,collector 的活動。
  • agent、collector 都稱爲 node,node 的角色根據配置的不同分爲 logical node(邏輯節點)、physical node(物理節點)。對 logical nodes 和 physical nodes 的區分、配置、使用一直以來都是使用者最頭疼的地方。
  • agent、collector 由 source、sink 組成,代表在當前節點數據是從 source 傳送到 sink。如圖 2。
圖 1. FLUM OG 架構圖

圖 2. OG 節點組成圖

對應於 OG 的特點,FLUM NG 的特點是:

  • NG 只有一種角色的節點:代理節點(agent)。
  • 沒有 collector、master 節點。這是核心組件最核心的變化。
  • 去除了 physical nodes、logical nodes 的概念和相關內容。
  • agent 節點的組成也發生了變化。如圖 4,NG agent 由 source、sink、channel 組成。
圖 3. FLUM NG 架構圖

圖 4. NG 節點組成圖

從整體上講,NG 在覈心組件上進行了大規模的調整,核心組件的數目由 7 刪減到 4。由於 Flume 的使用涉及到衆多因素,如 avro、thrift、hdfs、jdbc、zookeeper 等,而這些組件和 Flume 的整合都需要關聯到所有組件。所以核心組件的改革對整個 Flume 的使用影響深遠:

  • 大大降低了對用戶的要求,如核心組件的變化使得 Flume 的穩定使用不再依賴 zookeeper,用戶無需去搭建 zookeeper 集羣;另外用戶也不再糾結於 OG 中的模糊概念(尤其是 physical nodes、logical nodes,agent、collector)。
  • 有利於 Flume 和其他技術、hadoop 周邊組件的整合,比如在 NG 版本中,Flume 輕鬆實現了和 jdbc、hbase 的集成。
  • 將 OG 版本中複雜、大規模、不穩定的標籤移除,Flume 實現了向靈活、輕便的轉變,而且在功能上更加強大、可擴展性更高,這一點主要表現在用戶使用 Flume 搭建日誌收集集羣的過程中,後面的章節會詳細介紹。


刪減節點角色,脫離 zookeeper

Zookeeper 是針對大型分佈式系統的可靠協調系統,適用於有多類角色集羣管理。比如在 hbase 中,對 HMaster、HRegionServer 的管理。

在 OG 版本中,Flume 的使用穩定性依賴 zookeeper。它需要 zookeeper 對其多類節點(agent、collector、master)的工作進行管理,尤其是在集羣中配置多個 master 的情況下。當然,OG 也可以用內存的方式管理各類節點的配置信息,但是需要用戶能夠忍受在機器出現故障時配置信息出現丟失。所以說 OG 的穩定行使用是依賴 zookeeper 的。

而在 NG 版本中,節點角色的數量由 3 縮減到 1,不存在多類角色的問題,所以就不再需要 zookeeper 對各類節點協調的作用了,由此脫離了對 zookeeper 的依賴。由於 OG 的穩定使用對 zookeeper 的依賴表現在整個配置和使用過程中,這就要求用戶掌握對 zookeeper 集羣的搭建極其使用(尤其是要熟悉 zookeeper 數據文件夾 data,Flume 節點配置信息存放在此文件夾中);掌握 Flume 中和 zookeeper 相關的配置。對初次接觸 Flume 的用戶來講,這是非常痛苦的事。

用戶配置變化

從用戶角度來講,配置過程無疑是整個集羣搭建的核心步驟。Flume 的配置分爲兩個部分:安裝和數據傳輸配置。

安裝

OG 在安裝時:

  • 在 flume-env.sh 中設置$JAVA_HOME。
  • 需要配置文件 flume-conf.xml。其中最主要的、必須的配置與 master 有關。集羣中的每個 Flume 都需要配置 master 相關屬性(如 flume.master.servers、flume.master.store、flume.master.serverid)。
  • 如果想穩定使用 Flume 集羣,還需要安裝 zookeeper 集羣,這需要用戶對 zookeeper 有較深入的瞭解。
  • 安裝 zookeeper 之後,需要配置 flume-conf.xml 中的相關屬性,如 flume.master.zk.use.external、flume.master.zk.servers。
  • 在使用 OG 版本傳輸數據之前,需要啓動 master、agent。

NG 在安裝時,只需要在 flume-env.sh 中設置$JAVA_HOME。

數據傳輸配置

OG 版本的配置途徑有兩個:

  • shell 命令:需要用戶掌握 Flume shell 命令;
  • master console 頁面:這是 OG 用戶最常用的配置方式;弊端在於,除非用戶熟悉複雜的各類 source,sink 配置函數以及格式(source:大約 25 個,sink:大約 46 個),否則在複雜的集羣環境下,用戶每次只能配置一個節點(指定 source、sink)來保證配置的準確性;

NG 的配置只需要一個配置文件,這個配置文件中存放 source、sink、channel 的配置。如圖 5 中是配置文件 example.conf 裏面的內容,其中 agent_foo 是 agent 名字。然後在啓動 agent 時,使用一下命令指定這個配置文件:

$ bin/flume-ng agent
--conf-file example.conf \
--name agent_foo \
-Dflume.root.logger=INFO,console
圖 5. example.conf

實戰 Flume NG

Flume 最常用的使用場景是,從節點收集日誌數據,並以一定的格式存放到分佈式文件系統 hdfs(hadoop 文件系統)中。下面介紹如何使用 Flume NG 從一個節點收集實時日誌,並存放到 hdfs 中。

場景說明:

  • 場景中有兩臺主機 host1、host2。
  • 數據源是 host2 上的系統日誌文件“/var/log/secure”(登錄到系統存取資料的記錄,本機的測試系統有多人使用,所以記錄在不斷的生成)。數據目的地是 hadoop 文件系統 hdfs。
  • 在 host1、host2 上搭建 hadoop 集羣。其中 host1 爲 namenode、jobtracker,host2 爲 datanode、tasktracker。

使用 ng 搭建日誌傳輸場景:flume+hadoop

場景搭建步驟:

  • 下載 flume-ng 安裝包,並解壓到 host2。

    Flume 發佈了兩類包:source 和 bin。Source 包用於開發工作,bin 包用於安裝 Flume 搭建日誌收集場景。本次實驗用的是 apache-flume-1.5.2-bin.tar.gz

  • 生成配置文件 example.conf。內容如圖 6。整個配置分爲四部分。表 1 是配置說明。
圖 6. example.conf

表 1. flume-conf.xml
Properties Name Description
agent_ff 用來收集日誌信息的 agent 節點名稱
agent_ff.source 需要收集的信息源,名字:tailsource-ff
agent_ff.sinks 日誌需要被收集到此處,名字:hdfsSink-ff。
agent_ff.channels 日誌的收集需要通過此管道,名字:memoryChannel-ff。
tailsource-ff.type 定義 source 的類型,此處 exec 代表數據源是 exec 命令
tailsource-ff.command 定義具體命令,此處是對文件/var/log/secure 做 tail
tailsource-ff.channels 數據傳輸的管道,此處的管道名稱應該和 sink 相同。從而將 source、sink 通過 channels 進行連接。
memoryChannel-ff.type 管道類型,代表事件存儲的方式。Source 產生事件,sink 移除事件,以此代表數據傳輸完成。目前 Flume 支持 6 種 channel。此處是 momery,代表事件是存在內存裏
memoryChannel-ff.capacity 管道里可以存放的最多的事件數目。此處代表 memoryChannel-ff 最多可存放 1000 個事件。
hdfsSink-ff.type 數據目的地的類型,此處是將數據存放在 hdfs 中。
hdfsSink-ff.channel 定義和 source 相關聯的管道。
hdfsSink-ff.hdfs.path 數據存放在 hdfs 中的位置。
hdfsSink-ff.hdfs.filePrefix 收集到的數據存放的文件以此爲前綴。如圖 8。
hdfsSink-ff.hdfs.round, hdfsSink-ff.hdfs.roundValue, hdfsSink-ff.hdfs.roundUnit 定義在 hdfs 中生成的文件的時間戳。此處代表將 hdfs 中的文件的時間戳,向下取整到上一個十分鐘內。比如說,在 2012 年 6 月 12 號上午 11:54:34 生成的事件,在 hdfs 中生成的路徑將是/flume/events/2012-06-12/1150/00。
  • 進入 bin 目錄,使用一下命令啓動 Flume,開始日誌收集,控制檯輸出如圖 7,傳輸到 hdfs 的文件如圖 8。
./flume-ng agent \
--conf-file ../example.conf \
--name agent_ff \
-Dflume.root.logger=INFO,cnsole
圖 7. NG console

圖 8. hdfs


Flume OG vs Flume NG:用戶體驗對比

整體上看,NG 的用戶體驗要比 OG 好得多,這一點從用戶文檔上就可見一斑。OG 版本的使用文檔有 90 多頁,而 OG 只用 20 多頁的內容就完成了新版 Flume 的使用說明。對應於上一節“實戰 Flume NG”,我們使用和 NG 中同樣的場景說明,下面介紹如何使用 OG 搭建同樣的日誌收集場景。用戶可以從場景的搭建上明顯的看出差別:NG 的整個過程只涉及到 hadoop、agent,而 OG 則需要涉及到 hadoop、zookeeper、master、agent、flume-conf.xml。

使用 og 搭建日誌傳輸場景:flume+zookeeper+hadoop

場景搭建步驟:

  • 下載 zookeeper 安裝包,並在 host2 上安裝 zookeeper-3.4.3。請參考:zookeeperStarted
  • 下載 flume-0.94.0(OG),並解壓在 host2 上。
  • 配置文件 conf/flume-conf.xml,必須配置的信息如表 2。
  • 進入 bin 目錄,使用一下命令啓動 flume master、agent。
master: ./flume-daemon.sh start master
agent: ./flume node -n agent-ff
  • 進入 master 頁面:http://host2:35871/flumemaster.jsp。配置 source、sink。如圖 9。“Submit Query”後 Flume 便開始收集數據。
  • agent-ff 控制檯輸出如圖 10。
表 2. flume-conf.xml
屬性(Property) 賦值(Value)
flume.master.servers host2
flume.master.store zookeeper
flume.master.serverid 0
flume.master.zk.use.external true
flume.master.zk.servers host2:2181
圖 9. OG 配置

圖 10. OG console

結束語

本文通過對比,從核心組件和用戶的角度,闡述了 Flume NG 給 Flume 帶來的第一次革命。從核心組件來講,NG 簡化核心組件,移除了 OG 版本代碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點;另外 NG 脫離了 Flume 穩定性對 zookeeper 的依賴。從用戶角度來講,NG 版本對用戶要求大大降低:安裝過程除了 java 無需配置複雜的 Flume 相關屬性,也無需搭建 zookeeper 集羣,安裝過程幾乎零工作量;數據流的配置過程更加簡單、合理,只需要實現 source、sink、channel 的簡單配置即可。


參考資料

學習


轉自:http://www.ibm.com/developerworks/cn/data/library/bd-1404flumerevolution/index.html

《Flume 1.5.2 User Guide》

《Flume 1.5.2 Developer Guide》

《基於Flume的美團日誌收集系統(一)架構和設計》

Flume OG介紹《Flume日誌收集》


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