日誌收集組件—Flume、Logstash、Filebeat對比

概述

數據的價值在於把數據變成行動。這裏一個非常重要的過程是數據分析。提到數據分析,大部分人首先想到的都是Hadoop、流計算、機器學習等數據加工的方式。從整個過程來看,數據分析其實包含了4個過程:採集,存儲,計算,展示。大數據的數據採集工作是大數據技術中非常重要、基礎的部分,具體場景使用合適的採集工具,可以大大提高效率和可靠性,並降低資源成本。Flume、Logstash和Filebeat都是可以作爲日誌採集的工具,本報告將針對這三者進行分析。

一、Flume

Flume是一種分佈式、高可靠和高可用的服務,用於高效地收集、聚合和移動大量日誌數據。它有一個簡單而靈活的基於流數據流的體系結構。它具有可調的可靠性機制、故障轉移和恢復機制,具有強大的容錯能力。它使用一個簡單的可擴展數據模型,允許在線分析應用程序。

Flume介紹

Flume的設計宗旨是向Hadoop集羣批量導入基於事件的海量數據。系統中最核心的角色是agent,Flume採集系統就是由一個個agent所連接起來形成。每一個agent相當於一個數據傳遞員,內部有三個組件:

source: 採集源,用於跟數據源對接,以獲取數據

sink:傳送數據的目的地,用於往下一級agent或者最終存儲系統傳遞數據

channel:agent內部的數據傳輸通道,用於從source傳輸數據到sink

flume配置

Flume的配置是在conf下以.conf結尾的文件

vim conf/test.conf


# 分別爲 起別名
a1.sources = r1
a1.sinks = k1
a1.channels = c1
 
# Describe/configure the source
# 配置source
a1.sources.r1.type = netcat
# 數據來源的方式:
# bind:ip,此ip必須是本機,ip:如果換成0.0.0.0(木有限制)
a1.sources.r1.bind = localhost
# 端口號是44444
a1.sources.r1.port = 44444
# Describe the sink
# 配置的是sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
#配置channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
# 將source,和channel綁定起來
a1.sources.r1.channels = c1
# 將sink和channel綁定起來
a1.sinks.k1.channel = c1

flume啓動

bin/flume-ng agent -conf conf --conf-file conf/test.conf --name a1  -Dflume.root.logger=INFO,console

二、Logstash

Logstash 是開源的服務器端數據處理管道,能夠同時從多個來源採集數據,轉換數據,然後將數據發送到存儲庫中。數據從源傳輸到存儲庫的過程中,Logstash 過濾器能夠解析各個事件,識別已命名的字段以構建結構,並將它們轉換成通用格式,以便更輕鬆、更快速地分析和實現商業價值。

Logstash介紹

logstash是基於pipeline方式進行數據處理的,pipeline可以理解爲數據處理流程的抽象。在一條pipeline數據經過上游數據源彙總到消息隊列中,然後由多個工作線程進行數據的轉換處理,最後輸出到下游組件。一個logstash中可以包含多個pipeline。

Logstash管道有兩個必需的元素,輸入和輸出,以及一個可選元素過濾器:

Input:數據輸入組件,用於對接各種數據源,接入數據,支持解碼器,允許對數據進行編碼解碼操作;必選組件;

output:數據輸出組件,用於對接下游組件,發送處理後的數據,支持解碼器,允許對數據進行編碼解碼操作;必選組件;

filter:數據過濾組件,負責對輸入數據進行加工處理;可選組件;Logstash安裝部署

pipeline:一條數據處理流程的邏輯抽象,類似於一條管道,數據從一端流入,經過處理後,從另一端流出;一個pipeline包括輸入、過濾、輸出3個部分,其中輸入和輸出部分是必選組件,過濾是可選組件;instance:一個Logstash實例,可以

包含多條數據處理流程,即多個pipeline;

event:pipeline中的數據都是基於事件的,一個event可以看作是數據流中的一條數據或者一條消息;

Logstash配置

vim logstash.conf


#監聽端口發送數據到kafka


input {


 tcp{


codec => "json"


host => "192.168.1.101"


    port => "8888"


    }


}


