在大數(shù)據(jù)時代背景下,如何采集出有用的信息已經是大數(shù)據(jù)發(fā)展的關鍵因素之一,數(shù)據(jù)采集可以說是大數(shù)據(jù)產業(yè)的基石。Flume作為開源的數(shù)據(jù)采集系統(tǒng),受到了業(yè)界的認可與廣泛應用。本文將帶你了解Flume的基本架構以及使用案例等。
01
Flume簡介
1.1 Flume是什么?
Flume是Apache Software Foundation的頂級項目。它是一個分布式,可靠且可用的系統(tǒng),主要用于高效地收集,聚合大量日志數(shù)據(jù)并將其從不同的源移動到集中式數(shù)據(jù)存儲中。
Flume的使用不僅限于日志數(shù)據(jù)聚合。由于數(shù)據(jù)源是可定制的,因此Flume可用于傳輸大量事件數(shù)據(jù),包括但不限于網絡流量數(shù)據(jù),社交媒體數(shù)據(jù),電子郵件消息以及幾乎所有可能的數(shù)據(jù)源。
1.2 Flume外部結構
數(shù)據(jù)發(fā)生器產生的數(shù)據(jù)被所在服務器上的agent收集,之后數(shù)據(jù)收容器從各個agent上匯集數(shù)據(jù)并將采集到的數(shù)據(jù)存入到HDFS或者HBase中。同時,F(xiàn)lume還有如下特點:
- 使用Flume,我們可以將多個服務器中獲取的數(shù)據(jù)迅速的移交給Hadoop中;
- 支持各種接入數(shù)據(jù)的類型以及接出數(shù)據(jù)類型;
- 支持多路徑流量,多管道接入流量,多管道接出流量,上下文路由等;
- 支持水平擴展。
02
Flume的一些核心概念
Client:客戶端,生產數(shù)據(jù),運行在一個獨立的線程。
Event:事件,是一個數(shù)據(jù)單元,由消息頭和消息體組成。
Agent:一個獨立的Flume進程,包含組件Source、 Channel、 Sink。
Source:數(shù)據(jù)的收集端,負責將數(shù)據(jù)捕獲后進行特殊的格式化,將數(shù)據(jù)封裝到Event里,然后推入Channel中。
Channel:中轉Event的一個臨時存儲,保存由Source組件傳遞過來的Event。
Sink:從Channel中讀取并移除Event, 將Event傳遞到下一個Agent。
2.1 Flume Agent結構
Flume內部有一個或者多個Agent,它是Flume 運行的核心。然而對于每一個Agent來說,它就是一個獨立的守護進程(JVM),它從客戶端或者其他的 Agent接收數(shù)據(jù),然后迅速的傳給下一個目的節(jié)點Sink,或者Agent。
Flume以Agent為最小的獨立運行單位。它是一個完整的數(shù)據(jù)收集工具,含有三個核心組件,分別是Source、 Channel、 Sink。其工作流程為:把數(shù)據(jù)從數(shù)據(jù)源(Source)收集過來,在將收集到的數(shù)據(jù)送到指定的目的地(Sink)。為了保證輸送的過程一定成功,在送到目的地之前,會先緩存數(shù)據(jù)(Channel),待數(shù)據(jù)真正到達目的地(Sink)后,F(xiàn)lume再刪除緩存的數(shù)據(jù)。
2.2 Source
Source 負責數(shù)據(jù)的產生或搜集,并將數(shù)據(jù)捕獲后進行特殊的格式化,封裝到Event,然后再推入Channel。一般是對接一些RPC的程序或者是其他的Flume節(jié)點的Sink,從數(shù)據(jù)發(fā)生器接收數(shù)據(jù),并將接收的數(shù)據(jù)以Event格式傳遞給一個或者多個通道Channel,F(xiàn)lume提供多種數(shù)據(jù)接收的方式,比如avro、thrift、netcat、sequence generator、syslog、http等,如果內置的Source無法滿足需要, Flume還支持自定義。
2.3Channel
Channel 是一種短暫的存儲容器,負責數(shù)據(jù)的存儲持久化,可以持久化到jdbc,file,memory,將從Source接收到的Event格式的數(shù)據(jù)緩存起來,直到它們被Sink消費掉,可以把Channel看成是一個隊列,隊列的優(yōu)點是先進先出,放好后尾部一個個Event出來,F(xiàn)lume比較看重數(shù)據(jù)的傳輸,因此幾乎沒有數(shù)據(jù)的解析預處理。僅僅是數(shù)據(jù)的產生,封裝成Event然后傳輸。數(shù)據(jù)只有存儲在下一個存儲位置,數(shù)據(jù)才會從當前的Channel中刪除。這個過程是通過事務來控制的,這樣就保證了數(shù)據(jù)的可靠性。
不過Flume的持久化也是有容量限制的,比如內存如果超過一定的量,不夠分配,也一樣會爆掉。
2.4 Sink
Sink負責數(shù)據(jù)的轉發(fā),將數(shù)據(jù)存儲到集中存儲器比如Hbase和HDFS,它從Channel消費數(shù)據(jù)并將其傳遞給目標地。目標地可能是另一個Sink,也可能是hdfs、logger、avro、thrift、file、Hbase、solr或者自定義等。
Sink從Channel中取出事件,然后將數(shù)據(jù)發(fā)到別處,可以向文件系統(tǒng)、數(shù)據(jù)庫、 hadoop存數(shù)據(jù), 也可以是其他agent的Source。在日志數(shù)據(jù)較少時,可以將數(shù)據(jù)存儲在文件系統(tǒng)中,并且設定一定的時間間隔保存數(shù)據(jù)。
Sink支持設置存儲數(shù)據(jù)位置,在日志數(shù)據(jù)較少時,可以將數(shù)據(jù)存儲在文件系中,并且設定一定的時間間隔保存數(shù)據(jù)。在日志數(shù)據(jù)較多時,可以將相應的日志數(shù)據(jù)存儲到Hadoop中,便于日后進行相應的數(shù)據(jù)分析。
2.5 Event
Flume使用Event對象作為傳遞數(shù)據(jù)的格式,特點如下:
① Event將傳輸?shù)臄?shù)據(jù)進行封裝,是Flume傳輸數(shù)據(jù)的基本單位,如果是文本文件,通常是一行記錄。
② Event也是事務的基本單位。
③ Event從Source,流向Channel,再到Sink,本身為一個字節(jié)數(shù)組,并可攜帶headers(頭信息)信息。
④ Event代表著一個數(shù)據(jù)的最小完整單元,從外部數(shù)據(jù)源來,向外部的目的地去。
一個完整的Event包括:headers、body、Event信息(即文本文件中的單行記錄)。其中body是一個字節(jié)數(shù)組,包含了實際的內容,如下圖所示:
03
Flume攔截器、數(shù)據(jù)流以及可靠性
3.1 Flume攔截器
當我們需要對數(shù)據(jù)進行過濾時,除了在Source、 Channel和Sink進行代碼修改之外, Flume為我們提供了攔截器,位于Source和Channel之間,在日志進入到Source之前,對日志進行一些包裝、清洗過濾等動作。
當我們?yōu)镾ource指定攔截器后,會在其中得到Event,根據(jù)需求我們可以對Event進行保留還是拋棄,拋棄的數(shù)據(jù)不會進入Channel中。
3.2 Flume數(shù)據(jù)流
Flume 的核心是把數(shù)據(jù)從數(shù)據(jù)源收集過來,再送到目的地。為了保證輸送成功,在送到目的地之前,會先緩存數(shù)據(jù),待數(shù)據(jù)真正到達目的地后,刪除緩存的數(shù)據(jù)。
Flume 傳輸數(shù)據(jù)的基本單位是 Event,如果是文本文件,通常是一行記錄。Event 從 Source,流向 Channel,再到Sink,本身為一個byte數(shù)組,并可攜帶 headers 信息。Event 代表著一個數(shù)據(jù)流的最小完整單元,從外部數(shù)據(jù)源來,向外部的目的地去。
值得注意的是,F(xiàn)lume提供了大量內置的Source、Channel和Sink類型。不同類型之間可以自由組合。組合方式基于用戶設置的配置文件,非常靈活。比如:Channel可以把事件暫存在內存里,也可以持久化到本地硬盤上。Sink可以把日志寫入HDFS、HBase或其它Source等。Flume支持用戶建立多級流,也就是說,多個agent可以協(xié)同工作,這也是Flume強大之處。
3.3 Flume可靠性
Flume可以通過以下方式保證其可靠性:
① Flume保證單次跳轉可靠性的方式:傳送完成后,該事件才會從通道中移除;
② Flume使用事務性的方法來保證事件交互的可靠性;
③ Flume可以將數(shù)據(jù)可暫存,當目標不可訪問后,數(shù)據(jù)會暫存在Channel中,等目標可訪問之后,再進行傳輸;
④ 數(shù)據(jù)處理過程中,如果因為網絡中斷或者其他原因,在某一步被迫結束了,這個數(shù)據(jù)會在下一次重新傳輸;
⑤ Source和Sink封裝在一個事務的存儲和檢索中,即事件的放置或者提供由一個事務通過通道來分別提供,保證了事件集在流中可靠地進行端到端的傳遞。
04
Flume使用場景****
Flume在英文中的意思是水道,它更像是可以隨意組裝的消防水管,下面根據(jù)官方文檔,展示幾種Flow。
4.1 單個agent采集數(shù)據(jù)
單個Agent收集數(shù)據(jù)源,存儲到最終的外部系統(tǒng)中,這是最簡單的情況。
4.2 多個agent順序連接
多個Agent順序連接起來,將最初的數(shù)據(jù)源經過收集,最終存儲到外部系統(tǒng)中。一般情況下,應該控制這種順序連接的Agent 的數(shù)量,因為數(shù)據(jù)流經的路徑變長了,如果出現(xiàn)故障將影響整個服務。
4.3 多個Agent數(shù)據(jù)匯集
日志收集中的一個非常常見的情況是,大量的日志生成客戶端將數(shù)據(jù)發(fā)送到連接存儲子系統(tǒng)的使用方代理。例如,從數(shù)百臺Web服務器收集的日志發(fā)送到多個寫入HDFS群集的代理。
這可以在Flume中實現(xiàn),方法是為多個第一層代理配置一個avro接收器,它們均指向單個代理的avro源。第二層代理上的此源將接收到的事件合并到一個通道中,該通道由接收器消耗到其最終目地的。
4.4 多級流
Flume支持多級流,那么什么是多級流呢?我們舉個例子,當syslog, java, nginx、 tomcat等混合在一起的日志流開始流入一個agent后,可以在agent中將混雜的日志流分開,然后給每種日志建立一個自己的傳輸通道。
上面的示例顯示了來自代理“ foo”的源,將流擴展到三個不同的通道。
值得注意的是,當多個agent級聯(lián)時,一個Source可以對接多個chanel,但是一個chanel只能對接一個Sink。
05
Flume優(yōu)缺點
5.1 優(yōu)點
① Flume可以將應用產生的數(shù)據(jù)存儲到多種集中存儲器;
② Flume提供上下文路由特征;
③ Flume的管道是基于事務,保證了數(shù)據(jù)在傳送和接收時的一致性;
④ Flume是可靠的,容錯性高的,可升級的,易管理的,并且可定制的;
⑤ Flume可以實時的將分析數(shù)據(jù)并將數(shù)據(jù)保存在數(shù)據(jù)庫或者其他系統(tǒng)中;
⑥ 當收集數(shù)據(jù)的速度超過將寫入數(shù)據(jù)的時候,也就是當收集信息遇到峰值時,收集的信息非常大,甚至超過了系統(tǒng)的寫入數(shù)據(jù)能力,這時候,F(xiàn)lume會在數(shù)據(jù)生產者和數(shù)據(jù)收容器間做出調整,保證其能夠在兩者之間提供一個平穩(wěn)的數(shù)據(jù)。
5.2 缺點
Flume的配置比較繁瑣,Source,Channel,Sink的關系在配置文件里面交織在一起,不便于管理。
-
數(shù)據(jù)采集
+關注
關注
38文章
6053瀏覽量
113620 -
大數(shù)據(jù)
+關注
關注
64文章
8882瀏覽量
137397
發(fā)布評論請先 登錄
相關推薦
評論