Flume——高可用的、高可靠的、分佈式日誌收集系統

第一章 是什麼

介紹

  • Flume是Cloudera提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統, Flume支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。

  • 當前Flume有兩個版本: Flume 0.9X版本的統稱Flume-og,Flume1.X版本的統稱Flume-ng。由於Flume-ng經過重大重構,與Flume-og有很大不同,使用時請注意區分。

  • flume 官網 http://flume.apache.org/

  • flume用戶手冊 http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html

架構

在這裏插入圖片描述

第二章 安裝

# 1、上傳軟件包

# 2、解壓
tar -zxf apache-flume-1.6.0-bin.tar.gz 

# 3、修改conf/flume-env.sh  
 ## 將配置jdk環境變量的註釋放開,並修改滑稽變量
 ## 刪除 docs目錄, docs 保存了這個版本的官方文檔 , 可以通過瀏覽器查看, 但是在虛擬機中無法查看,在分佈式配置分發時會影響分發效率(1 )
 rm -rf docs/
 注意:JAVA_OPTS 配置  如果我們傳輸文件過大 報內存溢出時 需要修改這個配置項
 
# 5、配置環境變量並重載 ( . /etc/profile )
export FLUME_HOME=/home/apache-flume-1.6.0-bin
export PATH=$PATH:$FLUME_HOME/bin
----------------------------
:! ls /usr/java
小技巧: 在編輯模式下執行ls命令


# 4、驗證安裝是否成功(2 )  
./flume-ng version

圖1
在這裏插入圖片描述
圖2
在這裏插入圖片描述

簡單案例實現(單節點實現)

注意: 現在版本已經更新到1.9 ,而本人使用的是1.6的版本, 配置方式早已相差甚遠
因此可以通過在Windows下打開該軟件包中的docs/ 目錄下的index.html查看相應版本的教程
以下配置都是基於官網教程配置

  1. 創建一個文件, 內容如下

    # example.conf: A single-node Flume configuration
    
    # Name the components on this agent
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source
    a1.sources.r1.type = netcat
    # 監控的節點
    a1.sources.r1.bind = node2
    a1.sources.r1.port = 44444
    
    # Describe the sink
    a1.sinks.k1.type = logger
    
    # Use a channel which buffers events in memory
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
  2. 運行該文件, 前置運行 (圖1,圖2,圖3)

    #運行該案例, -conf-file 文件名,  ,生成後的文件名 a1,  -Dflume.root.logger日誌輸出街邊, console在控制檯輸出
    flume-ng agent  --conf-file option --name a1 -Dflume.root.logger=INFO,console
    
  3. 在非 flume所在主機(node3)安裝一個telnet插件,用於遠程通信 yum install -y telnet

  4. noed3與flume主機建立連接 telnet node2 44444

  5. 建立連接後 ,輸入任意字符 (圖4) ,可以看到flume 會收集我們發送的數據 (圖5)

圖1
從這裏可以看出需要我們安裝 hdfs, hive, hbase的支持, 只要我們安裝了 ,運行時就會自動讀取這些應用
在這裏插入圖片描述
圖2
我們可以看到配置文件中配置的東西在啓動時生效了…
在這裏插入圖片描述

圖3
我們可以另起一個命令行 ,通過查看是否有44444這個應用端口號查看是否啓動成功
在這裏插入圖片描述

圖4
在這裏插入圖片描述
圖5
可以看到數據被完整的顯示, 以及每個字符的16進製表示
在這裏插入圖片描述

設置多Agent流(集羣配置)

需要我們在不同主機安裝 flume 並配置
爲了跨多個代理或跳流數據,前一個代理的接收器和當前跳的源需要是Avro類型,接收器指向源的主機名(或IP地址)和端口。

架構

爲了跨多個代理或跳流數據,前一個代理的接收器和當前跳的源需要是Avro類型,接收器指向源的主機名(或IP地址)和端口。

在這裏插入圖片描述