filter{


filter{


   mutate{


     split => ["message","|"]


        add_field =>   {


            "tmp" => "%{[message][0]}"


        }


        add_field =>   {


            "DeviceProduct" => "%{[message][2]}"


        }


        add_field =>   {


            "DeviceVersion" => "%{[message][3]}"


        }


        add_field =>   {


            "Signature ID" => "%{[message][4]}"


        }


        add_field =>   {


            "Name" => "%{[message][5]}"


        }


   }


}


output {


  kafka{


    topic_id => "hello"


    bootstrap_servers => "192.168.1.101:9092"


}


}




Logstash啓動

bin/logstash -f logstash.conf

三、Filebeat

Filebeat是一個日誌文件託運工具,在服務器上安裝客戶端後,Filebeat會監控日誌目錄或者指定的日誌文件,追蹤讀取這些文件(追蹤文件的變化,不停的讀),並且轉發這些信息到ElasticSearch或者Logstarsh中存放。

      當你開啓Filebeat程序的時候,它會啓動一個或多個探測器(prospectors)去檢測你指定的日誌目錄或文件,對於探測器找出的每一個日誌文件,Filebeat啓動收割進程(harvester),每一個收割進程讀取一個日誌文件的新內容,併發送這些新的日誌數據到處理程序(spooler),處理程序會集合這些事件,最後filebeat會發送集合的數據到你指定的地點。

Filebeat介紹

Filebeat由兩個主要組成部分組成:prospector和 harvesters。這些組件一起工作來讀取文件並將事件數據發送到指定的output。

      Harvesters:負責讀取單個文件的內容。harvesters逐行讀取每個文件,並將內容發送到output中。每個文件都將啓動一個harvesters。harvesters負責文件的打開和關閉,這意味着harvesters運行時,文件會保持打開狀態。如果在收集過程中,即使刪除了這個文件或者是對文件進行重命名,Filebeat依然會繼續對這個文件進行讀取,這時候將會一直佔用着文件所對應的磁盤空間,直到Harvester關閉。默認情況下,Filebeat會一直保持文件的開啓狀態,直到超過配置的close_inactive參數,Filebeat纔會把Harvester關閉。

      Prospector:負責管理Harvsters,並且找到所有需要進行讀取的數據源。如果input type配置的是log類型,Prospector將會去配置路徑下查找所有能匹配上的文件,然後爲每一個文件創建一個Harvster。每個Prospector都運行在自己的Go routine裏。

Filebeat目前支持兩種Prospector類型:log和stdin。每個Prospector類型可以在配置文件定義多個。log Prospector將會檢查每一個文件是否需要啓動Harvster,啓動的Harvster是否還在運行,或者是該文件是否被忽略(可以通過配置 ignore_order,進行文件忽略)。如果是在Filebeat運行過程中新創建的文件,只要在Harvster關閉後,文件大小發生了變化,新文件纔會被Prospector選擇到。

Filebeat配置

Filebeat配置相比較爲複雜,可以參考 Filebeat 收集日誌的那些事兒

四、Flume、Logstash、Filebeat對比


總結

Flume更注重於數據的傳輸,對於數據的預處理不如Logstash。在傳輸上Flume比Logstash更可靠一些,因爲數據會持久化在channel中。數據只有存儲在sink端中,纔會從channel中刪除,這個過程是通過事物來控制的,保證了數據的可靠性。Logstash是ELK組件中的一個,一般都是同ELK其它組件一起使用,更注重於數據的預處理,Logstash有比Flume豐富的插件可選,所以在擴展功能上比Flume全面。但Logstash內部沒有persist queue,所以在異常情況下會出現數據丟失的問題。Filebeat是一個輕量型日誌採集工具,因爲Filebeat是Elastic Stack的一部分,因此能夠於ELK組件無縫協作。Filebeat佔用的內存要比Logstash小很多。性能比較穩健,很少出現宕機。

歷史好文推薦

  1. Kafka實戰寶典:一文帶解決Kafka常見故障處理

  2. Kafka實戰寶典:監控利器kafka-eagle

  3. Kafka實戰寶典:如何跨機房傳輸數據

  4. 談談ETL中的數據質量

你點的每個在看,我都認真當成了喜歡

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