- Introduction簡述
- OverView 綜述
- System Requirements系統要求
- Architecture架構
- Data flow model資料流動模型
- Complex flows複雜流
- Reliability可靠性
- Recoverability可恢複性
- Setup設定
- Setting up an agent配置Agent
- Configuring individual components配置單個元件
- Wiring the pieces together元件配置整合
- Starting an agent啟動一個agent
- A simple example一個簡單的例子
- Setting up an agent配置Agent
- Topology Design Considerations 拓撲設計注意事項
- Flume是否适合解決您的問題
- Flume資料流的可靠性考慮
- Flume拓撲設計
- 調整Flume部署
- 處理Agent節點當機
- 疑問-Flume 的Agent如果當機後會自動監控重新開機嗎還是需要啟動者手動重新開機
Introduction(簡述)
OverView (綜述)
Apache Flume是一個分布式、高可靠和高可用的收集、集合和将大量來自不同來源的日志資料移動到一個中央資料倉庫。
Apache Flume不僅局限于資料的聚集。因為資料是可定制的,是以Flume可以用于運輸大量時間資料(包括但不限于網絡傳輸資料,社交媒體産生的資料,電子郵件資訊和幾乎任何資料源。)
Apache Flume是Apache軟體基金會的頂級項目。
目前有兩個可用的釋出版本,0.9.x和1.x。
我們鼓勵新老使用者使用1.x釋出版本來提高性能和利用新結構的配置靈活性。
System Requirements(系統要求)
- Java RunTime環境 - Java 1.8或更高版本
- 記憶體——足夠的記憶體來配置souuces,channels和sinks
- 磁盤空間-足夠的磁盤空間來配置channels或者sinks
- 目錄權限-代理所使用的目錄讀/寫權限
Architecture(架構)
Data flow model(資料流動模型)
一個Flume event定義為擁有一個位元組有效負載的一個資料流單元,同時擁有一個可選的字元串屬性配置。Flume agent其實就是一個JVM程序,該JVM程序控制事件流從外部來源傳輸到目的地。
Flume源消耗由外部源(如Web伺服器)傳遞給它的事件。外部源以Flume源可識别的格式向Flume發送事件。例如,Avro Source可用于從Avro用戶端或其他Flume用戶端接收Avro事件。使用Thrift Source可以定義類似的流程,以接收來自Thrift Sink或Flume Thrift Rpc Client的用戶端事件或使用Flume Thrift協定生成的任何語言編寫的Thrift用戶端事件。
黨Flume Source接收到事件時,會将其存儲到一個或多個Channel中。Channel是被動存儲,儲存事件,直到它被Sink 消費掉。如File Channel,它把Event儲存到本地檔案系統的檔案中。
Sink 負責從Channel中删除Event并将其放入HDFS之類的外部存儲庫,或者将其轉發到下一個Flume Agent 的Source元件中。
Complex flows(複雜流)
Flume允許使用者建立multi-hop流,當事件在到達最終目的地時要經過多個Agent。它也支援扇入和扇出流,上下文路由和失效hop的恢複路由。
Reliability(可靠性)
Event在每個Agent的Channel上進行緩存,随後Event将會傳遞到流中的下一個Agent或終端存儲庫(如HDFS)。隻有在存儲在下一個代理的通道或終端存儲庫中後Event才會從Channel中删除。這一步驟實作了單節點架構的可靠性。
Flume使用事務性的操作來保證Event的可靠傳送。Source和Sink分别在交易中封裝由Channel提供的交易中放置或提供的事件的存儲/檢索。這確定了該組Event在傳輸流程中可靠地傳遞。
在多層架構的情況下,來自前一層的sink和來自下一層的Source都處于運作狀态,以確定資料安全地存儲在下一層的Channel中。
Recoverability(可恢複性)
Event在Channel中進行緩存,提供了從失敗中恢複的機制。Flume支援由本地檔案系統支援的File Channel。Flume還有一個記憶體Channel,它将事件簡單地存儲在記憶體隊列中,這個速度更快,但是當Agent死亡時,仍然留在記憶體通道中的任何Event都不能被恢複。
Setup(設定)
Setting up an agent(配置Agent)
Flume agent配置存儲在一個本地配置檔案中。這是一個跟Java 屬性檔案格式一樣的文本檔案。一個或者多個agent可以指定同一個配置檔案來進行配置。配置檔案包括每個source的屬性,agent中的sink和channel以及它們是如何連接配接構成資料流。
Configuring individual components(配置單個元件)
流中的每個元件(source,sink或者channel)都有名字,類型和用來指定類型的屬性集和執行個體化。例如,一個avro source需要一個主機名(或者IP位址)和端口來接收資料,記憶體channel有最大隊列值(“capacity”),和HDFS sink需要知道檔案系統的URI,來建立路徑,輪詢檔案的頻率(hdfs.roollInterval)等.元件的所有屬性都必須在Flume agetnt的屬性檔案裡配置。
Wiring the pieces together(元件配置整合)
agent需要知道每個元件加載什麼和它們是怎樣連接配接構成流。這通過列出agent中每個source、sink和channel和指定每個sink和source連接配接的channel。例如,一個agent流事件從一個稱為avroWeb的Avro sources通過一個稱為file-channel的檔案channel流向一個稱為hdfs-cluster1的HDFS sink。配置文檔将包含這些元件的名字和avroWeb source和hdfs-cluster1 sink中間共享的file-channel。
Starting an agent(啟動一個agent)
agent通過一個稱為flume-ngshell位于Flume項目中bin目錄下的腳本來啟動。你必須在指令行中指定一個agent名字,配置目錄和配置文檔
$ bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template
現在Agent将開始運作在給定的屬性檔案中配置的Source和Sink。
A simple example(一個簡單的例子)
這裡我們給出一個配置檔案的例子,闡述一個單點Flume的部署,這個配置讓使用者生成事件并随後将它們記錄到控制台。
# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port =
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity =
a1.channels.c1.transactionCapacity =
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
該配置定義了一個名為a1的Agent。a1有一個偵聽端口44444上的資料的Source,一個緩存事件資料的記憶體Channel,以及一個将事件資料記錄到控制台的Sink。配置檔案對各個元件進行命名,然後描述它們的類型并配置相關參數。
給定的配置檔案可能會定義幾個有各自名字的Agent,當啟動給定的Flume程序時,會傳遞一個标志,告訴它哪個名字的Agent要啟動。
根據這個配置檔案,我們可以按如下方式啟動Flume:
請注意,在生産部署中,我們通常會包含一個選項:–conf = conf-dir。conf-dir目錄将包含一個shell腳本:flume-env.sh和一個log4j屬性檔案。在這個例子中,我們通過一個option強制Flume登入到控制台,而沒有一個自定義的環境腳本。
接下來,從另一個終端telnet到端口44444,并發送Event:
$ telnet localhost
Trying ...
Connected to localhost.localdomain ().
Escape character is '^]'.
Hello world! <ENTER>
OK
原始的Flume終端将在日志消息中輸出Event。
// :: INFO source.NetcatSource: Source starting
// :: INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/:]
// :: INFO sink.LoggerSink: Event: { headers:{} body: C C F F C D Hello world!. }
恭喜 - 您已經成功配置并部署了Flume Agent!後續部分将更詳細地介紹Agent配置。
Topology Design Considerations 拓撲設計注意事項
Flume非常靈活,可以實作大量的部署場景。如果您計劃在大規模的生産部署中使用Flume,那麼花一些時間思考如何用Flume拓撲來解決您的問題是明智的。本節包含一些注意事項。
Flume是否适合解決您的問題?
果您需要将文本日志資料提取到Hadoop / HDFS,則Flume适合您的問題,可以停止尋找其他解決方案了。對于其他用例,這裡有一些指導性的原則:
Flume旨在通過相對穩定,(可能會)複雜的拓撲結構來傳輸和擷取定期生成的事件資料。“事件資料”的概念非常廣泛。對于Flume而言,事件隻是一個通用的位元組數組。這裡對事件的大小有一些限制:例如,它不能大于你可以存儲在記憶體中的大小或單個機器上的磁盤大小。但在實踐中,Flume事件可以是從文本日志條目到圖像檔案的所有内容。
事件的關鍵屬性是它們是以連續的,流式的方式生成的。如果您的資料不是經常生成的(即您正試圖将一個批量的資料加載到Hadoop叢集中),那麼Flume仍然可以工作,但對您的情況可能是過度的,大炮打蚊子。
您的拓撲結構不需要一成不變,因為Flume可以在不丢失資料的情況下處理拓撲變化,還可以承受由于故障切換或配置而定期重新配置。但如果您每天都要改變拓撲結構,那麼可能會影響正常工作,因為重新配置需要考慮一些思路的實作和開銷。
Flume資料流的可靠性考慮
Flume資料流的可靠性取決于幾個因素,通過調整這些因素,您可以使用Flume實作廣泛的可靠性選項。
1. 你使用什麼類型的Channel。Flume具有持久通道(将資料持久化到磁盤的通道)和非持久通道(如果機器發生故障将丢失資料的通道)。持久通道使用基于磁盤的存儲,存儲在這些通道中的資料将持續存在于機器重新開機或非磁盤相關故障之中。
2. 您的Channel是否能充分解決了您對資料及時響應的需求。Flume中的通道充當各種中繼的緩沖區。這些緩沖區具有固定的容量,一旦容量已滿,您将在流量的早期Agent增加緩存壓力。如果這個壓力傳播到流的源頭,Flume将變得不可用并且可能丢失資料。
3. 是否使用備援拓撲。Flume讓您可以通過備援拓撲複制流。這可以提供非常容易的容錯來源,并且可以克服磁盤或機器故障。
在Flume拓撲結構中考慮可靠性的最佳方法是考慮各種故障情況及其結果。如果磁盤失敗會發生什麼?如果一台機器出現故障會怎樣?如果您的終端接收器(如HDFS)停機一段時間,您的Channel又有壓力,會發生什麼情況?
設計空間是巨大的,但你需要問的基本問題隻是少數。
Flume拓撲設計
設計Flume拓撲的第一步是枚舉資料的所有資料源和Sink目标(終端接收器),這些将定義您的拓撲的邊緣點。接下來的考慮是是引入中間聚合層還是事件路由。
如果您從大量資料來源收集資料,則可以通過聚合層合并資料以簡化終端接收器的攝取。聚合層也可以消除Source的突發事件或Sink目标的不可用性,通過充當緩沖區。
如果要在不同位置之間路由資料,則可能還需要在各個點上分流:這會建立本身可能包含聚合點的子拓撲。
調整Flume部署
一旦你了解了你的拓撲結構,下一個問題是了解需要多少硬體和網絡容量。
首先,您需要量化你産生的資料是多少。這并不總是一個簡單的任務!因為大多數資料流是突發的(例如,由于晝夜模式)并且可能不可預測。一個好的起點是考慮每個拓撲結構層的最大吞吐量,無論是每秒事件數還是每秒位元組數。一旦知道給定層所需的吞吐量,就可以計算出該層需要多少個節點的下限。為了确定設計的架構可達到的吞吐量,最好使用合成或采樣事件資料在硬體上進行Flume實驗。一般來說,基于磁盤的通道應該可以達到10 MB / s,基于記憶體的通道應該達到100 MB / s以上。取決于硬體和操作環境,性能會有很大的不同。
調整聚合吞吐量可以讓您在每層需要的節點數量上下限。增加節點有幾個原因,例如增加備援和更好地吸收負載突發的能力。
處理Agent節點當機
如果Flume代理發生故障,則該Agent上托管的所有流程都會中止。Agent重新啟動後,流程将恢複,使用檔案通道或其他穩定通道的流程将恢複處理之前停止的事件。如果代理不能在同一硬體上重新啟動,那麼可以選擇将資料遷移到另一個硬體,并設定一個新的Flume代理,以恢複處理儲存在Channel中的事件。可以利用資料庫HA futures 來将Flume代理移動到另一個主機。