步驟

  1. 將單機版配置的flume 從node2發送到node3 ,並配置環境變量,方便以服務的形式啓動

    # 分發到node3
    scp -r flume/  node3:`pwd`
    
    # 環境變量配置(vim /etc/profile)
    export FLUME_HOME=/opt/flume
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin:$ZOOKEEPER_HOME/bin:$HIVE_HOME/bin:$HBASE_HOME/bin:$FLUME_HOME/bin
    
    # 重載配置
    . /etc/profile
    # 測試是否安裝成功
    [root@node3 opt]# flume-ng version
    Flume 1.6.0
    
  2. 修改node2的自定義配置文件 (vi option-fbs)

    # node2
    # example.conf: A single-node Flume configuration
    
    # Name the components on this agent
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source
    a1.sources.r1.type = netcat
    # 修改監控的節點
    a1.sources.r1.bind = node2
    a1.sources.r1.port = 44444
    
    # Describe the sink
    # 配置分步式 ,這裏需要修改
    a1.sinks.k1.type = avro
    a1.sinks.k1.hostname = node3
    a1.sinks.k1.port = 4545
    
    # Use a channel which buffers events in memory
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
  3. 修改node3的自定義配置文件avro源( vi option-fbs)

    # node3
    # example.conf: A single-node Flume configuration
    
    # Name the components on this agent
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source  端口需要對應,node3相當於單節點的node2
    a1.sources.r1.type = avro
    a1.sources.r1.bind = node3
    a1.sources.r1.port = 4545
    
    # Describe the sink
    a1.sinks.k1.type = logger
    
    # Use a channel which buffers events in memory
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    a1.sinks.k1.channel = c1
    
  4. 先啓動node3的flume, 再啓動node2的flume
    node2用於發送數據 , node3 用於接收數據

    # i在兩個節點都運行此命令
    flume-ng agent  --conf-file option-fbs --name a1 -Dflume.root.logger=INFO,console
    
    # 觀察啓動結果
    # 首先啓動node3 ,效果圖1
    # 然後啓動node2 ,效果圖2
    # 啓動node2後 , 再次查看node3的阻塞式界面, 效果如圖3 則啓動成功
    
  5. 測試效果
    依舊使用 telnet測試,在node3發送一條數據 ,查看在哪個節點顯示

    [root@node3 ~]# telnet node2 44444
    Trying 192.168.179.141...
    Connected to node2.
    Escape character is '^]'.
    # 在這裏輸入hello world
    hello world
    OK
    
    # 觀察圖4,5 ,並結合結構圖可知:
    node3, 中接收到了數據, 而node2沒有接收到數據
    我們從node3向node2發送數據 ,經過一系列的數據流轉 ,node2中的數據就會被髮送到node3顯示 , 而且一直如此~~~
    

圖1
avro源啓動成功
在這裏插入圖片描述
圖2
sink 配置成功
在這裏插入圖片描述
圖3
node2 連接node3成功
在這裏插入圖片描述

圖4
在這裏插入圖片描述
圖5
在這裏插入圖片描述

設置多Agent流的拓展

企業常見架構模式

日誌收集中一個非常常見的場景是大量日誌生成客戶端將數據發送給一些附加到存儲子系統的使用者代理。例如,從數百個Web服務器收集的日誌發送到十幾個寫入HDFS集羣的代理。

在這裏插入圖片描述
這可以在Flume中通過使用Avro接收器配置多個第一級代理來實現,所有代理都指向單個代理的Avro源(同樣,在這種情況下您可以使用節約源/接收器/客戶端)。第二層代理上的這個源將接收到的事件合併到單個信道中,該信道由接收器消耗到其最終目的地。
這樣配置可能會導致單點故障 , 因此可以配置高可用

流複用模式

Flume支持將事件流複用到一個或多個目的地。這是通過定義流複用器來實現的,該流複用器可以複製或選擇性地將事件路由到一個或多個通道。

在這裏插入圖片描述

上面的示例顯示了一個來自代理“foo”的源,它將流扇出三個不同的通道。這種風扇可以複製或多路複用。在複製流的情況下,每個事件都被髮送到所有三個通道。對於多路複用情況,當事件的屬性與預先配置的值匹配時,事件被傳遞到可用通道的子集。例如,如果一個名爲“txnType”的事件屬性被設置爲“Customer”,那麼它應該轉到Channel 1和Channel 3,如果它是“供應商”,那麼它應該轉到Channel 2,否則則轉到Channel 3。映射可以在代理的配置文件中設置。

第三章 Flume Source

Source是從其他生產數據的應用中接受數據的組件。Source可以監聽一個或者多個網絡端口,用於接受數據或者從本地文件系統中讀取數據,每個Source必須至少連接一個Channel。當然一個Source也可以連接多個Channnel,這取決於系統設計的需要。

