流式數據採集和計算(三):Flume、Logstash、Filebeat調研報告

  1. 概述

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

  1. Flume

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

  1. Flume介紹

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

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

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

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

  1. Flume安裝部署準備
  1. Linux運行環境
  2. jdk1.6或更高版本
  3. 充足的內存和磁盤
  4. Flume安裝

wget https://www-eu.apache.org/dist/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz

tar -zxvf apache-flume-1.9.0-bin.tar.gz #解壓

mv apache-flume-1.9.0-bin flume  #改名

cd flume/

rm -rf docs/ #刪除沒用的幫助文檔

cd conf/

  1. 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

# –conf conf 指定flume配置文件的位置

#--conf-file 指定user配置文件的位置

#--name必須與配置文件中的別名一致。

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

  1. Logstash

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

  1. Logstash介紹

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

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

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

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

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

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

instance一個Logstash實例,可以

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

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

 

  1. Logstash安裝

#logstash 6.x版本要求運行在java8環境,且目前不支持java9;

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.4.tar.gz

tar -zxvf logstash-6.2.3.tar.gz #解壓

cd logstash-6.2.3

# -e是指定從命令行讀取配置

bin/logstash -e 'input { stdin {} } output { stdout {} }'           #啓動

  1. 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"

}

}

#

bin/logstash -f logstash.conf

# --config.test_and_exit 校驗配置文件,並輸出錯誤;

# --config.reload.automatic 使得配置文件修改後被自動加載,從而避免重新啓動logstash;

  1. Filebeat簡介

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

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

  1. Filebeat介紹

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

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

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

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

  1. Filebeat安裝

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.4-linux-x86_64.tar.gz

tar -zxvf filebeat-6.5.4-linux-x86_64

  1. Flume、Logstash、Filebeat特點
  1. Flume

1.分佈式的高可靠、高可用的系統,高效的從不同數據源收集聚合遷移大量數據到一個集中的數據存儲

2.安裝部署比較Logstash複雜

3.同樣以配置文件爲中心   提供了JavaAPI

4.是一個完整的基於插件的架構 有獨立開發的第三方插件

5.三層架構:source  channel  sink

Flume使用基於事務的數據傳遞方式來保證事件傳遞的可靠性。SourceSink被封裝進一個事務。事件被存放在Channel中直到該事件被處理,Channel中的事件纔會被移除。這是Flume提供的點到點的可靠機制。

從多級流來看,前一個agentsink和後一個agentsource同樣有它們的事務來保障數據的可靠性。

6.一個agent可將收集的數據輸出到多個目的地(HDFSJMS,agent.....

7.比較看重數據的傳輸,因此幾乎沒有數據的解析預處理。

  1. Logstash

      1.插件式組織方式,易於擴展和控制

2.數據源多樣不僅限於日誌文件,數據處理操作更豐富,可自定義(過濾,匹配過濾,轉變,解析......

3.可同時監控多個數據源(input插件多樣),同時也可將處理過的數據同時有不同多種輸出(如stdout到控制檯,同時存入ElasticSearch

4.安裝簡單,使用簡單,結構也簡單,所有操作全在配置文件設定,運行調用配置文件即可

5.Logstash web界面,可搜索日誌

6.有一整套的EKL日誌追蹤技術棧,可收集處理(Logstash),存儲管理搜索(ElasticSearch),圖形顯示分析(Kibana

7.做到更好的實時監控(插件設置時間間隔屬性,對監控的數據源檢查更新)

8. Logstash運行在jvm上,對服務器的資源消耗比較大

 

  1. Filebeat

1.支持多種模塊(AuditdApacheNGINXSystemMySQL 等等),可針對常見格式的日誌大大簡化收集、解析和可視化過程,只需一條命令即可。  

2.如果出現中斷,還會在一切恢復正常後,從中斷前停止的位置繼續開始.

3.當將數據發送到 LogstashElasticSearch時,Filebeat 使用背壓敏感協議,以應對更多的數據量。如果Logstash正在忙於處理數據,則會告訴 Filebeat 減慢讀取速度。一旦擁堵得到解決,Filebeat 就會恢復到原來的步伐並繼續傳輸數據.

4.能夠與 LogstashElasticSearchKibana無縫協作。無論您要使用 Logstash 轉換或充實日誌和文件,還是在ElasticSearch中隨意處理一些數據分析,亦或在Kibana中構建和分享儀表板,Filebeat都能輕鬆地將您的數據發送至最關鍵的地方。

5.Logs界面,可直接在Kibana中觀看對文件進行的tail操作的過程。

6.輕量級,對機器配置和資源要求低。

 

 

 

6.Flume、Logstash、Filebeat對比

 

Flume

Logstash

Filebeat

內存

cpu

 

背壓敏感協議

插件

需要些API

功能

從多種輸入端採集數據並輸出到多種輸出端

從多種輸入端採集並實時解析和轉換數據並輸出到多種輸出端

傳輸

輕重

相對較重

相對較重

輕量級二進制文件

過濾能力

自帶了分區和攔截器功能

強大的過濾能力

有過濾能力但是弱

進程

一臺服務器可以有多個進程,掛掉之後需要手動拉起

一臺服務器只允許一個logstash進程,掛掉之後需要手動拉起

十分穩定

原理

當source接收到Event時,它將其存儲到一個或多個channel中。channel是一個被動存儲,它將事件保持到被Flume消耗爲止。接收器將事件從channel中移除,並將其放入外部存儲庫(如HDFS)或將其轉發到流中下一個Flume代理的source。給代理內的source和sink與在通道中分段的事件異步運行。

Logstash使用管道的方式進行日誌的蒐集和輸出,分爲輸入input --> 處理filter(不是必須的) --> 輸出output,每個階段都有不同的替代方式

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

編寫語言

Java

Jruby

go語言

集羣

分佈式

單節點

單節點

輸出到多個接收方

支持

支持

6.0之前支持

二次開發或者擴展開發

一般

                  

7.總結

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

   

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