分散式日誌收集系統 —— Flume

来源:https://www.cnblogs.com/heibaiying/archive/2019/08/31/11439250.html
-Advertisement-
Play Games

一、Flume簡介 Apache Flume 是一個分散式,高可用的數據收集系統。它可以從不同的數據源收集數據,經過聚合後發送到存儲系統中,通常用於日誌數據的收集。Flume 分為 NG 和 OG (1.0 之前) 兩個版本,NG 在 OG 的基礎上進行了完全的重構,是目前使用最為廣泛的版本。下麵的 ...


一、Flume簡介

Apache Flume 是一個分散式,高可用的數據收集系統。它可以從不同的數據源收集數據,經過聚合後發送到存儲系統中,通常用於日誌數據的收集。Flume 分為 NG 和 OG (1.0 之前) 兩個版本,NG 在 OG 的基礎上進行了完全的重構,是目前使用最為廣泛的版本。下麵的介紹均以 NG 為基礎。

二、Flume架構和基本概念

下圖為 Flume 的基本架構圖:

2.1 基本架構

外部數據源以特定格式向 Flume 發送 events (事件),當 source 接收到 events 時,它將其存儲到一個或多個 channelchanne 會一直保存 events 直到它被 sink 所消費。sink 的主要功能從 channel 中讀取 events,並將其存入外部存儲系統或轉發到下一個 source,成功後再從 channel 中移除 events

2.2 基本概念

1. Event

Evnet 是 Flume NG 數據傳輸的基本單元。類似於 JMS 和消息系統中的消息。一個 Evnet 由標題和正文組成:前者是鍵/值映射,後者是任意位元組數組。

2. Source

數據收集組件,從外部數據源收集數據,並存儲到 Channel 中。

3. Channel

Channel 是源和接收器之間的管道,用於臨時存儲數據。可以是記憶體或持久化的文件系統:

  • Memory Channel : 使用記憶體,優點是速度快,但數據可能會丟失 (如突然宕機);
  • File Channel : 使用持久化的文件系統,優點是能保證數據不丟失,但是速度慢。

4. Sink

Sink 的主要功能從 Channel 中讀取 Evnet,並將其存入外部存儲系統或將其轉發到下一個 Source,成功後再從 Channel 中移除 Event

5. Agent

是一個獨立的 (JVM) 進程,包含 SourceChannelSink 等組件。

2.3 組件種類

Flume 中的每一個組件都提供了豐富的類型,適用於不同場景:

  • Source 類型 :內置了幾十種類型,如 Avro SourceThrift SourceKafka SourceJMS Source

  • Sink 類型 :HDFS SinkHive SinkHBaseSinksAvro Sink 等;

  • Channel 類型 :Memory ChannelJDBC ChannelKafka ChannelFile Channel 等。

對於 Flume 的使用,除非有特別的需求,否則通過組合內置的各種類型的 Source,Sink 和 Channel 就能滿足大多數的需求。在 Flume 官網 上對所有類型組件的配置參數均以表格的方式做了詳盡的介紹,並附有配置樣例;同時不同版本的參數可能略有所不同,所以使用時建議選取官網對應版本的 User Guide 作為主要參考資料。

三、Flume架構模式

Flume 支持多種架構模式,分別介紹如下

3.1 multi-agent flow


Flume 支持跨越多個 Agent 的數據傳遞,這要求前一個 Agent 的 Sink 和下一個 Agent 的 Source 都必須是 Avro 類型,Sink 指向 Source 所在主機名 (或 IP 地址) 和埠(詳細配置見下文案例三)。

3.2 Consolidation


日誌收集中常常存在大量的客戶端(比如分散式 web 服務),Flume 支持使用多個 Agent 分別收集日誌,然後通過一個或者多個 Agent 聚合後再存儲到文件系統中。

3.3 Multiplexing the flow

Flume 支持從一個 Source 向多個 Channel,也就是向多個 Sink 傳遞事件,這個操作稱之為 Fan Out(扇出)。預設情況下 Fan Out 是向所有的 Channel 複製 Event,即所有 Channel 收到的數據都是相同的。同時 Flume 也支持在 Source 上自定義一個復用選擇器 (multiplexing selector) 來實現自定義的路由規則。

四、Flume配置格式

Flume 配置通常需要以下兩個步驟:

  1. 分別定義好 Agent 的 Sources,Sinks,Channels,然後將 Sources 和 Sinks 與通道進行綁定。需要註意的是一個 Source 可以配置多個 Channel,但一個 Sink 只能配置一個 Channel。基本格式如下:
<Agent>.sources = <Source>
<Agent>.sinks = <Sink>
<Agent>.channels = <Channel1> <Channel2>

# set channel for source
<Agent>.sources.<Source>.channels = <Channel1> <Channel2> ...

# set channel for sink
<Agent>.sinks.<Sink>.channel = <Channel1>
  1. 分別定義 Source,Sink,Channel 的具體屬性。基本格式如下:

<Agent>.sources.<Source>.<someProperty> = <someValue>

# properties for channels
<Agent>.channel.<Channel>.<someProperty> = <someValue>

# properties for sinks
<Agent>.sources.<Sink>.<someProperty> = <someValue>

五、Flume的安裝部署

為方便大家後期查閱,本倉庫中所有軟體的安裝均單獨成篇,Flume 的安裝見:

Linux 環境下 Flume 的安裝部署

六、Flume使用案例

介紹幾個 Flume 的使用案例:

  • 案例一:使用 Flume 監聽文件內容變動,將新增加的內容輸出到控制台。
  • 案例二:使用 Flume 監聽指定目錄,將目錄下新增加的文件存儲到 HDFS。
  • 案例三:使用 Avro 將本伺服器收集到的日誌數據發送到另外一臺伺服器。

6.1 案例一

需求: 監聽文件內容變動,將新增加的內容輸出到控制台。

實現: 主要使用 Exec Source 配合 tail 命令實現。

1. 配置

新建配置文件 exec-memory-logger.properties,其內容如下:

#指定agent的sources,sinks,channels
a1.sources = s1  
a1.sinks = k1  
a1.channels = c1  
   
#配置sources屬性
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /tmp/log.txt
a1.sources.s1.shell = /bin/bash -c

#將sources與channels進行綁定
a1.sources.s1.channels = c1
   
#配置sink 
a1.sinks.k1.type = logger

#將sinks與channels進行綁定  
a1.sinks.k1.channel = c1  
   
#配置channel類型
a1.channels.c1.type = memory

2. 啟動 

flume-ng agent \
--conf conf \
--conf-file /usr/app/apache-flume-1.6.0-cdh5.15.2-bin/examples/exec-memory-logger.properties \
--name a1 \
-Dflume.root.logger=INFO,console

3. 測試

向文件中追加數據:

控制台的顯示:

6.2 案例二

需求: 監聽指定目錄,將目錄下新增加的文件存儲到 HDFS。

實現:使用 Spooling Directory SourceHDFS Sink

1. 配置

#指定agent的sources,sinks,channels
a1.sources = s1  
a1.sinks = k1  
a1.channels = c1  
   
#配置sources屬性
a1.sources.s1.type =spooldir  
a1.sources.s1.spoolDir =/tmp/logs
a1.sources.s1.basenameHeader = true
a1.sources.s1.basenameHeaderKey = fileName 
#將sources與channels進行綁定  
a1.sources.s1.channels =c1 

   
#配置sink 
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H/
a1.sinks.k1.hdfs.filePrefix = %{fileName}
#生成的文件類型,預設是Sequencefile,可用DataStream,則為普通文本
a1.sinks.k1.hdfs.fileType = DataStream  
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#將sinks與channels進行綁定  
a1.sinks.k1.channel = c1
   
#配置channel類型
a1.channels.c1.type = memory

2. 啟動

flume-ng agent \
--conf conf \
--conf-file /usr/app/apache-flume-1.6.0-cdh5.15.2-bin/examples/spooling-memory-hdfs.properties \
--name a1 -Dflume.root.logger=INFO,console

3. 測試

拷貝任意文件到監聽目錄下,可以從日誌看到文件上傳到 HDFS 的路徑:

# cp log.txt logs/

查看上傳到 HDFS 上的文件內容與本地是否一致:

# hdfs dfs -cat /flume/events/19-04-09/13/log.txt.1554788567801

6.3 案例三

需求: 將本伺服器收集到的數據發送到另外一臺伺服器。

實現:使用 avro sourcesavro Sink 實現。

1. 配置日誌收集Flume

新建配置 netcat-memory-avro.properties,監聽文件內容變化,然後將新的文件內容通過 avro sink 發送到 hadoop001 這台伺服器的 8888 埠:

#指定agent的sources,sinks,channels
a1.sources = s1
a1.sinks = k1
a1.channels = c1

#配置sources屬性
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /tmp/log.txt
a1.sources.s1.shell = /bin/bash -c
a1.sources.s1.channels = c1