所有的Flume Source如下 ,下面將介紹一些主要的源

Source類型 說明
Avro Source 支持Avro協議(實際上是Avro RPC),內置支持
Thrift Source 支持Thrift協議,內置支持
Exec Source 基於Unix的command在標準輸出上生產數據
JMS Source 從JMS系統(消息、主題)中讀取數據
Spooling Directory Source 監控指定目錄內數據變更
Twitter 1% firehose Source 通過API持續下載Twitter數據,試驗性質
Netcat Source 監控某個端口,將流經端口的每一個文本行數據作爲Event輸入
Sequence Generator Source 序列生成器數據源,生產序列數據
Syslog Sources 讀取syslog數據,產生Event,支持UDP和TCP兩種協議
HTTP Source 基於HTTP POST或GET方式的數據源,支持JSON、BLOB表示形式
Legacy Sources 兼容老的Flume OG中Source(0.9.x版本)

一 netcat源

netcat的源在給定端口上偵聽並將每一行文本轉換爲事件。表現得像數控nc -k -l [host] [port].…換句話說,它打開指定的端口並偵聽數據。期望提供的數據是換行符分隔的文本。每一行文本都被轉換成一個sink事件,並通過連接的通道發送。
常用於單節點的配置

二 avro源

偵聽Avro端口並從外部Avro客戶端流接收事件。當在另一個(前一跳)sink代理上與內置的Avro Sink配對時,它可以創建分層的集合拓撲。
我們搭建多Agent流的環境使用的就是avro源

三 exec源

  • exec源在啓動時運行給定的unix命令,並期望該進程在標準輸出上不斷生成數據(stderr被簡單丟棄,除非屬性logStdErr設置爲true)。如果進程因任何原因退出,源也會退出,並且不會產生進一步的數據。
  • 這意味着配置例如 cat [named pipe] or tail -F [file]將產生預期的結果日期可能不會-前兩個命令生成數據流,後者生成單個事件並退出。

利用exec源監控某個文件

利用node2上的 flume 進行配置
官方介紹如下

  1. 編寫自定義配置文件 option-exec

    [root@node2 dirflume]# vim option-exec
    
    # 配置文件內容
    # 主要是通過 a1.sources.r1.command = tail -F /root/log.txt 這條配置來監控log.txt文件中的內容
    # example.conf: A single-node Flume configuration
    
    # Name the components on this agent
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source
    
    a1.sources.r1.type = exec
    a1.sources.r1.command = tail -F /root/log.txt
    a1.sources.r1.channels = c1
    
    # Describe the sink
    a1.sinks.k1.type = logger
    
    # Use a channel which buffers events in memory
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
    
  2. 創建被監控的文件( 文件沒有會自動創建, 但是下面演示目錄不會)

    vim  /root/log.txt
    
    # 文件內容如下
    hello flume
    
  3. 啓動 flume ,查看結果( 圖1)

    flume-ng agent  --conf-file option-exec --name a1 -Dflume.root.logger=INFO,console
    
  4. 我們可以通過echo 向文件中追加內容 ,查看node2的 flume的阻塞式界面是否顯示數據(圖2,圖3)

    echo 'hello flume' >> /root/log.txt
    echo 'hello flume' >> /root/log.txt
    echo 'hello flume' >> /root/log.txt
    ....
    

    注意 :
    a.我們通常在項目中使用exec源來監控某些日誌文件的數據
    b.我們可以通過修改配置文件中的a1.sources.r1.command = tail -F /root/log.txt配置來決定是否在一開始讀取時讀取全部文件,如果我們使用的是 tail -f -n 3 /root/log.txt 則是從倒數第三行開始輸出

圖1
在這裏插入圖片描述
圖2
在這裏插入圖片描述
圖3
在這裏插入圖片描述

四 JMS源

JMS源從JMS目的地(如隊列或主題)讀取消息。作爲JMS應用程序,它應該與任何JMS提供程序一起工作,但只在ActiveMQ中進行了測試。JMS源提供可配置的批處理大小、消息選擇器、用戶/傳遞和消息到Flume事件轉換器。請注意,供應商提供的JMS JAR應該使用命令行上的plugins.d目錄(首選)、-classpath或Flume_CLASSPATH變量(flume-env.sh)包含在Flume類路徑中
現在來說用處不大

