您好,登錄后才能下訂單哦!
這篇文章主要介紹了Flume是什么,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Flume是Cloudera提供的一個高可用的、高可靠的開源分布式海量日志收集系統,日志數據可以經過Flume流向需要存儲終端目的地。這里的日志是一個統稱,泛指文件、操作記錄等許多數據。
一、Flume基礎知識
1、數據流模型
Flume的核心是把數據從數據源收集過來,再送到目的地。為了保證輸送一定成功,在送到目的地之前,會先緩存數據,待數據真正到達目的地后,刪除自己緩存的數據。
Flume傳輸的數據的基本單位是Event,如果是文本文件,通常是一行記錄,這也是事務的基本單位。Event從Source,流向Channel,再到Sink,本身為一個byte數組,并可攜帶headers信息。Event代表著一個數據流的最小完整單元,從外部數據源來,向外部的目的地去。
2、核心組件
Flume運行的核心是Agent。它是一個完整的數據收集工具,含有三個核心組件,分別是source、channel、sink。通過這些組件,Event可以從一個地方流向另一個地方,如圖1-1所示,也可以多級agent任一鏈接組合,如圖1-2所示。
圖1-1 flume數據流模型
圖1-2 多級agent連接模型
1) Source:專用于收集日志,可以處理各種類型各種格式的日志數據,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定義等。
? Exec Source:以運行 Linux 命令的方式,持續的輸出最新的數據,如 tail -F 文件名 指令,在這種方式下,取的文件名必須是指定的。 ExecSource 可以實現對日志的實時收集,但是存在Flume不運行或者指令執行出錯時,將無法收集到日志數據,無法保證日志數據的完整性;
? Spool Source:監測配置的目錄下新增的文件,并將文件中的數據讀取出來。需要注意兩點:拷貝到 spool 目錄下的文件不可以再打開編輯;spool 目錄下不可包含相應的子目錄;
2) Channel:專用于臨時存儲數據,可以存放在memory、jdbc、file、自定義等。其存儲的數據只有在sink發送成功之后才會被刪除。
? Memory Channel:可以實現高速的吞吐,但是無法保證數據的完整性。Memory Channel 是一個不穩定的隧道,其原因是由于它在內存中存儲所有事件。如果 java 進程死掉,任何存儲在內存的事件將會丟失。另外,內存的空間也受到RAM大小的限制,與File Channel有差別;
? File Channel:保證數據的完整性與一致性。在具體配置FileChannel時,建議FileChannel設置的目錄和程序日志文件保存的目錄設成不同的磁盤,以便提高效率。File Channel是一個持久化的隧道(channel),它持久化所有的事件,并將其存儲到磁盤中。因此,即使 Java 虛擬機當掉,或者操作系統崩潰或重啟,再或者事件沒有在管道中成功地傳遞到下一個代理(agent),這一切都不會造成數據丟失。
3) Sink:專用于把數據發送到目的地件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定義等。
3、可靠性
Flume的核心是把數據從數據源收集過來,再送到目的地。為了保證輸送一定成功,在送到目的地之前,會先緩存數據,待數據真正到達目的地后,刪除自己緩存的數據。
Flume使用事務性的方式保證傳送Event整個過程的可靠性。Sink必須在Event被存入Channel 后,或者已經被傳達到下一站agent里,又或者,已經被存入外部數據目的地之后,才能把Event從Channel中remove掉。這樣數據流里的event無論是在一個agent里還是多個agent之間流轉,都能保證可靠,因為以上的事務保證了event會被成功存儲起來。而Channel的多種實現在可恢復性上有不同的保證。也保證了event不同程度的可靠性。比如Flume支持在本地保存一份文件channel作為備份,而memory channel將event存在內存queue里,速度快,但丟失的話無法恢復。
二、Flume安裝與使用
1、安裝
官網(http://flume.apache.org/download.html)下載flume版本(本實驗:apache-flume-1.5.2-bin.tar.gz),解壓到/usr/local目錄下,進入flume-xx/conf目錄中,執行命令:mv flume-env.sh.properties flume-env.sh,然后配置flume-env.sh中的JAVA_HOME路徑。
2、一個示例
本示例Source來自Spooling Directory,Sink流向HDFS。監控/root/logs文件目錄下的文件,一旦有新文件,就立刻將文件內容通過agent流向HDFS的hdfs://cluster1/flume/%Y%m%d文件中(此處如果找不到cluster1,需要將hadoop的配置文件core-site.xml和hdfs-site.xml拷貝至flume的conf目錄中)。
flume目錄下新建test目錄,新建文件example,內容如下:
#定義agent名, source、channel、sink的名稱 agent1.sources = source1 agent1.channels = channel1 agent1.sinks = sink1 #具體定義source agent1.sources.source1.type = spooldir agent1.sources.source1.spoolDir = /home/logs agent1.sources.source1.fileHeader = false #定義攔截器,為消息添加時間戳 agent1.sources.source1.interceptors = i1 agent1.sources.source1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder #具體定義channel #也可以將channel數據放在內存(但是內存容易丟失)中,如 #agent1.channels.c1.type = memory #agent1.channels.c1.capacity = 10000 #agent1.channels.c1.transactionCapacity = 100 #此處配置為文件中 agent1.channels.channel1.type=file #備份路徑 agent1.channels.channel1.checkpointDir=/root/flume_bak #數據保存路徑 agent1.channels.channel1.dataDirs=/root/flume_tmp #具體定義sink agent1.sinks.sink1.type = hdfs agent1.sinks.sink1.hdfs.path = hdfs://cluster1/flume/%Y%m%d agent1.sinks.sink1.hdfs.fileType = DataStream #存儲到HDFS文件名的前綴,格式為20140116-文件名.. agent1.sinks.sink1.hdfs.filePrefix=%Y-%m-%d #不按照條數生成文件 agent1.sinks.sink1.hdfs.rollCount = 0 #HDFS上的文件達到128M時生成一個文件 agent1.sinks.sink1.hdfs.rollSize = 134217728 #HDFS上的文件每60秒去檢測 agent1.sinks.sink1.hdfs.rollInterval = 60 #組裝source、channel、sink agent1.sources.source1.channels = channel1 agent1.sinks.sink1.channel = channel1
運行該示例,進入/usr/local/flume目錄,執行命令:bin/flume-ng agent -n agent1 -c conf -f test/example -Dflume.root.logger=DEBUG,console
其中-n指定agent名稱,-c指定配置文件目錄,-f指定配置文件,-Dflume.root.logger=DEBUG,console設置日志等級為輸出到控制臺。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Flume是什么”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。