#配置sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop001
a1.sinks.k1.port = 8888
a1.sinks.k1.batch-size = 1
a1.sinks.k1.channel = c1

#配置channel類型
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

2. 配置日誌聚合Flume

使用 avro source 監聽 hadoop001 伺服器的 8888 埠,將獲取到內容輸出到控制台:

#指定agent的sources,sinks,channels
a2.sources = s2
a2.sinks = k2
a2.channels = c2

#配置sources屬性
a2.sources.s2.type = avro
a2.sources.s2.bind = hadoop001
a2.sources.s2.port = 8888

#將sources與channels進行綁定
a2.sources.s2.channels = c2

#配置sink
a2.sinks.k2.type = logger

#將sinks與channels進行綁定
a2.sinks.k2.channel = c2

#配置channel類型
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100

3. 啟動

啟動日誌聚集 Flume:

flume-ng agent \
--conf conf \
--conf-file /usr/app/apache-flume-1.6.0-cdh5.15.2-bin/examples/avro-memory-logger.properties \
--name a2 -Dflume.root.logger=INFO,console

在啟動日誌收集 Flume:

flume-ng agent \
--conf conf \
--conf-file /usr/app/apache-flume-1.6.0-cdh5.15.2-bin/examples/netcat-memory-avro.properties \
--name a1 -Dflume.root.logger=INFO,console

這裡建議按以上順序啟動,原因是 avro.source 會先與埠進行綁定,這樣 avro sink 連接時才不會報無法連接的異常。但是即使不按順序啟動也是沒關係的,sink 會一直重試,直至建立好連接。

4.測試

向文件 tmp/log.txt 中追加內容:

可以看到已經從 8888 埠監聽到內容,併成功輸出到控制台:

更多大數據系列文章可以參見 GitHub 開源項目大數據入門指南


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 進入Windows系統控制面板-->外觀和個性化-->字體(選擇一個字體文件simsun.ttc複製)進入zabbix的web伺服器[root@test-zabbix]# cd ~/zabbix/assets/fonts/上傳文件simsun.ttc至該目錄[root@test-zabbix]# m ...
  • 1.在Windows系統中的C盤,新建一個zabbix目錄C:/zabbix2.先下載zabbix-agent的安裝包https://assets.zabbix.com/downloads/4.0.10/zabbix_agents-4.0.10-win-amd64.zip3.解壓zabbix_age ...
  • 最近心血來潮想給自己的筆記本裝一套linux系統作為開發環境, 說乾就乾,首先先收集一下現在linux主流版本, 貌似現在市場上應用伺服器比較多的是redhat相關產品,而ubuntu的優勢在於它龐大的社區支持用戶群體, 個人任務兩個都差不多,至於選擇哪個看個人興趣。 我選擇的是RedHat旗下Ce ...
  • 信號量 一、 1、信號量的數據類型為結構sem_t,它本質上是一個長整型的數。 2、例如: typedef struct { struct _pthread_fastlock __sem_lock; int __sem_value; _pthread_descr __sem_waiting; } s ...
  • [TOC] mysql資料庫 資料庫是什麼 存儲數的的倉庫 列表,字典....等等,都是記憶體中的,其缺點:斷點即消失, 優點:速度快 文件存儲, 缺點: 速度慢, 優點: 可以實現永久保存 本質就是一套基於CS結構的,客戶端和服務端程式,最終的數據存儲在伺服器端的磁碟中 為什麼要使用資料庫 直接使用 ...
  • [學習筆記] 下載hadoop-2.7.4-src.tar.gz,拷貝hadoop-2.7.4-src.tar.gz中hadoop-mapreduce-project\hadoop-mapreduce-examples\src\main\java\org\apache\hadoop\examples ...
  • Navicat Premium 功能很強大,支持不同資料庫客戶端的連接,並且使用工具可以生成兩個庫差異的sql腳本,方便dev與test環境表結構同步,具體操作方法如下 單擊運行,實現兩個庫中模式表結構同步,也可導出sql腳本,發給測試人員自己執行sql腳本。 Navicat Premium 12. ...
  • 1. MySQL中的函數 <1>加密函數 <2>聚合函數 <3>數學相關的函數 <4>字元相關的函數 <5>日期函數 <6>流程式控制制函數 2. 用戶的創建和授權(DCL) <1>授權的語法格式 <2>取消許可權的語法格式 <3>顯示授予的許可權 <4>刪除用戶 3.MySQL中的索引 <1>概念: <2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...