五 Spooling Directory 源

  • 通過此源,您可以通過將要攝取的文件放入磁盤上的“Spooling”目錄中來攝取數據。該源將監視指定目錄中的新文件,並從出現的新文件中解析事件。事件解析邏輯是可插入的。將給定文件完全讀入通道後,將其重命名以指示完成(或選擇刪除)。

  • 與Exec源不同,此源是可靠的,即使Flume重新啓動或終止,它也不會丟失數據。爲了獲得這種可靠性,必須僅將不可變的唯一命名的文件放入Spooling目錄中。Flume嘗試檢測這些問題情況,如果違反這些條件,將返回失敗:

  • 如果將文件放入Spooling目錄後寫入文件,Flume將在其日誌文件中打印錯誤並停止處理。
    如果以後再使用文件名,Flume將在其日誌文件中打印錯誤並停止處理。
    爲避免上述問題,將唯一的標識符(例如時間戳)添加到日誌文件名稱(當它們移到Spooling目錄中時)可能會很有用。

  • 儘管有此來源的可靠性保證,但是在某些情況下,如果發生某些下游故障,則事件可能會重複。這與Flume其他組件提供的保證是一致的。

  • 官方介紹如下

利用Spooling Directory源監控目錄

  1. 修改自定義配置文件( vim .option-spooldir),內容如下

    # example.conf: A single-node Flume configuration
    
    # Name the components on this agent
    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source
    a1.sources.r1.type = spooldir
    a1.sources.r1.spoolDir = /root/log
    a1.sources.r1.fileHeader = false
    
    
    
    # Describe the sink
    a1.sinks.k1.type = logger
    
    # Use a channel which buffers events in memory
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
  2. 根據配置文件中a1.sources.r1.spoolDir = /root/log 的配置,創建 .root/log目錄

  3. 啓動 flume

    flume-ng agent  --conf-file option-spooldir --name a1 -Dflume.root.logger=INFO,console
    
  4. 其他文件的目錄下的文件移動到 /root/log文件夾下, 觀察flume的阻塞式界面(圖1)
    可以看到,被讀取後文件的後綴名會被修改( 圖2 )

  5. 補充: 我們可以自定義這個後綴名 ,通過圖3 設置 ,效果如圖4 所示

圖1
在這裏插入圖片描述
圖2
在這裏插入圖片描述

圖3
通過修改自定義文件的下面配置, 可以設置文件被讀取後的後綴名 ,默認是 .completed
在這裏插入圖片描述
圖4
修改後,再次啓動 flume,查看被讀取目錄下的文件,可以看到被讀取的文件後綴變成了 .sxt結尾
在這裏插入圖片描述

六 Kafka源

KafkaSource是一個ApacheKafka消費者,負責閱讀來自Kafka主題的信息。如果您有多個Kafka源正在運行,您可以使用相同的ConsumerGroup來配置它們,這樣每個用戶都會爲主題讀取一組唯一的分區。

注意: Kafka Source覆蓋兩個Kafka消費者參數:

  • auto.committee.Enable被源設置爲“false”,我們提交每一批。爲了提高性能,可以將其設置爲“true”,但是,這可能導致數據使用者的丟失。
  • timeout.ms被設置爲10 ms,所以當我們檢查Kafka是否有新數據時,我們最多要等待10 ms才能到達,將其設置爲更高的值可以降低CPU利用率(我們將在較少的緊循環中輪詢Kafka),但也意味着寫入通道的延遲更高(因爲我們將等待更長的數據到達時間)。

部分配置參數參考

ier1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource
tier1.sources.source1.channels = channel1
tier1.sources.source1.zookeeperConnect = localhost:2181
tier1.sources.source1.topic = test1
tier1.sources.source1.groupId = flume
tier1.sources.source1.kafka.consumer.timeout.ms = 100

第四章 Flume Channel

Channel主要是用來緩衝Agent以及接受,但尚未寫出到另外一個Agent或者存儲系統的數據。Channel的行爲比較像隊列,Source寫入到他們,Sink從他們中讀取數據。多個Source可以安全的寫入到同一Channel中,並且多個Sink可以從同一個Channel中讀取數據。可是一個Sink只能從一個Channel讀取數據,如果多個Sink從相同的Channel中讀取數據,系統可以保證只有一個Sink會從Channel讀取一個特定的事件。

關於channel的配置見 官網channel配置介紹

常見Flume Channel的分類

Channel類型 說明
Memory Channel Event數據存儲在內存中
JDBC Channel Event數據存儲在持久化存儲中,當前Flume Channel內置支持Derby
File Channel Event數據存儲在磁盤文件中
Spillable Memory Channel Event數據存儲在內存中和磁盤上,當內存隊列滿了,會持久化到磁盤文件
Pseudo Transaction Channel 測試用途
Custom Channel 自定義Channel實現

第五章 Flume Sinks

Sink會連續輪訓各自的Channel來讀取和刪除事件。Sink將事件推送到下一階段(RPC Sink的情況下),或者到達最終目的地。一旦在下一階段或者其目的地中數據是安全的,Sink通過事務提交通知Channel,可以從Channel中刪除這一事件。

所有sink類型如下 ,下面介紹一些主要的sink

Sink類型 說明
HDFS Sink 數據寫入HDFS
Logger Sink 數據寫入日誌文件
Avro Sink 數據被轉換成Avro Event,然後發送到配置的RPC端口上
Thrift Sink 數據被轉換成Thrift Event,然後發送到配置的RPC端口上
IRC Sink 數據在IRC上進行回放
File Roll Sink 存儲數據到本地文件系統
Null Sink 丟棄到所有數據
HBase Sink 數據寫入HBase數據庫
Morphline Solr Sink 數據發送到Solr搜索服務器(集羣)
ElasticSearch Sink 數據發送到Elastic Search搜索服務器(集羣)
Kite Dataset Sink 寫數據到Kite Dataset,試驗性質的
Custom Sink 自定義Sink實現

HDFS Sink

這個接收器將事件寫入Hadoop分佈式文件系統(HDFS)。它目前支持創建文本和序列文件。它支持兩種文件類型的壓縮。可以根據經過的時間、數據大小或事件數週期性地滾動文件(關閉當前文件並創建新文件)。它還根據事件起源的時間戳或機器等屬性對數據進行存儲/分區。HDFS目錄路徑可能包含格式轉義序列,這些轉義序列將被HDFS接收器替換,以生成目錄/文件名來存儲事件。使用此接收器需要安裝Hadoop,以便Flume可以使用HadoopJAR與HDFS集羣通信。注意,支持sync()調用的Hadoop版本是必需的。

配置參數

在這裏插入圖片描述

注意

  • 正在使用的文件的名稱將經過修飾,以末尾包含“ .tmp”。關閉文件後,將刪除此擴展名。這樣可以排除目錄中的部分完整文件。必需的屬性以粗體顯示。
  • 對於所有與時間相關的轉義序列,事件的標頭中必須存在帶有鍵“ timestamp”的標頭(除非hdfs.useLocalTimeStamp設置爲true)。一種自動添加此方法的方法是使用TimestampInterceptor。

配置參數
在這裏插入圖片描述

案例演示

  1. 創建flume 的自定義配置文件 hdfs-sink

    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source
    a1.sources.r1.type = spooldir
    a1.sources.r1.spoolDir = /home/logs
    a1.sources.r1.fileHeader = true
    
    # Describe the sink
    a1.sinks.k1.type = logger
    a1.sinks.k1.type=hdfs
    # 這裏注意flume註冊時會自動加載hdfs, 因此可以不指定hdfs的路徑
    a1.sinks.k1.hdfs.path=/flume/events/%Y-%m-%d/%H%M
    
    ##每隔60s或者文件大小超過10M的時候產生新文件
    # hdfs有多少條消息時新建文件,0不基於消息個數
    a1.sinks.k1.hdfs.rollCount=0
    # hdfs創建多長時間新建文件,0不基於時間
    a1.sinks.k1.hdfs.rollInterval=60
    # hdfs多大時新建文件,0不基於文件大小
    a1.sinks.k1.hdfs.rollSize=10240
    # 當目前被打開的臨時文件在該參數指定的時間(秒)內,沒有任何數據寫入,則將該臨時文件關閉並重命名成目標文件
    a1.sinks.k1.hdfs.idleTimeout=3
    
    ## 每五分鐘生成一個目錄:
    # 是否啓用時間上的”捨棄”,這裏的”捨棄”,類似於”四捨五入”,後面再介紹。如果啓用,則會影響除了%t的其他所有時間表達式
    a1.sinks.k1.hdfs.round=true
    # 時間上進行“捨棄”的值;
    a1.sinks.k1.hdfs.roundValue=5
    # 時間上進行”捨棄”的單位,包含:second,minute,hour
    a1.sinks.k1.hdfs.roundUnit=second
    a1.sinks.k1.hdfs.fileType=DataStream
    a1.sinks.k1.hdfs.useLocalTimeStamp=true
    # 設置超時時間
    a1.sinks.k1.hdfs.callTimeout=60000
    
    # Use a channel which buffers events in memory
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
  2. 根據自定義文件a1.sources.r1.spoolDir = /home/logs,創建目錄 ./home/logs

  3. 運行 flume flume-ng agent --conf-file hdfs-sink --name a1 -Dflume.root.logger=INFO,console

  4. 移動任意日誌文件到 /home/logs 目錄下, 效果如圖1, 圖2所示

圖1
flume 阻塞式界面輸出相關信息
在這裏插入圖片描述

圖2
可以看到日誌被以時間的順序讀取到hdfs目錄下
在這裏插入圖片描述

注意: 關於其他sink的配置見官網 官網介紹如下
在這裏插入圖片描述

flume在項目中的應用

flume讀取指定目錄文件(nginx的指定日誌文件 這裏是Nginx的配置 )下的數據
並將其收集保存在本地具體實現步驟如下

  1. 編寫 flume的自定義配置文件 ,文件名 project
    這裏指定了讀取nginx 的訪問日誌文件/opt/data/access.log
    以及讀取後的文件在hdfs的中的目錄/log/%Y%m%d ,%Y%m%d是文件前面的目錄名爲當前日期

    idleTimeout = 10 代表10s內如果沒有文件傳輸, 自動關閉文件該文件的寫入功能 ,10s再寫入會被寫入到另一個文件中

    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    # Describe/configure the source
    a1.sources.r1.type = spooldir
    a1.sources.r1.spoolDir = /home/logs
    a1.sources.r1.fileHeader = true
    
    # Describe the sink
    ## 指定sink爲hdfs, 即從hdfs那裏接受channel中的數據, 並指定hdfs的相關目錄
    a1.sinks.k1.type=hdfs
    a1.sinks.k1.hdfs.path=hdfs://logs/flume/%Y-%m-%d/%H%M
    
    ##每隔60s或者文件大小超過10M的時候產生新文件
    # hdfs有多少條消息時新建文件,0不基於消息個數
    a1.sinks.k1.hdfs.rollCount=0
    # hdfs創建多長時間新建文件,0不基於時間,時間單位 s
    a1.sinks.k1.hdfs.rollInterval=60
    # hdfs多大時新建文件,0不基於文件大小
    a1.sinks.k1.hdfs.rollSize=10240
    # 當目前被打開的臨時文件在該參數指定的時間(秒)內,沒有任何數據寫入,則將該臨時文件關閉並重命名成目標文件
    a1.sinks.k1.hdfs.idleTimeout=3
    
    a1.sinks.k1.hdfs.fileType=DataStream
    a1.sinks.k1.hdfs.useLocalTimeStamp=true
    
    ## 每五分鐘生成一個目錄:
    # 是否啓用時間上的”捨棄”,這裏的”捨棄”,類似於”四捨五入”,後面再介紹。如果啓用,則會影響除了%t的其他所有時間表達式
    a1.sinks.k1.hdfs.round=true
    # 時間上進行“捨棄”的值;
    a1.sinks.k1.hdfs.roundValue=5
    # 時間上進行”捨棄”的單位,包含:second,minute,hour
    a1.sinks.k1.hdfs.roundUnit=minute
    
    # Use a channel which buffers events in memory
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 1000
    a1.channels.c1.transactionCapacity = 100
    
    # Bind the source and sink to the channel
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
  2. 通過該自定義配置文件運行 flume

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

資料分享

鏈接:https://pan.baidu.com/s/1uzhq8-aMXYm9qqjpDPeclg
點贊私聊獲取配套Flume的軟件安裝包~~~
提取碼:8a3c
複製這段內容後打開百度網盤手機App,操作更方便哦

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