主頁 > 資料庫 > 一次flume exec source采集日志到kafka因為單條日志資料非常大同步失敗的踩坑帶來的思考

一次flume exec source采集日志到kafka因為單條日志資料非常大同步失敗的踩坑帶來的思考

2020-09-15 12:11:09 資料庫

本次遇到的問題描述,日志采集同步時,當單條日志(日志檔案中一行日志)超過2M大小,資料無法采集同步到kafka,分析后,共踩到如下幾個坑,
1、flume采集時,通過shell+EXEC(tail -F xxx.log 的方式) source來獲取日志時,當單條日志過大超過1M時,source端無法從日志中獲取到Event,
2、日志超過1M后,flume的kafka sink 作為生產者發送給日志給kafka失敗,kafka無法收到訊息,
以下針對踩的這兩個坑做分析,flume 我使用的是1.9.0版本, kafka使用的是2.11-2.0.0版本

問題一、flume采集時,通過shell+EXEC(tail -F  xxx.log 的方式) source來獲取日志時,當單條日志過大超過1M時,source端無法從日志中獲取到Event,flume的配置如下:

 ...... agent.sources = seqGenSrc ...... # For each one of the sources, the type is definedagent.sources.seqGenSrc.type = exec#agent.sources.seqGenSrc.command = tail -F /opt/logs/test.log|grep businessCollection|awk -F '- {' '{print "{"$2}'agent.sources.seqGenSrc.command = tail -F /opt/logs/test.log|grep businessCollectionagent.sources.seqGenSrc.shell = /bin/bash -cagent.sources.seqGenSrc.batchSize = 1agent.sources.seqGenSrc.batchTimeout = 90000......

  原因:采用shell+EXEC方式的時候,flume的原始碼中使用的是如下的方式來獲取日志

    private Process process = null;	//使用這種方式來執行命令,process = Runtime.getRuntime().exec(commandArgs);//讀取日志 reader = new BufferedReader(  new InputStreamReader(process.getInputStream(), charset));

  

在一行日志超過1M后,這個代碼就假死了,一直宕住,導致無法獲取到資料,

針對這個問題處理方式:
方式一:修改原始碼的實作方式,(1.9.0的原始碼 對應的是原始碼中的flume-ng-core 專案中的org.apache.flume.source.ExecSource.java 這個類)

//process的采用如下方式獲和執行命令,就改一行代碼,增加.redirectErrorStream(true)后,輸入流就都可以獲取到,哪怕超過1Mprocess = new ProcessBuilder(commandArgs).redirectErrorStream(true).start();

  

  

 

修改完成后,重新打包編譯,然后將生成的jar包替換原來老的jar包,

  方式二:放棄EXECSource,使用TAILDIR Source, 使用這個source時,對應的配置如下:

 ...... agent.sources = seqGenSrc ...... # For each one of the sources, the type is definedagent.sources.seqGenSrc.type = TAILDIRagent.sources.seqGenSrc.positionFile = ./taildir_position.jsonagent.sources.seqGenSrc.filegroups = seqGenSrcagent.sources.seqGenSrc.filegroups.seqGenSrc = https://www.cnblogs.com/opt/logs/test.logagent.sources.seqGenSrc.fileHeader = falseagent.sources.seqGenSrc.batchSize = 1......

  建議采用TAILDIR Source 比較好,這個可以對多個日志進行監控和采集,而且日志采集時會記錄日志采集位置到positionFile 中,這樣日志采集不會重復,EXEC SOURCE在重啟采集時資料會重復采集,還需要其他的方式去避免重復采集

問題二、日志超過1M后,flume的kafka sink 作為生產者發送給日志給kafka失敗,kafka無法收到訊息
原因:kafka 在默認情況下,只能接收1M大小以內的訊息,在沒有做自定義設定時,所以單條訊息大于1M后是無法處理的,
處理方式如下:

1)、修改kafka 服務端server.properties檔案,做如下設定(修改大小限制)

# The send buffer (SO_SNDBUF) used by the socket serversocket.send.buffer.bytes=502400# The receive buffer (SO_RCVBUF) used by the socket serversocket.receive.buffer.bytes=502400# The maximum size of a request that the socket server will accept (protection against OOM)socket.request.max.bytes=104857600message.max.bytes=5242880replica.fetch.max.bytes=6291456

2)、修改producer.properties,做如下設定(修改大小限制)

# the maximum size of a request in bytesmax.request.size= 9242880

3)、java代碼中在初始化kafka 生產者時,也需要指定max.request.size= 9242880

 本文作者:張永清,轉載請注明出處:一次flume exec source采集日志到kafka因為單條日志資料非常大同步失敗的踩坑帶來的思考

        Properties properties = new Properties();		...		      properties.put("max.request.size", 5242880);			  ...			KafkaProducer<Object,Object>  kafkaProducer = new KafkaProducer<Object,Object>(properties);

  4)、消費者在消費kafka資料時,也需要注意設定消費訊息的大小限制

 本文作者:張永清,轉載請注明出處:一次flume exec source采集日志到kafka因為單條日志資料非常大同步失敗的踩坑帶來的思考

            Properties properties = new Properties();			...            properties.put(ConsumerConfig.FETCH_MAX_BYTES_CONFIG, 6291456);						...				 KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);  

對于flume不了的同學,可以看flume 1.9中文版用戶指南:https://www.h3399.cn/201906/700076.html  

flume1.9 用戶指南 (中文版)

概述

Apache Flume 是一個分布式, 可靠且可用的系統, 用于有效地從許多不同的 source 收集, 聚合和移動大量日志資料到集中式資料存盤.

Apache Flume 的使用不僅限于日志資料聚合. 由于資料 source 是可定制的, 因此 Flume 可用于傳輸大量 event 資料, 包括但不限于網路流量資料, 社交媒體生成的資料, 電子郵件訊息以及幾乎任何可能的資料 source.

Apache Flume 是 Apache Software Foundation 的頂級專案.

系統要求

Java 運行時環境 - Java 1.8 或更高版本

記憶體 - 為 source,channel 或 sink 配置的記憶體

磁盤空間 - channel 或 sink 配置的磁盤空間

目錄權限 - agent 使用的目錄的讀 / 寫權限

架構

資料流模型

Flume event 被定義為具有位元組有效負載和可選字串屬性集的資料流單元. Flume agent 是一個 (JVM) 行程, 它承載 event 從外部 source 流向下一個目標 (躍點) 的組件.

?

Flume source 消耗由外部 source(如 Web 服務器)傳遞給它的 event . 外部 source 以目標 Flume source 識別的格式向 Flume 發送 event . 例如, Avro Flume source 可用于從 Avro 客戶端或從 Avrosink 發送 event 的流中的其他 Flume agent 接收 Avroevent . 可以使用 Thrift Flume Source 定義類似的流程, 以接收來自 Thrift Sink 或 Flume Thrift Rpc 客戶端或 Thrift 客戶端的 event , 這些客戶端使用 Flume thrift 協議生成的任何語言撰寫. 當 Flume source 接收 event 時, 它將其存盤到一個或多個 channels . 該 channel 是一個被動存盤器, 可以保持 event 直到它被 Flume sink 消耗. 檔案 channel 就是一個例子 - 它由本地檔案系統支持. sink 從 channel 中移除 event 并將其放入外部存盤庫 (如 HDFS(通過 Flume HDFS sink)) 或將其轉發到流中下一個 Flume agent (下一跳)的 Flume source. 給定 agent 中的 source 和 sink 與 channel 中暫存的 event 異步運行.

復雜的流程

Flume 允許用戶構建多跳流, 其中 event 在到達最終目的地之前經過多個 agent . 它還允許 fan-in 和 fan-out, 背景關系路由和故障跳躍的備份路由(故障轉移).

可靠性

event 在每個 agent 的 channel 中進行. 然后將 event 傳遞到流中的下一個 agent 或終端存盤庫(如 HDFS). 只有將 event 存盤在下一個 agent 的 channel 或終端存盤庫中后, 才會從 channel 中洗掉這些 event . 這就是 Flume 中的單跳訊息傳遞語意如何提供流的端到端可靠性.

Flume 使用事務方法來保證 event 的可靠傳遞. source 和 sink 分別在事務中封裝由 channel 提供的事務中放置或提供的 event 的存盤 / 檢索. 這可確保 event 集在流中從一個點到另一個點可靠地傳遞. 在多跳流的情況下, 來自前一跳的 sink 和來自下一跳的 source 都運行其事務以確保資料安全地存盤在下一跳的 channel 中.

可恢復性

event 在 channel 中進行, 該 channel 管理從故障中恢復. Flume 支持由本地檔案系統支持的持久檔案 channel. 還有一個記憶體 channel, 它只是將 event 存盤在記憶體中的佇列中, 這更快, 但是當 agent 行程死亡時仍然留在記憶體 channel 中的任何 event 都無法恢復.

設定

設定 agent

Flume agent 配置存盤在本地組態檔中. 這是一個遵循 Java 屬性檔案格式的文本檔案. 可以在同一組態檔中指定一個或多個 agent 的配置. 組態檔包括 agent 中每個 source,sink 和 channel 的屬性以及它們如何連接在一起以形成資料流.

配置單個組件

流中的每個組件 (source,sink 或 channel) 都具有特定于型別和實體化的名稱, 型別和屬性集. 例如, Avrosource 需要主機名 (或 IP 地址) 和埠號來接收資料. 記憶體 channel 可以具有最大佇列大小 ("容量"),HDFS sink 需要知道檔案系統 URI, 創建檔案的路徑, 檔案輪換頻率("hdfs.rollInterval") 等. 組件的所有此類屬性需要在托管 Flume agent 的屬性檔案中設定.

將各個部分連接在一起

agent 需要知道要加載哪些組件以及它們如何連接以構成流程. 這是通過列出 agent 中每個 source,sink 和 channel 的名稱, 然后為每個 sink 和 source 指定連接 channel 來完成的. 例如, agent 通過名為 file-channel 的檔案 channel 將 event 從名為 avroWeb 的 Avrosource 流向 HDFS sink hdfs-cluster1. 組態檔將包含這些組件的名稱和檔案 channel, 作為 avroWebsource 和 hdfs-cluster1 sink 的共享 channel.

啟動 agent

使用名為 flume-ng 的 shell 腳本啟動 agent 程式, 該腳本位于 Flume 發行版的 bin 目錄中. 您需要在命令列上指定 agent 名稱, config 目錄和組態檔:

$ bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template

現在, agent 將開始運行在給定屬性檔案中配置的 source 和 sink.

一個簡單的例子

在這里, 我們給出一個示例組態檔, 描述單節點 Flume 部署. 此配置允許用戶生成 event , 然后將其記錄到控制臺.

# example.conf: A single-node Flume configuration# Name the components on this agenta1.sources = r1a1.sinks = k1a1.channels = c1# Describe/configure the sourcea1.sources.r1.type = netcata1.sources.r1.bind = localhosta1.sources.r1.port = 44444# Describe the sinka1.sinks.k1.type = logger# Use a channel which buffers events in memorya1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100# Bind the source and sink to the channela1.sources.r1.channels = c1a1.sinks.k1.channel = c1

  

此配置定義名為 a1 的單個 agent .a1 有一個監聽埠 44444 上的資料的 source, 一個緩沖記憶體中 event 資料的 channel, 以及一個將 event 資料記錄到控制臺的 sink. 組態檔命名各種組件, 然后描述其型別和配置引數. 給定的組態檔可能會定義幾個命名的 agent 當一個給定的 Flume 行程啟動時, 會傳遞一個標志, 告訴它要顯示哪個命名 agent.

鑒于此組態檔, 我們可以按如下方式啟動 Flume:

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

請注意, 在完整部署中, 我們通常會包含一個選項: --conf=<conf-dir> . 所述 <conf-dir> 目錄將包括一個 shell 腳本 f lume-env.sh 和潛在的一個 log4j 的屬性檔案. 在這個例子中, 我們傳遞一個 Java 選項來強制 Flume 登錄到控制臺, 我們沒有自定義環境腳本.

從一個單獨的終端, 我們可以 telnet 埠 44444 并向 Flume 發送一個 event :

$ telnet localhost 44444Trying 127.0.0.1...Connected to localhost.localdomain (127.0.0.1).Escape character is '^]'.Hello world! <ENTER>OK

  

原始的 Flume 終端將在日志訊息中輸出 event .

12/06/19 15:32:19 INFO source.NetcatSource: Source starting12/06/19 15:32:19 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444]12/06/19 15:32:34 INFO sink.LoggerSink: Event: {headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D Hello world!.}

  

恭喜 - 您已成功配置并部署了 Flume agent ! 后續部分更詳細地介紹了 agent 配置.

在組態檔中使用環境變數

Flume 能夠替換配置中的環境變數. 例如:

a1.sources = r1a1.sources.r1.type = netcata1.sources.r1.bind = 0.0.0.0a1.sources.r1.port = ${NC_PORT}a1.sources.r1.channels = c1

  

注意: 它目前僅適用于 values , 不適用于 keys . (IE. only on the "right side" of the = mark of the config lines.)

通過設定 propertiesImplementation = org.apache.flume.node.EnvVarResolverProperties, 可以通過 agent 程式呼叫上的 Java 系統屬性啟用此功能.

例如:

$ NC_PORT=44444 bin/flume-ng agent -conf conf -conf-file example.conf -name a1 -Dflume.root.logger=INFO,console -DpropertiesImplementation=org.apache.flume.node.EnvVarResolverProperties

請注意, 上面只是一個示例, 可以通過其他方式配置環境變數, 包括在 conf/flume-env.sh.

記錄原始資料

在許多生產環境中記錄流經攝取 pipeline 的原始資料流不是所希望的行為, 因為這可能導致泄漏敏感資料或安全相關配置 (例如密鑰) 泄漏到 Flume 日志檔案. 默認情況下, Flume 不會記錄此類資訊. 另一方面, 如果資料管道被破壞, Flume 將嘗試提供除錯 DEBUG 的線索.

除錯 event 管道問題的一種方法是設定 連接到 Logger Sink 的附加記憶體 channel, 它將所有 event 資料輸出到 Flume 日志. 但是, 在某些情況下, 這種方法是不夠的.

為了能夠記錄 event 和配置相關的資料, 除了 log4j 屬性外, 還必須設定一些 Java 系統屬性.

要啟用與配置相關的日志記錄, 請設定 Java 系統屬性 - Dorg.apache.flume.log.printconfig=true . 這可以在命令列上傳遞, 也可以在 flume-env.sh 中的 JAVA_OPTS 變數中設定.

要啟用資料記錄, 請 按照上述相同方式設定 Java 系統屬性 -Dorg.apache.flume.log.rawdata=https://www.cnblogs.com/laoqing/p/true . 對于大多陣列件, 還必須將 log4j 日志記錄級別設定為 DEBUG 或 TRACE, 以使特定于 event 的日志記錄顯示在 Flume 日志中.

下面是啟用配置日志記錄和原始資料日志記錄的示例, 同時還將 Log4j 日志級別設定為 DEBUG 以用于控制臺輸出:

$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=DEBUG,console -Dorg.apache.flume.log.printconfig=true -Dorgwdata=https://www.cnblogs.com/laoqing/p/true

基于 Zookeeper 的配置

Flume 通過 Zookeeper 支持 agent 配置. 這是一個實驗性功能. 組態檔需要在可配置前綴下的 Zookeeper 中上傳. 組態檔存盤在 Zookeeper 節點資料中. 以下是 agent 商 a1 和 a2 的 Zookeeper 節點樹的外觀

- /flume|- /a1 [Agent config file]|- /a2 [Agent config file]

 

上載組態檔后, 使用以下選項啟動 agent

$ bin/flume-ng agent -conf conf -z zkhost:2181,zkhost1:2181 -p /flume -name a1 -Dflume.root.logger=INFO,console

Argument NameDefaultDescription
zZookeeper 連接字串,以逗號分隔的主機名串列:port
p/flumeZookeeper 中的基本路徑,用于存盤 agent 配置

Flume 擁有完全基于插件的架構. 雖然 Flume 附帶了許多開箱即用的 source,channels,sink,serializers 等, 但許多實作都與 Flume 分開運行. 安裝第三方插件

雖然通過將自己的 jar 包添加到 flume-env.sh 檔案中的 FLUME_CLASSPATH 變數中, 始終可以包含自定義 Flume 組件, 但 Flume 現在支持一個名為 plugins.d 的特殊目錄, 該目錄會自動獲取以特定格式打包的插件. 這樣可以更輕松地管理插件打包問題, 以及更簡單的除錯和幾類問題的故障排除, 尤其是庫依賴性沖突.

目錄

該 plugins.d 目錄位于 $FLUME_HOME/plugins.d . 在啟動時, flume-ng 啟動腳本在 plugins.d 目錄中查找符合以下格式的插件, 并在啟動 java 時將它們包含在正確的路徑中.

插件的目錄布局

plugins.d 中的每個插件 (子目錄) 最多可以有三個子目錄:

lib - the plugin's jar(s)libext - the plugin's dependency jar(s)native - any required native libraries, such as .so files

 

plugins.d 目錄中的兩個插件示例:

plugins.d/plugins.d/custom-source-1/plugins.d/custom-source-1/lib/my-source.jarplugins.d/custom-source-1/libext/spring-core-2.5.6.jarplugins.d/custom-source-2/plugins.d/custom-source-2/lib/custom.jarplugins.d/custom-source-2/native/gettext.so

 

資料攝取

Flume 支持許多從外部來 source 攝取資料的機制.

RPC

Flume 發行版中包含的 Avro 客戶端可以使用 avro RPC 機制將給定檔案發送到 Flume Avrosource:

$ bin/flume-ng avro-client -H localhost -p 41414 -F /usr/logs/log.10

 

 

上面的命令會將 /usr/logs/log.10 的內容發送到監聽該埠的 Flume source.

執行命令

有一個 exec source 執行給定的命令并消耗輸出. 輸出的單 "行" 即. 文本后跟回車符 ('\ r') 或換行符 ('\ n') 或兩者一起.

網路流

Flume 支持以下機制從常用日志流型別中讀取資料, 例如:

  1. Avro
  2. Thrift
  3. Syslog
  4. Netcat

設定多 agent 流程

?

為了跨多個 agent 或跳資料流, 先前 agent 的 sink 和當前跳的 source 需要是 avro 型別, sink 指向 source 的主機名 (或 IP 地址) 和埠.

合并

日志收集中非常常見的情況是大量日志生成客戶端將資料發送到連接到存盤子系統的少數消費者 agent . 例如, 從數百個 Web 服務器收集的日志發送給寫入 HDFS 集群的十幾個 agent .

?

這可以通過使用 avrosink 配置多個第一層 agent 在 Flume 中實作, 所有這些 agent 都指向單個 agent 的 avrosource(同樣, 您可以在這種情況下使用 thriftsource/sink / 客戶端). 第二層 agent 上的此 source 將接收的 event 合并到單個信道中, 該信道由信宿器消耗到其最終目的地.

多路復用流程

Flume 支持將 event 流多路復用到一個或多個目的地. 這是通過定義可以復制或選擇性地將 event 路由到一個或多個信道的流復用器來實作的.

?

上面的例子顯示了來自 agent "foo" 的 source 代碼將流程擴展到三個不同的 channel. 扇出可以復制或多路復用. 在復制流的情況下, 每個 event 被發送到所有三個 channel. 對于多路復用情況, 當 event 的屬性與預配置的值匹配時, event 將被傳遞到可用 channel 的子集. 例如, 如果一個名為 "txnType" 的 event 屬性設定為 "customer", 那么它應該轉到 channel1 和 channel3, 如果它是 "vendor", 那么它應該轉到 channel2, 否則轉到 channel3. 可以在 agent 的組態檔中設定映射.

配置

如前面部分所述, Flume agent 程式配置是從類似于具有分層屬性設定的 Java 屬性檔案格式的檔案中讀取的.

定義流程

要在單個 agent 中定義流, 您需要通過 channel 鏈接 source 和 sink. 您需要列出給定 agent 的 source,sink 和 channel, 然后將 source 和 sink 指向 channel.source 實體可以指定多個 channel, 但 sink 實體只能指定一個 channel. 格式如下:

# list the sources, sinks and channels for the agent<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>

  

例如, 名為 agent_foo 的 agent 正在從外部 avro 客戶端讀取資料并通過記憶體 channel 將其發送到 HDFS.

組態檔 weblog.config 可能如下所示:

# list the sources, sinks and channels for the agentagent_foo.sources = avro-appserver-src-1agent_foo.sinks = hdfs-sink-1agent_foo.channels = mem-channel-1# set channel for sourceagent_foo.sources.avro-appserver-src-1.channels = mem-channel-1# set channel for sinkagent_foo.sinks.hdfs-sink-1.channel = mem-channel-1

 

這將使 event 從 avro-AppSrv-source 流向 hdfs-Cluster1-sink, 通過記憶體 channelmem-channel-1.

當使用 weblog.config 作為其組態檔啟動 agent 程式時, 它將實體化該流程.

配置單個組件

定義流后, 您需要設定每個 source,sink 和 channel 的屬性. 這是以相同的分層命名空間方式完成的, 您可以在其中設定組件型別以及特定于每個組件的屬性的其他值:

# properties for sources<Agent>.sources.<Source>.<someProperty> = <someValue># properties for channels<Agent>.channel.<Channel>.<someProperty> = <someValue># properties for sinks<Agent>.sources.<Sink>.<someProperty> = <someValue>

 

需要為 Flume 的每個組件設定屬性 "type", 以了解它需要什么型別的物件. 每個 source,sink 和 channel 型別都有自己的一組屬性, 使其能夠按預期運行. 所有這些都需要根據需要進行設定. 在前面的示例中, 我們有一個從 avro-AppSrv-source 到 hdfs-Cluster1-sink 的流程通過記憶體 channelmem-channel-1. 這是一個顯示每個組件配置的示例:

agent_foo.sources = avro-AppSrv-sourceagent_foo.sinks = hdfs-Cluster1-sinkagent_foo.channels = mem-channel-1# set channel for sources, sinks# properties of avro-AppSrv-sourceagent_foo.sources.avro-AppSrv-source.type = avroagent_foo.sources.avro-AppSrv-source.bind = localhostagent_foo.sources.avro-AppSrv-source.port = 10000# properties of mem-channel-1agent_foo.channels.mem-channel-1.type = memoryagent_foo.channels.mem-channel-1.capacity = 1000agent_foo.channels.mem-channel-1.transactionCapacity = 100# properties of hdfs-Cluster1-sinkagent_foo.sinks.hdfs-Cluster1-sink.type = hdfsagent_foo.sinks.hdfs-Cluster1-sink.hdfs.path = hdfs://namenode/flume/webdata#...

 

在 agent 中添加多個流

單個 Flume agent 可以包含多個獨立流. 您可以在配置中列出多個 source,sink 和 channel. 可以鏈接這些組件以形成多個流:

# list the sources, sinks and channels for the agent<Agent>.sources = <Source1> <Source2><Agent>.sinks = <Sink1> <Sink2><Agent>.channels = <Channel1> <Channel2>

 

然后, 您可以將 source 和 sink 鏈接到 channel(用于 sink)的相應 channel(用于 source), 以設定兩個不同的流. 例如, 如果您需要在 agent 中設定兩個流, 一個從外部 avro 客戶端到外部 HDFS, 另一個從尾部輸出到 avrosink, 那么這是一個配置來執行此操作:

# list the sources, sinks and channels in the agentagent_foo.sources = avro-AppSrv-source1 exec-tail-source2agent_foo.sinks = hdfs-Cluster1-sink1 avro-forward-sink2agent_foo.channels = mem-channel-1 file-channel-2# flow #1 configurationagent_foo.sources.avro-AppSrv-source1.channels = mem-channel-1agent_foo.sinks.hdfs-Cluster1-sink1.channel = mem-channel-1# flow #2 configurationagent_foo.sources.exec-tail-source2.channels = file-channel-2agent_foo.sinks.avro-forward-sink2.channel = file-channel-2

 

配置多 agent 流程

要設定多層流, 您需要有 sink 指向下一跳的 avro/thrift source. 這將導致第一個 Flume agent 將 event 轉發到下一個 Flume agent . 例如, 如果您使用 avro 客戶端定期向本地 Flume agent 發送檔案(每個 event 1 個檔案), 則此本地 agent 可以將其轉發到另一個已安裝存盤的 agent

Weblog agent 配置:

# list sources, sinks and channels in the agentagent_foo.sources = avro-AppSrv-sourceagent_foo.sinks = avro-forward-sinkagent_foo.channels = file-channel# define the flowagent_foo.sources.avro-AppSrv-source.channels = file-channelagent_foo.sinks.avro-forward-sink.channel = file-channel# avro sink propertiesagent_foo.sinks.avro-forward-sink.type = avroagent_foo.sinks.avro-forward-sink.hostname = 10.1.1.100agent_foo.sinks.avro-forward-sink.port = 10000# configure other pieces#...

 

HDFS agent 配置:

# list sources, sinks and channels in the agentagent_foo.sources = avro-collection-sourceagent_foo.sinks = hdfs-sinkagent_foo.channels = mem-channel# define the flowagent_foo.sources.avro-collection-source.channels = mem-channelagent_foo.sinks.hdfs-sink.channel = mem-channel# avro source propertiesagent_foo.sources.avro-collection-source.type = avroagent_foo.sources.avro-collection-source.bind = 10.1.1.100agent_foo.sources.avro-collection-source.port = 10000# configure other pieces#...

 

在這里, 我們將 weblog agent 的 avro-forward-sink 鏈接到 hdfs agent 的 avro-collection-source. 這將導致來自外部應用程式服務器 source 的 event 最終存盤在 HDFS 中.

扇出流量

如前一節所述, Flume 支持扇出從一個 source 到多個 channel 的流量. 扇出有兩種模式 : 復制和多路復用. 在復制流程中, event 將發送到所有已配置的 channel. 在多路復用的情況下, event 僅被發送到合格 channels 的子集. 為了散開流量, 需要指定 source 的 channel 串列以及扇出它的策略. 這是通過添加可以復制或多路復用的 channel"選擇器" 來完成的. 如果它是多路復用器, 則進一步指定選擇規則. 如果您沒有指定選擇器, 那么默認情況下它會復制:

# List the sources, sinks and channels for the agent<Agent>.sources = <Source1><Agent>.sinks = <Sink1> <Sink2><Agent>.channels = <Channel1> <Channel2># set list of channels for source (separated by space)<Agent>.sources.<Source1>.channels = <Channel1> <Channel2># set channel for sinks<Agent>.sinks.<Sink1>.channel = <Channel1><Agent>.sinks.<Sink2>.channel = <Channel2><Agent>.sources.<Source1>.selector.type = replicating

 

多路復用選擇具有另一組屬性以分流流. 這需要指定 event 屬性到 channel 集的映射. 選擇器檢查 event 頭中的每個已配置屬性. 如果它與指定的值匹配, 則該 event 將發送到映射到該值的所有 channel. 如果沒有匹配項, 則將 event 發送到配置為默認值的 channel 集:

# Mapping for multiplexing selector<Agent>.sources.<Source1>.selector.type = multiplexing<Agent>.sources.<Source1>.selector.header = <someHeader><Agent>.sources.<Source1>.selector.mapping.<Value1> = <Channel1><Agent>.sources.<Source1>.selector.mapping.<Value2> = <Channel1> <Channel2><Agent>.sources.<Source1>.selector.mapping.<Value3> = <Channel2>#...<Agent>.sources.<Source1>.selector.default = <Channel2>

 

映射允許為每個值重疊 channel.

以下示例具有多路復用到兩個路徑的單個流. 名為 agent_foo 的 agent 具有單個 avrosource 和兩個鏈接到兩個 sink 的 channel:

# list the sources, sinks and channels in the agentagent_foo.sources = avro-AppSrv-source1agent_foo.sinks = hdfs-Cluster1-sink1 avro-forward-sink2agent_foo.channels = mem-channel-1 file-channel-2# set channels for sourceagent_foo.sources.avro-AppSrv-source1.channels = mem-channel-1 file-channel-2# set channel for sinksagent_foo.sinks.hdfs-Cluster1-sink1.channel = mem-channel-1agent_foo.sinks.avro-forward-sink2.channel = file-channel-2# channel selector configurationagent_foo.sources.avro-AppSrv-source1.selector.type = multiplexingagent_foo.sources.avro-AppSrv-source1.selector.header = Stateagent_foo.sources.avro-AppSrv-source1.selector.mapping.CA = mem-channel-1agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2agent_foo.sources.avro-AppSrv-source1.selector.mapping.NY = mem-channel-1 file-channel-2agent_foo.sources.avro-AppSrv-source1.selector.default = mem-channel-1

  

選擇器檢查名為 "State" 的標頭. 如果該值為 "CA", 則將其發送到 mem-channel-1, 如果其為 "AZ", 則將其發送到檔案 channel-2, 或者如果其為 "NY" 則為兩者. 如果 "狀態" 標題未設定或與三者中的任何一個都不匹配, 則它將轉到 mem-channel-1, 其被指定為 "default".

選擇器還支持可選 channel. 要為標頭指定可選 channel, 可通過以下方式使用 config 引數 "optional":

# channel selector configurationagent_foo.sources.avro-AppSrv-source1.selector.type = multiplexingagent_foo.sources.avro-AppSrv-source1.selector.header = Stateagent_foo.sources.avro-AppSrv-source1.selector.mapping.CA = mem-channel-1agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2agent_foo.sources.avro-AppSrv-source1.selector.mapping.NY = mem-channel-1 file-channel-2agent_foo.sources.avro-AppSrv-source1.selector.optional.CA = mem-channel-1 file-channel-2agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2agent_foo.sources.avro-AppSrv-source1.selector.default = mem-channel-1

  

選擇器將首先嘗試寫入所需的 channel, 如果其中一個 channel 無法使用 event , 則會使事務失敗. 在所有渠道上重新嘗試交易. 一旦所有必需的 channel 消耗了 event , 則選擇器將嘗試寫入可選 channel. 任何可選 channel 使用該 event 的失敗都會被忽略而不會重試.

如果可選信道與特定報頭的所需信道之間存在重疊, 則認為該信道是必需的, 并且信道中的故障將導致重試所有必需信道集. 例如, 在上面的示例中, 對于標題 "CA",mem-channel-1 被認為是必需的 channel, 即使它被標記為必需和可選, 并且寫入此 channel 的失敗將導致該 event 在為選擇器配置的所有 channel 上重試.

請注意, 如果標頭沒有任何所需的 channel, 則該 event 將被寫入默認 channel, 并將嘗試寫入該標頭的可選 channel. 如果未指定所需的 channel, 則指定可選 channel 仍會將 event 寫入默認 channel. 如果沒有將 channel 指定為默認 channel 且沒有必需 channel, 則選擇器將嘗試將 event 寫入可選 channel. 在這種情況下, 任何失敗都會被忽略.

支持

多個 Flume 組件支持 SSL / TLS 協議, 以便安全地與其他系統通信.

ComponentSSL server or client
Avro Sourceserver
Avro Sinkclient
Thrift Sourceserver
Thrift Sinkclient
Kafka Sourceclient
Kafka Channelclient
Kafka Sinkclient
HTTP Sourceserver
JMS Sourceclient
Syslog TCP Sourceserver
Multiport Syslog TCP Sourceserver

SSL 兼容組件具有若干配置引數來設定 SSL, 例如啟用 SSL 標志, 密鑰庫 / 信任庫引數 (位置, 密碼, 型別) 和其他 SSL 引數(例如禁用的協議)

始終在 agent 組態檔的組件級別指定為組件啟用 SSL. 因此, 某些組件可能配置為使用 SSL, 而其他組件則不配置(即使具有相同的組件型別)

密鑰庫 / 信任庫設定可以在組件級別或全域指定.

在組件級別設定的情況下, 通過組件特定引數在 agent 組態檔中配置密鑰庫 / 信任庫. 此方法的優點是組件可以使用不同的密鑰庫(如果需要). 缺點是必須為 agent 組態檔中的每個組件復制密鑰庫引數. 組件級別設定是可選的, 但如果已定義, 則其優先級高于全域引數.

使用全域設定, 只需定義一次密鑰庫 / 信任庫引數, 并對所有組件使用相同的設定, 這意味著更少和更集中的配置.

可以通過系統屬性或通過環境變數來配置全域設定.

系統屬性環境變數描述
javax.net.ssl.keyStoreFLUME_SSL_KEYSTORE_PATH密鑰庫位置
javax.net.ssl.keyStorePasswordFLUME_SSL_KEYSTORE_PASSWORD密鑰庫密碼
javax.net.ssl.keyStoreTypeFLUME_SSL_KEYSTORE_TYPE密鑰庫型別(默認為 JKS)
javax.net.ssl.trustStoreFLUME_SSL_TRUSTSTORE_PATH信任庫位置
javax.net.ssl.trustStorePasswordFLUME_SSL_TRUSTSTORE_PASSWORD信任庫密碼
javax.net.ssl.trustStoreTypeFLUME_SSL_TRUSTSTORE_TYPE信任庫型別(默認為 JKS)
flume.ssl.include.protocolsFLUME_SSL_INCLUDE_PROTOCOLS計算啟用的協議時要包括的協議,逗號(,)分隔串列,如果提供,排除的協議將從此串列中排除,
flume.ssl.exclude.protocolsFLUME_SSL_EXCLUDE_PROTOCOLS計算啟用的協議時要排除的協議,逗號(,)分隔串列,
flume.ssl.include.cipherSuitesFLUME_SSL_INCLUDE_CIPHERSUITES在計算啟用的密碼套件時包含的密碼套件,逗號(,)分隔串列,如果提供,排除的密碼套件將被排除在此串列之外,
flume.ssl.exclude.cipherSuitesFLUME_SSL_EXCLUDE_CIPHERSUITES在計算啟用的密碼套件時要排除的密碼套件,逗號(,)分隔串列,

可以在命令列上傳遞 SSL 系統屬性, 也可以在 conf / flume-env.sh 中設定 JAVA_OPTS 環境變數(盡管使用命令列是不可取的, 因為包含密碼的命令將保存到命令歷史記錄中.)

export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStore=/path/to/keystore.jks"export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStorePassword=password"

 

Flume 使用 JSSE(Java 安全套接字擴展)中定義的系統屬性, 因此這是設定 SSL 的標準方法. 另一方面, 在系統屬性中指定密碼意味著可以在行程串列中看到密碼. 對于不可接受的情況, 也可以在環境變數中定義引數. 在這種情況下, Flume 在內部從相應的環境變數初始化 JSSE 系統屬性.

SSL 環境變數可以在啟動 Flume 之前在 shell 環境中設定, 也可以在 conf / flume-env.sh 中設定(盡管使用命令列是不可取的, 因為包含密碼的命令將保存到命令歷史記錄中.)

export FLUME_SSL_KEYSTORE_PATH=/path/to/keystore.jksexport FLUME_SSL_KEYSTORE_PASSWORD=password

 

** 請注意:**

必須在組件級別啟用 SSL. 僅指定全域 SSL 引數不會產生任何影響.

如果在多個級別指定全域 SSL 引數, 則優先級如下(從高到低):

agent 配置中的組件引數

系統屬性

環境變數

如果為組件啟用了 SSL, 但未以上述任何方式指定 SSL 引數, 則

在密鑰庫的情況下: 配置錯誤

在 truststores 的情況下: 將使用默認信任庫(Oracle JDK 中的 jssecacerts / cacerts)

在所有情況下, 可信任密碼都是可選的. 如果未指定, 則在 JDK 打開信任庫時, 不會對信任庫執行完整性檢查.

source 和接收批量大小和 channel 事務容量

source 和 sink 可以具有批量大小引數, 該引數確定它們在一個批次中處理的最大 event 數. 這發生在具有稱為事務容量的上限的 channel 事務中. 批量大小必須小于渠道的交易容量. 有一個明確的檢查, 以防止不兼容的設定. 只要讀取配置, 就會進行此檢查.

  1. Flume Source
  2. Avro Source

監聽 Avro 埠并從外部 Avro 客戶端流接收 event . 當與另一個(上一跳)Flume agent 上的內置 Avro Sink 配對時, 它可以創建分層集合拓撲. 必需屬性以粗體顯示

屬性名稱默認描述
channels- 
type-組件型別名稱,需要是 avro
bind-要偵聽的主機名或 IP 地址
port-要系結的埠號
threads-生成的最大作業執行緒數
selector.type  
selector.*  
interceptors-以空格分隔的攔截器串列
interceptors.*  
compression-typenone這可以是 “none” 或“deflate”,壓縮型別必須與匹配 AvroSource 的壓縮型別匹配
SSLfalse將其設定為 true 以啟用 SSL 加密,如果啟用了 SSL,則還必須通過組件級引數(請參閱下文)或全域 SSL 引數(請參閱 SSL / TLS 支持部分)指定 “密鑰庫” 和“密鑰庫密碼” ,
keysore-這是 Java 密鑰庫檔案的路徑,如果未在此處指定,則將使用全域密鑰庫(如果已定義,則配置錯誤),
keystore-password  -Java 密鑰庫的密碼,如果未在此處指定,則將使用全域密鑰庫密碼(如果已定義,則配置錯誤),
keystore-typeJKSJava 密鑰庫的型別,這可以是 “JKS” 或“PKCS12”,如果未在此處指定,則將使用全域密鑰庫型別(如果已定義,則默認為 JKS),
exclude-protocols  SSLv3要排除的以空格分隔的 SSL / TLS 協議串列,除指定的協議外,將始終排除 SSLv3,
include-protocols-要包含的以空格分隔的 SSL / TLS 協議串列,啟用的協議將是包含的協議,沒有排除的協議,如果包含協議為空,則它包括每個支持的協議,
exclude-cipher-suites-要排除的以空格分隔的密碼套件串列,
include-cipher-suites-以空格分隔的密碼套件串列,啟用的密碼套件將是包含的密碼套件,不包括排除的密碼套件,如果 included-cipher-suites 為空,則包含每個支持的密碼套件,
ipFilterfalse 將此設定為 true 以啟用 ipFiltering for netty
ipFilterRules-使用此配置定義 N netty ipFilter 模式規則,

agent 名為 a1 的示例:

a1.sources = r1a1.channels = c1a1.sources.r1.type = avroa1.sources.r1.channels = c1a1.sources.r1.bind = 0.0.0.0a1.sources.r1.port = 4141

  

ipFilterRules 的示例

ipFilterRules 定義由逗號分隔的 N 個 netty ipFilters 模式規則必須采用此格式.

<'allow' or deny>:<'ip' or 'name' for computer name>:<pattern> or allow/deny:ip/name:patternexample: ipFilterRules=allow:ip:127.*,allow:name:localhost,deny:ip:*

  

請注意, 匹配的第一個規則將適用, 如下例所示, 來自 localhost 上的客戶端

這將允許 localhost 上的客戶端拒絕來自任何其他 ip 的客戶端 "allow:name:localhost,deny:ip: 這將拒絕 localhost 上的客戶端允許來自任何其他 ip 的客戶端"deny:name:localhost,allow:ip:

Thrift Source

偵聽 Thrift 埠并從外部 Thrift 客戶端流接收 event . 當與另一個(上一跳)Flume agent 上的內置 ThriftSink 配對時, 它可以創建分層集合拓撲. 可以通過啟用 kerberos 身份驗證將 Thriftsource 配置為以安全模式啟動. agent-principal 和 agent-keytab 是 Thriftsource 用于向 kerberos KDC 進行身份驗證的屬性. 必需屬性以粗體顯示

屬性名稱默認描述
channels- 
type-組件型別名稱,需要節儉
bind-要偵聽的主機名或 IP 地址
port-要系結的埠號
threads-生成的最大作業執行緒數
selector.type  
selector.*  
interceptors-空格分隔的攔截器串列
interceptors.*  
SSLfalse 將其設定為 true 以啟用 SSL 加密,如果啟用了 SSL,則還必須通過組件級引數(請參閱下文)或全域 SSL 引數(請參閱 SSL / TLS 支持部分)指定 “密鑰庫” 和“密鑰庫密碼”,
keystore-這是 Java 密鑰庫檔案的路徑,如果未在此處指定,則將使用全域密鑰庫(如果已定義,則配置錯誤),
keystore-password-Java 密鑰庫的密碼,如果未在此處指定,則將使用全域密鑰庫密碼(如果已定義,則配置錯誤),
keystore-typeJKSJava 密鑰庫的型別,這可以是 “JKS” 或“PKCS12”,如果未在此處指定,則將使用全域密鑰庫型別(如果已定義,則默認為 JKS),
exclude-protocols 要排除的以空格分隔的 SSL / TLS 協議串列,除指定的協議外,將始終排除 SSLv3,
include-protocols-要包含的以空格分隔的 SSL / TLS 協議串列,啟用的協議將是包含的協議,沒有排除的協議,如果包含協議為空,則它包括每個支持的協議,
exclude-cipher-suites-要排除的以空格分隔的密碼套件串列,
include-cipher-suites-以空格分隔的密碼套件串列,啟用的密碼套件將是包含的密碼套件,不包括排除的密碼套件,
kerberos 設定為 true 以啟用 kerberos 身份驗證,在 kerberos 模式下,成功進行身份驗證需要 agent-principal 和 agent-keytab,安全模式下的 Thriftsource 僅接受來自已啟用 kerberos 且已成功通過 kerberos KDC 驗證的 Thrift 客戶端的連接,
agent-principal-Thrift Source 使用的 kerberos 主體對 kerberos KDC 進行身份驗證,
 agent-keytab-Thrift Source 與 agent 主體結合使用的 keytab 位置,用于對 kerberos KDC 進行身份驗證,

agent 名為 a1 的示例:

a1.sources = r1a1.channels = c1a1.sources.r1.type = thrifta1.sources.r1.channels = c1a1.sources.r1.bind = 0.0.0.0a1.sources.r1.port = 4141Exec Source

  

Exec source 在啟動時運行給定的 Unix 命令, 并期望該行程在標準輸出上連續生成資料 (stderr 被簡單地丟棄, 除非屬性 logStdErr 設定為 true). 如果行程因任何原因退出, 則 source 也會退出并且不會生成其他資料. 這意味著 cat [named pipe] 或 tail -F [file] 等配置將產生所需的結果, 而日期 可能不會 - 前兩個命令產生資料流, 而后者產生單個 event 并退出. 必需屬性以粗體顯示

屬性名稱默認描述
channels- 
type-組件型別名稱,需要是 exec
command-要執行的命令
shell-用于運行命令的 shell 呼叫,例如 /bin/sh -c ,僅適用于依賴 shell 功能的命令,如通配符,后退標記,管道等,
restartThrottle10000嘗試重新啟動之前等待的時間(以毫秒為單位)
restartfalse是否應該重新執行已執行的 cmd
logStdErrfalse 是否應記錄命令的 stderr
BATCHSIZE20一次讀取和發送到 channel 的最大行數
batchTimeout3000在向下游推送資料之前,如果未達到緩沖區大小,則等待的時間(以毫秒為單位)
selector.typereplication復制或多路復用
selector.* 取決于 selector.type 值
interceptors-以空格分隔的攔截器串列
interceptors.*  

警告

Exec Source 和其他異步 source 的問題在于, 如果無法將 event 放入 Channel 中, 則 source 無法保證客戶端知道它. 在這種情況下, 資料將丟失. 例如, 最常請求的功能之一是 tail -F [file] 類似用例, 其中應用程式寫入磁盤上的日志檔案, Flume 將檔案作為尾部發送, 將每一行作為 event 發送. 雖然這是可能的, 但是有一個明顯的問題; 如果 channel 填滿并且 Flume 無法發送 event , 會發生什么?由于某種原因, Flume 無法向撰寫日志檔案的應用程式指示它需要保留日志或 event 尚未發送. 如果這沒有意義, 您只需要知道: 當使用 Exec Source 等單向異步介面時, 您的應用程式永遠無法保證已收到資料!

作為此警告的延伸 - 并且完全清楚 - 使用此 source 時, event 傳遞絕對沒有保證.

為了獲得更強的可靠性保證, 請考慮 Spooling Directory Source,Taildir Source 或通過 SDK 直接與 Flume 集成.

agent 名為 a1 的示例:

a1.sources = r1a1.channels = c1a1.sources.r1.type = execa1.sources.r1.command = tail -F /var/log/securea1.sources.r1.channels = c1

  

'shell'配置用于通過命令 shell(例如 Bash 或 Powershell)呼叫'命令'.'command'作為引數傳遞給'shell'執行. 這允許'命令'使用 shell 中的功能, 例如通配符, 后退標記, 管道, 回圈, 條件等. 如果沒有'shell'配置, 將直接呼叫'command'.'shell'的常用值: '/bin/sh -c', '/bin/ksh -c', 'cmd /c', 'powershell -Command', etc.

a1.sources.tailsource-1.type = execa1.sources.tailsource-1.shell = /bin/bash -ca1.sources.tailsource-1.command = for i in /path/*.txt; do cat $i; doneJMS Source

  

JMS Source 從 JMS 目標 (例如佇列或主題) 讀取訊息. 作為 JMS 應用程式, 它應該與任何 JMS 提供程式一起使用, 但僅使用 ActiveMQ 進行測驗. JMSsource 提供可配置的批量大小, 訊息選擇器, 用戶 / 傳遞和訊息到水槽 event 轉換器. 請注意, 供應商提供的 JMS jar 應該包含在 Flume 類路徑中, 使用 plugins.d 目錄(首選), 命令列上的 - classpath 或 flume-env.sh 中的 FLUME_CLASSPATH 變數. 必需屬性以粗體顯示

屬性名稱默認描述
channels- 
type-組件型別名稱,需要是 jms
initialContextFactory-Inital Context Factory,例如:org.apache.activemq.jndi.ActiveMQInitialContextFactory
connectionFactory-連接工廠應顯示為的 JNDI 名稱
providerURL-JMS 提供程式 URL
destinationName-目的地名稱
destinationType-目的地型別(佇列或主題)
messageSelector-創建使用者時使用的訊息選擇器
userName-目標 / 提供商的用戶名
PASSWORDFILE-包含目標 / 提供程式密碼的檔案
BATCHSIZE100一批中要使用的訊息數
converter.typeDEFAULT用于將訊息轉換為水槽 event 的類,見下文,
converter.*-轉換器屬性,
converter.charsetUTF-8僅限默認轉換器,在將 JMS TextMessages 轉換為位元組陣列時使用的字符集,
createDurableSubscriptionfalse是否創建持久訂閱,持久訂閱只能與 destinationType 主題一起使用,如果為 true,則必須指定 “clientId” 和“durableSubscriptionName”,
clientId-JMS 客戶端識別符號在創建后立即在 Connection 上設定,持久訂閱必需,
durableSubscriptionName-用于標識持久訂閱的名稱,持久訂閱必需,

訊息轉換器

JMSsource 允許可插拔轉換器, 盡管默認轉換器可能適用于大多數用途. 默認轉換器能夠將位元組, 文本和物件訊息轉換為 FlumeEvents. 在所有情況下, 訊息中的屬性都將作為標題添加到 FlumeEvent 中.

BytesMessage:

訊息的位元組被復制到 FlumeEvent 的主體. 每封郵件無法轉換超過 2GB 的資料.

TextMessage 的:

訊息文本轉換為位元組陣列并復制到 FlumeEvent 的主體. 默認轉換器默認使用 UTF-8, 但這是可配置的.

ObjectMessage:

Object 被寫入包含在 ObjectOutputStream 中的 ByteArrayOutputStream, 并將生成的陣列復制到 FlumeEvent 的主體.

agent 名為 a1 的示例:

a1.sources = r1a1.channels = c1a1.sources.r1.type = jmsa1.sources.r1.channels = c1a1.sources.r1.initialContextFactory = org.apache.activemq.jndi.ActiveMQInitialContextFactorya1.sources.r1.connectionFactory = GenericConnectionFactorya1.sources.r1.providerURL = tcp://mqserver:61616a1.sources.r1.destinationName = BUSINESS_DATAa1.sources.r1.destinationType = QUEUE

  

SSL 和 JMS Source

JMS 客戶端實作通常支持通過 JSSE(Java 安全套接字擴展)定義的某些 Java 系統屬性來配置 SSL / TLS. 為 Flume 的 JVM 指定這些系統屬性, JMSsource(或更準確地說是 JMSsource 使用的 JMS 客戶端實作)可以通過 SSL 連接到 JMS 服務器(當然, 僅當 JMS 服務器也已設定為使用 SSL 時). 它應該可以與任何 JMS 提供程式一起使用, 并且已經過 ActiveMQ,IBM MQ 和 Oracle WebLogic 的測驗.

以下部分僅介紹 Flume 方面所需的 SSL 配置步驟. 您可以在 Flume Wiki 上找到有關不同 JMS 提供程式的服務器端設定以及完整作業配置示例的更詳細說明.

** SSL 傳輸 / 服務器身份驗證:**

如果 JMS 服務器使用自簽名證書或其證書由不受信任的 CA(例如公司自己的 CA)簽名, 則需要設定信任庫 (包含正確的證書) 并傳遞給 Flume. 它可以通過全域 SSL 引數完成. 有關全域 SSL 設定的更多詳細資訊, 請參閱 SSL / TLS 支持部分.

使用 SSL 時, 某些 JMS 提供程式需要 SSL 特定的 JNDI 初始背景關系工廠和 / 或提供程式 URL 設定(例如, ActiveMQ 使用 ssl:// URL 前綴而不是 tcp://). 在這種情況下, 必須在 agent 組態檔中調整 source 屬性(initialContextFactory 和 / 或 providerURL)

客戶端證書身份驗證(雙向 SSL):

JMS Source 可以通過客戶端證書身份驗證而不是通常的用戶 / 密碼登錄來對 JMS 服務器進行身份驗證(使用 SSL 并且 JMS 服務器配置為接受此類身份驗證時).

包含用于身份驗證的 Flume 密鑰的密鑰庫需要再次通過全域 SSL 引數進行配置. 有關全域 SSL 設定的更多詳細資訊, 請參閱 SSL / TLS 支持部分.

密鑰庫應該只包含一個密鑰(如果存在多個密鑰, 則將使用第一個密鑰). 密鑰密碼必須與密鑰庫密碼相同.

在客戶端證書身份驗證的情況下, 不需要在 Flume agent 組態檔中為 JMSsource 指定 userName / passwordFile 屬性.

請注意:

與其他組件不同, JMS Source 沒有組件級別的配置引數. 也沒有啟用 SSL 標志. SSL 設定由 JNDI / Provider URL 設定 (最終是 JMS 服務器設定) 以及 truststore / keystore 的存在 / 不存在控制.

Spooling Directory Source

此 source 允許您通過將要攝取的檔案放入磁盤上的 "spooling" 目錄來攝取資料. 此 source 將查看新檔案的指定目錄, 并將在新檔案出現時決議 event .event 決議邏輯是可插入的. 在給定檔案完全讀入 channel 后, 默認情況下通過重命名檔案來指示完成, 或者可以洗掉它或使用 trackerDir 來跟蹤已處理的檔案.

與 Exec source 不同, 即使 Flume 重新啟動或被殺死, 此 source 也是可靠的并且不會遺漏資料. 作為這種可靠性的交換, 只有不可變的, 唯一命名的檔案必須被放入 spooling directory. 中. Flume 試圖檢測這些問題, 如果違反則會宣告失敗:

如果在放入 spooling directory 后寫入檔案, Flume 會將錯誤列印到其日志檔案并停止處理.

如果稍后重復使用檔案名, Flume 將在其日志檔案中輸出錯誤并停止處理.

為避免上述問題, 在將檔案名移動到 spooling directory 中時, 添加唯一識別符號 (例如時間戳) 可能很有用.

盡管該 source 的可靠性保證, 但仍存在如果發生某些下游故障則可能重復 event 的情況. 這與其他 Flume 組件提供的保證一致.

屬性名稱默認描述
channels- 
type-組件型別名稱需要是 spooldir,
spoolDir-從中讀取檔案的目錄,
fileSuffix.COMPLETED后綴附加到完全攝取的檔案
deletePolicynever何時洗掉已完成的檔案:從 never 或 immediate
FileHeaderfalse是否添加存盤絕對路徑檔案名的標頭,
fileHeaderKeyfile將絕對路徑檔案名附加到 event 標題時使用的標題鍵,
basenameHeaderfalse是否添加存盤檔案基本名稱的標頭,
basenameHeaderKeybasename標題將檔案的基本名稱附加到 event 標題時使用的標題,
includePattern.*$正則運算式,指定要包含的檔案,它可以與 ignorePattern 一起使用,如果一個檔案同時匹配 ignorePattern 和 includePattern 正則運算式,該檔案將被忽略,
ignorePattern$正則運算式,指定要忽略的檔案(跳過),它可以與 includePattern 一起使用,如果一個檔案同時匹配 ignorePattern 和 includePattern 正則運算式,該檔案將被忽略,
trackerDir.flumespool用于存盤與檔案處理相關的元資料的目錄,如果此路徑不是絕對路徑,則將其解釋為相對于 spoolDir,
trackingPolicyrename跟蹤策略定義如何跟蹤檔案處理,它可以是 “重 rename” 或“tracker_dir”,此引數僅在 deletePolicy 為 “never” 時有效,“重 rename” - 處理完檔案后,會根據 fileSuffix 引數重命名,“tracker_dir” - 不重命名檔案,但會在 trackerDir 中創建新的空檔案,新的跟蹤器檔案名 source 自攝取的檔案名和 fileSuffix,
consumeOrderoldestspooling directory  中的檔案將以 oldest, youngest 和 random 的方式使用,如果是 oldest 和 youngest 的,檔案的最后修改時間將用于比較檔案,如果出現相同,將首先消耗具有最小字典順序的檔案,在 random 的情況下,任何檔案將被隨機挑選,當使用 oldest 和 youngest 時,整個目錄將被掃描以選擇 oldest/youngest 的檔案,如果存在大量檔案,這可能會很慢,而使用 random 可能會導致舊檔案在新檔案不斷進入時很晚被消耗 & nbsp;spooling directory,
pollDelay500輪詢新檔案時使用的延遲(以毫秒為單位),
recursiveDirectorySearchfalse是否監視子目錄以查找要讀取的新檔案,
maxBackoff4000如果 channel 已滿,則在連續嘗試寫入 channel 之間等待的最長時間(以毫秒為單位),source 將以低退避開始,并在每次 channel 拋出 ChannelException 時以指數方式增加,直到此引數指定的值,
BATCHSIZE100批量傳輸到 channel 的粒度
inputCharsetUTF-8反序列化器使用的字符集,將輸入檔案視為文本,
decodeErrorPolicyFAIL當我們在輸入檔案中看到不可解碼的字符時該怎么辦,FAIL:拋出例外并且無法決議檔案, REPLACE:用“替換字符”char 替換不可決議的字符,通常是 Unicode U+FFFD , IGNORE:洗掉不可決議的字符序列,
deserializerLINE指定用于將檔案決議為 event 的反序列??化程式,默認將每行決議為 event ,指定的類必須實作 EventDeserializer.Builder,
deserializer.* 每個 event 反序列化器不同,
bufferMaxLines-(Obselete)此選項現在被忽略,
bufferMaxLineLength5000(已棄用)提交緩沖區中行的最大長度,請改用 deserializer.maxLineLength,
selector.typereplicating  replicating  or   multiplexing
selector.* 取決于 selector.type 值
interceptors-以空格分隔的攔截器串列
interceptors.*  

名為 agent-1 的 agent 示例:

a1.channels = ch-1a1.sources = src-1a1.sources.src-1.type = spooldira1.sources.src-1.channels = ch-1a1.sources.src-1.spoolDir = /var/log/apache/flumeSpoola1.sources.src-1.fileHeader = trueEvent Deserializers

  

以下 event 反序列化器隨 Flume 一起提供.

LINE

此解串器為每行文本輸入生成一個 event

物業名稱默認描述
deserializer.maxLineLength2048單個 event 中包含的最大字符數,如果一行超過此長度,則會被截斷,并且該行上的其余字符將出現在后續 event 中,
deserializer.outputCharsetUTF-8用于編碼放入 channel 的 event 的字符集,

AVRO

此解串器能夠讀取 Avro 容器檔案, 并在檔案中為每個 Avro 記錄生成一個 event . 每個 event 都使用標頭進行注釋, 該標頭指示所使用的模式. event 的主體是二進制 Avro 記錄資料, 不包括模式或容器檔案元素的其余部分.

請注意, 如果假脫機目錄 source 必須重試將其中一個 event 放入 channel(例如, 因為 channel 已滿), 則它將重置并從最新的 Avro 容器檔案同步點重試. 為了減少此類故障情況下的潛在 event 重復, 請在 Avro 輸入檔案中更頻繁地寫入同步標記.

物業名稱默認描述
deserializer.schemaTypeHASH如何表示模式,默認情況下,或者 & nbsp; 指定值 HASH 時,會對 Avro 架構進行哈希處理,并將哈希值存盤在 event 頭 “flume.avro.schema.hash” 中的每個 event 中,如果指定了 LITERAL,則 JSON 編碼的模式本身存盤在 event 頭 “flume.avro.schema.literal” 中的每個 event 中,與 HASH 模式相比,使用 LITERAL 模式效率相對較低,

BlobDeserializer>

此反序列化器為每個 event 讀取二進制大物件(BLOB), 通常每個檔案一個 BLOB. 例如 PDF 或 JPG 檔案. 請注意, 此方法不適用于非常大的物件, 因為整個 BLOB 都快取在 RAM 中.

物業名稱默認描述
解串器-此類的 FQCN:org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder
deserializer.maxBlobLength100000000 要讀取的最大位元組數和給定請求的緩沖區

Taildir Source

注意: 此 source 作為預覽功能提供. 它不適用于 Windows.

觀察指定的檔案, 并在檢測到添加到每個檔案的新行后幾乎實時地拖尾它們. 如果正在寫入新行, 則此 source 將重試讀取它們以等待寫入完成.

此 source 是可靠的, 即使 tail 檔案旋轉也不會丟失資料. 它定期以 JSON 格式寫入給定位置檔案上每個檔案的最后讀取位置. 如果 Flume 由于某種原因停止或停止, 它可以從寫在現有位置檔案上的位置重新開始 tail.

在其他用例中, 此 source 也可以使用給定的位置檔案從每個檔案的任意位置開始拖尾. 當指定路徑上沒有位置檔案時, 默認情況下它將從每個檔案的第一行開始拖尾.

檔案將按修改時間順序使用. 將首先使用具有最早修改時間的檔案.

此 source 不會重命名或洗掉或對正在掛載的檔案執行任何修改. 目前此 source 不支持 tail 二進制檔案. 它逐行讀取文本檔案.

屬性名稱默認描述
channels- 
type-組件型別名稱,需要是 TAILDIR,
filegroups-以空格分隔的檔案組串列,每個檔案組都指示一組要掛起的檔案,
filegroups.-檔案組的絕對路徑,正則運算式(而不是檔案系統模式)只能用于檔案名,
positionFile~/.flume/taildir_position.json以 JSON 格式檔案以記錄每個尾部檔案的 inode,絕對路徑和最后位置,
headers.-標題值,使用標題鍵設定,可以為一個檔案組指定多個標頭,
byteOffsetHeaderfalse是否將 tailed line 的位元組偏移量添加到名為 “byteoffset” 的標頭中,
skipToEndfalse在未寫入位置檔案的檔案的情況下是否跳過位置到 EOF,
idleTimeout120000關閉非活動檔案的時間(毫秒),如果關閉的檔案附加了新行,則此 source 將自動重新打開它,
writePosInterval3000寫入位置檔案上每個檔案的最后位置的間隔時間(ms),
BATCHSIZE100一次讀取和發送到 channel 的最大行數,使用默認值通常很好,
maxBatchCountLong.MAX_VALUE控制從同一檔案連續讀取的批次數,如果 source 正在拖尾多個檔案,并且其中一個檔案以快速寫入,則可以防止處理其他檔案,因為繁忙檔案將在無限回圈中讀取,在這種情況下,降低此值,
backoffSleepIncrement1000在最后一次嘗試未找到任何新資料時,重新嘗試輪詢新資料之前的時間延遲增量,
maxBackoffSleep5000每次重新嘗試輪詢新資料時的最大時間延遲,當最后一次嘗試未找到任何新資料時,
cachePatternMatchingtrue對于包含數千個檔案的目錄,列出目錄并應用檔案名正則運算式模式可能非常耗時,快取匹配檔案串列可以提高性能,消耗檔案的順序也將被快取,要求檔案系統以至少 1 秒的粒度跟蹤修改時間,
FileHeaderfalse是否添加存盤絕對路徑檔案名的標頭,
fileHeaderKeyfile將絕對路徑檔案名附加到 event 標題時使用的標題鍵,

agent 名為 a1 的示例:

a1.sources = r1a1.channels = c1a1.sources.r1.type = TAILDIRa1.sources.r1.channels = c1a1.sources.r1.positionFile = /var/log/flume/taildir_position.JSONa1.sources.r1.filegroups = f1 f2a1.sources.r1.filegroups.f1 = /var/log/test1/example.loga1.sources.r1.headers.f1.headerKey1 = value1a1.sources.r1.filegroups.f2 = /var/log/test2/.*log.*a1.sources.r1.headers.f2.headerKey1 = value2a1.sources.r1.headers.f2.headerKey2 = value2-2a1.sources.r1.fileHeader = truea1.sources.ri.maxBatchCount = 1000Kafka Source

  

Kafka Source 是一個 Apache Kafka 消費者, 它從 Kafka 主題中讀取訊息. 如果您運行了多個 Kafka source, 則可以使用相同的使用者組配置它們, 以便每個 source 都讀取一組唯一的主題磁區. 這目前支持 Kafka 服務器版本 0.10.1.0 或更高版本. 測驗完成了 2.0.1, 這是發布時最高的可用版本.

屬性名稱默認描述
channels- 
type-組件型別名稱,需要是 org.apache.flume.source.kafka.KafkaSource
kafka.bootstrap.servers-source 代碼使用的 Kafka 集群中的 agent 串列
kafka.consumer.group.idflume獨特的消費者群體,在多個 source 或 agent 中設定相同的 ID 表示它們是同一個使用者組的一部分
kafka.topics-以逗號分隔的主題串列,kafka 消費者將從中讀取訊息,
kafka.topics.regex-正則運算式,用于定義 source 訂閱的主題集,此屬性具有比 kafka.topics 更高的優先級,并覆寫 kafka.topics(如果存在),
BATCHSIZE1000一批中寫入 Channel 的最大訊息數
batchDurationMillis1000將批次寫入 channel 之前的最長時間(以毫秒為單位)只要達到第一個大小和時間,就會寫入批次,
backoffSleepIncrement1000Kafka Topic  顯示為空時觸發的初始和增量等待時間,等待時間將減少對空 kafka Topic  的激進 ping 操作,一秒鐘是攝取用例的理想選擇,但使用攔截器的低延遲操作可能需要較低的值,
maxBackoffSleep5000Kafka Topic  顯示為空時觸發的最長等待時間,5 秒是攝取用例的理想選擇,但使用攔截器的低延遲操作可能需要較低的值,
useFlumeEventFormatfalse默認情況下,event 將從 Kafka Topic 直接作為位元組直接進入 event 主體,設定為 true 以讀取 event 作為 Flume Avro 二進制格式,與 Kafka Sink 上的相同屬性或 Kafka Channel 上的 parseAsFlumeEvent 屬性一起使用時,這將保留在生成端發送的任何 Flume 標頭,
setTopicHeadertrue設定為 true 時,將檢索到的訊息的主題存盤到由 topic Header 屬性定義的標頭中 & nbsp;,
topicHeadertopic如果 setTopicHeader 屬性設定為 true,則定義用于存盤接收訊息主題名稱的標頭名稱,如果與 Kafka SinktopicHeader 屬性結合使用,應該小心,以避免將訊息發送回回圈中的同一主題,
kafka.consumer.security.protocolPLAINTEXT如果使用某種級別的安全性寫入 Kafka,則設定為 SASL_PLAINTEXT,SASL_SSL 或 SSL,有關安全設定的其他資訊,請參見下文,
more consumer security props 如果使用 SASL_PLAINTEXT,SASL_SSL 或 SSL,請參閱 Kafka 安全性以獲取需要在使用者上設定的其他屬性,
Other Kafka Consumer Properties-這些屬性用于配置 Kafka Consumer,可以使用 Kafka 支持的任何消費者財產,唯一的要求是使用前綴 kafka.consumer 添加屬性名稱 & nbsp;,例如:kafka.consumer.auto.offset.reset

** 注意 **

Kafka Source 會覆寫兩個 Kafka 使用者引數: source 和每次 batch 提交的時候會將 auto.commit.enable 設定為 "false", 并提交每個批處理. Kafka Source 至少保證一次訊息檢索策略.

source 啟動時可以存在重復項.

Kafka Source 還提供了 key.deserializer(org.apache.kafka.common.serialization.StringSerializer)和 value.deserializer(org.apache.kafka.common.serialization.ByteArraySerializer)的默認值.

不建議修改這些引數.

不推薦使用的屬性

屬性名稱默認描述
topic-使用 kafka.topics
groupIdflume使用 kafka.consumer.group.id
zookeeperConnect-自 0.9.x 起不再受 kafka 消費者客戶端的支持,使用 kafka.bootstrap.servers 與 kafka 集群建立連接
migrateZookeeperOffsetstrue如果找不到 Kafka 存盤的偏移量,請在 Zookeeper 中查找偏移量并將它們提交給 Kafka,這應該是支持從舊版本的 Flume 無縫 Kafka 客戶端遷移,遷移后,可以將其設定為 false,但通常不需要這樣做,如果未找到 Zookeeper 偏移量,則 Kafka 配置 kafka.consumer.auto.offset.reset 定義如何處理偏移量,  有關詳細資訊,請查看 Kafka 檔案

通過逗號分隔的主題串列進行主題訂閱的示例:

tier1.sources.source1.type = org.apache.flume.source.kafka.KafkaSourcetier1.sources.source1.channels = channel1tier1.sources.source1.batchSize = 5000tier1.sources.source1.batchDurationMillis = 2000tier1.sources.source1.kafka.Bootstrap.servers = localhost:9092tier1.sources.source1.kafka.topics = test1, test2tier1.sources.source1.kafka.consumer.group.id = custom.g.id

  

正則運算式主題訂閱的示例:

ier1.source.source1.type = org.apache.flume.source.kafka.KafkaSourcetier1.source.source1.channel = channel1

  

tier1.source.source1.kafka.Bootstrap.servers = 本地主機: 9092

tier1.source.source1.kafka .topics.regex = ^ topic [0-9] $

#默認使用 kafka.consumer.group.id = flume

** Security 和 Kafka Source:**

Flume 和 Kafka 之間的通信渠道支持安全認證和資料加密. 對于安全身份驗證, 可以使用 Kafka 0.9.0 版中的 SASL / GSSAPI(Kerberos V5)或 SSL(即使該引數名為 SSL, 實際協議是 TLS 實作)

截至目前, 資料加密僅由 SSL / TLS 提供.

將 kafka.consumer.security.protocol 設定為以下任何值意味著:

SASL_PLAINTEXT - 無資料加密的 Kerberos 或純文本身份驗證

SASL_SSL - 使用資料加密的 Kerberos 或純文本身份驗證

SSL - 基于 TLS 的加密, 帶有可選的身份驗證

** 警告 **

啟用 SSL 時性能會下降, 其大小取決于 CPU 型別和 JVM 實作. 參考: Kafka 安全概述 和跟蹤此問題的 jira: https://issues/jira/browse/KAFKA-2561

** TLS 和 Kafka Source:**

請閱讀配置 Kafka 客戶端 SSL 中描述的步驟, 以了解用于微調的其他配置設定, 例如以下任何一項: 安全提供程式, 密碼套件, 啟用的協議, 信任庫或密鑰庫型別.

配置服務器端身份驗證和資料加密的示例:

a1.sources.source1.type = org.apache.flume.source.kafka.KafkaSourcea1.sources.source1.kafka.Bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093a1.sources.source1.kafka.topics = mytopica1.sources.source1.kafka.consumer.group.id = flume-consumera1.sources.source1.kafka.consumer.security.protocol = SSL# optional, the global truststore can be used alternativelya1.sources.source1.kafka.consumer.ssl.truststore.location=/path/to/truststore.jksa1.sources.source1.kafka.consumer.ssl.truststore.password=<password to access the truststore>

  

在此處指定信任庫是可選的, 可以使用全域信任庫. 有關全域 SSL 設定的更多詳細資訊, 請參閱 SSL / TLS 支持部分

注意: 默認情況下, 未定義屬性 ssl.endpoint.identification.algorithm, 因此不會執行主機名驗證. 要啟用主機名驗證, 請設定以下屬性

a1.sources.source1.kafka.consumer.ssl.endpoint.identification.algorithm=HTTPS

啟用后, 客戶端將根據以下兩個欄位之一驗證服務器的完全限定域名(FQDN):

通用名稱(CN) https://tools.ietf.org/html/rfc6125#section-2.3 https://tools.ietf.org/html/rfc6125#section-2.3

主題備選名稱(SAN)

如果還需要客戶端身份驗證, 則還需要將以下內容添加到 Flume agent 配置中, 或者可以使用全域 SSL 設定(請參閱 SSL / TLS 支持部分). 每個 Flume agent 都必須擁有其客戶證書, Kafka 經紀人必須單獨或通過其簽名鏈來信任. 常見示例是由單個根 CA 簽署每個客戶端證書, 而后者又由 Kafka 經紀人信任.

# optional, the global keystore can be used alternativelya1.sources.source1.kafka.consumer.ssl.keystore.location=/path/to/client.keystore.jksa1.sources.source1.kafka.consumer.ssl.keystore.password=<password to access the keystore>

  

** Kerberos 和 Kafka source **

要將 Kafka source 與使用 Kerberos 保護的 Kafka 群集一起使用, 請為消費者設定上面提到的 consumer.security.protocol 屬性.與 Kafka agent 一起使用的 Kerberos 密鑰表和主體在 JAAS 檔案的 "KafkaClient" 部分中指定."客戶端" 部分描述了 Zookeeper 連接(如果需要). 有關 JAAS 檔案內容的資訊, 請參閱 Kafka doc. 可以通過 flume-env.sh 中的 JAVA_OPTS 指定此 JAAS 檔案的位置以及可選的系統范圍的 kerberos 配置:

JAVA_OPTS="$JAVA_OPTS -Djava.security.krb5.conf=/path/to/krb5.conf"JAVA_OPTS="$JAVA_OPTS -Djava.security.auth.login.config=/path/to/flume_jaas.conf"

 

使用 SASL_PLAINTEXT 的示例安全配置:

a1.sources.source1.type = org.apache.flume.source.kafka.KafkaSourcea1.sources.source1.kafka.Bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093a1.sources.source1.kafka.topics = mytopica1.sources.source1.kafka.consumer.group.id = flume-consumera1.sources.source1.kafka.consumer.security.protocol = SASL_PLAINTEXTa1.sources.source1.kafka.consumer.sasl.mechanism = GSSAPIa1.sources.source1.kafka.consumer.sasl.kerberos.service.name = kafka

  

使用 SASL_SSL 的安全配置示例:

a1.sources.source1.type = org.apache.flume.source.kafka.KafkaSourcea1.sources.source1.kafka.Bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093a1.sources.source1.kafka.topics = mytopica1.sources.source1.kafka.consumer.group.id = flume-consumera1.sources.source1.kafka.consumer.security.protocol = SASL_SSLa1.sources.source1.kafka.consumer.sasl.mechanism = GSSAPIa1.sources.source1.kafka.consumer.sasl.kerberos.service.name = kafka# optional, the global truststore can be used alternativelya1.sources.source1.kafka.consumer.ssl.truststore.location=/path/to/truststore.jksa1.sources.source1.kafka.consumer.ssl.truststore.password=<password to access the truststore>

  

示例 JAAS 檔案. 有關其內容的參考, 請參閱 SASL 配置的 Kafka 檔案中所需認證機制 (GSSAPI / PLAIN) 的客戶端配置部分. 由于 Kafka Source 也可能連接到 Zookeeper 以進行偏移遷移, 因此 "Client" 部分也添加到此示例中. 除非您需要偏移遷移, 否則不需要這樣做, 或者您需要此部分用于其他安全組件. 另外, 請確保 Flume 行程的作業系統用戶對 jaas 和 keytab 檔案具有讀權限.

Client {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=truekeyTab="/path/to/keytabs/flume.keytab"principal="flume/flumehost1.example.com@YOURKERBEROSREALM";};KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=truekeyTab="/path/to/keytabs/flume.keytab"principal="flume/flumehost1.example.com@YOURKERBEROSREALM";};NetCat TCP source

  

類似于 netcat 的 source, 它偵聽給定埠并將每行文本轉換為 event . 像 nc -k -l [host] [port]這樣的行為. 換句話說, 它打開一個指定的埠并監聽資料. 期望是提供的資料是換行符分隔的文本. 每行文本都轉換為 Flume event , 并通過連接的 channel 發送. 必需屬性以 粗體顯示

Property NameDefaultDescription
channels 
typeThe component type name, needs to be netcat
bindHost name or IP address to bind to
portPort # to bind to
max-line-length512Max line length per event body (in bytes)
ack-every-eventtrueRespond with an “OK” for every event received
selector.typereplicatingreplicating or multiplexing
selector.* Depends on the selector.type value
interceptorsSpace-separated list of interceptors
interceptors.*  
Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = netcata1.sources.r1.bind = 0.0.0.0a1.sources.r1.port = 6666a1.sources.r1.channels = c1NetCat UDP source

  

根據原始的 Netcat(TCP)source, 該 source 監聽給定埠并將每行文本轉換為 event 并通過連接的 channel 發送. 像 nc -u -k -l [host] [port]這樣的行為. 必需屬性以 粗體顯示

Property NameDefaultDescription
channels 
typeThe component type name, needs to be netcatudp
bindHost name or IP address to bind to
portPort # to bind to
remoteAddressHeader 
selector.typereplicatingreplicating or multiplexing
selector.* Depends on the selector.type value
interceptorsSpace-separated list of interceptors
interceptors.*  

agent 名為 a1 的示例:

a1.sources = r1a1.channels = c1a1.sources.r1.type = netcatudpa1.sources.r1.bind = 0.0.0.0a1.sources.r1.port = 6666a1.sources.r1.channels = c1Sequence Generator Source

  

一個簡單的 sequence 生成器, 它使用從 0 開始的計數器連續生成 event , 遞增 1 并在 totalEvents 處停止. 無法向 channel 發送 event 時重試. 主要用于測驗. 在重試期間, 它使重試訊息的主體保持與以前相同, 以便在目的地重復資料洗掉之后, 唯一 event 的數量應等于指定的 totalEvents. 必需屬性以粗體顯示

Property NameDefaultDescription
channels 
typeThe component type name, needs to be seq
selector.type replicating or multiplexing
selector.*replicatingDepends on the selector.type value
interceptorsSpace-separated list of interceptors
interceptors.*  
batchSize1Number of events to attempt to process per request loop.
totalEventsLong.MAX_VALUENumber of unique events sent by the source.
Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = seqa1.sources.r1.channels = c1Syslog Source

  

 


讀取 syslog 資料并生成 Flume event .UDP source 將整個訊息視為單個 event .TCPsource 為每個由換行符 ('n') 分隔的字串創建一個新 event

必需屬性以粗體顯示

Syslog TCPsource

原始的, 經過驗證的 syslog TCPsource 代碼

屬性名稱默認描述
channels- 
type-組件型別名稱,需要是 & nbsp;syslogtcp
host-要系結的主機名或 IP 地址
port-要系結的埠號
eventSize2500單個 event 行的最大大小(以位元組為單位)
keepFieldsnone將此設定為 “all” 將保留 event 正文中的 Priority,Timestamp 和 Hostname,還允許包含間隔開的欄位串列,目前,可以包括以下欄位:優先級,版本,時間戳,主機名,值'true'和'false'已被棄用,采用'all'和'none',
clientIPHeader-如果指定,客戶端的 IP 地址將使用此處指定的標頭名稱存盤在每個 event 的標頭中,這允許攔截器和 channel 選擇器基于客戶端的 IP 地址定制路由邏輯,不要在此處使用標準 Syslog 標頭名稱(如_host_),因為在這種情況下將覆寫 event 標頭,
clientHostnameHeader-如果指定,則客戶端的主機名將使用此處指定的標頭名稱存盤在每個 event 的標頭中,這允許攔截器和 channel 選擇器基于客戶端的主機名自定義路由邏輯,檢索主機名可能涉及名稱服務反向查找,這可能會影響性能,不要在此處使用標準 Syslog 標頭名稱(如_host_),因為在這種情況下將覆寫 event 標頭,
selector.type replicating or multiplexing
selector.*replicating取決于 selector.type 值
interceptors-以空格分隔的攔截器串列
interceptors.*  
SSLfalse將其設定為 true 以啟用 SSL 加密,如果啟用了 SSL,則還必須通過組件級引數(請參閱下文)或全域 SSL 引數(請參閱 SSL / TLS 支持部分)指定 “密鑰庫” 和“密鑰庫密碼” ,
keystore-這是 Java 密鑰庫檔案的路徑,如果未在此處指定,則將使用全域密鑰庫(如果已定義,則配置錯誤),
keystore-password-Java 密鑰庫的密碼,如果未在此處指定,則將使用全域密鑰庫密碼(如果已定義,則配置錯誤),
keystore-typeJKSJava 密鑰庫的型別,這可以是 “JKS” 或“PKCS12”,如果未在此處指定,則將使用全域密鑰庫型別(如果已定義,則默認為 JKS),
exclude-protocolsSSLv3要排除的以空格分隔的 SSL / TLS 協議串列,除指定的協議外,將始終排除 SSLv3,
include-protocols-要包含的以空格分隔的 SSL / TLS 協議串列,啟用的協議將是包含的協議,沒有排除的協議,如果包含協議為空,則它包括每個支持的協議,
exclude-cipher-suites-要排除的以空格分隔的密碼套件串列,
include-cipher-suites-以空格分隔的密碼套件串列,啟用的密碼套件將是包含的密碼套件,不包括排除的密碼套件,如果 included-cipher-suites 為空,則包含每個支持的密碼套件,
For example, a syslog TCP source for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = syslogtcpa1.sources.r1.port = 5140a1.sources.r1.host = localhosta1.sources.r1.channels = c1

  

 


多埠 Syslog TCP source

這是 Syslog TCPsource 的更新, 更快, 多埠版本. 請注意, 埠配置設定已替換埠. 多埠功能意味著它可以以有效的方式一次監聽多個埠. 此 source 使用 Apache Mina 庫來執行此操作. 提供對 RFC-3164 和許多常見 RFC-5424 格式訊息的支持. 還提供了配置基于每個埠的字符集的功能.

屬性名稱默認描述
 channels- 
type-組件型別名稱,需要是 multiport_syslogtcp
host-要系結的主機名或 IP 地址,
ports-要系結到的空格分隔串列(一個或多個),
eventSize2500單個 event 行的最大大小(以位元組為單位),
keepFieldsnone將此設定為 “all” 將保留 event 正文中的 Priority,Timestamp 和 Hostname,還允許包含間隔開的欄位串列,目前,可以包括以下欄位:優先級,版本,時間戳,主機名,值'true'和'false'已被棄用,采用'all'和'none',
portHeader-如果指定,埠號將使用此處指定的標頭名稱存盤在每個 event 的標頭中,這允許攔截器和 channel 選擇器基于傳入埠定制路由邏輯,
clientIPHeader-如果指定,客戶端的 IP 地址將使用此處指定的標頭名稱存盤在每個 event 的標頭中,這允許攔截器和 channel 選擇器基于客戶端的 IP 地址定制路由邏輯,不要在此處使用標準 Syslog 標頭名稱(如_host_),因為在這種情況下將覆寫 event 標頭,
clientHostnameHeader-如果指定,則客戶端的主機名將使用此處指定的標頭名稱存盤在每個 event 的標頭中,這允許攔截器和 channel 選擇器基于客戶端的主機名自定義路由邏輯,檢索主機名可能涉及名稱服務反向查找,這可能會影響性能,不要在此處使用標準 Syslog 標頭名稱(如_host_),因為在這種情況下將覆寫 event 標頭,
charset.defaultUTF-8將 syslogevent 決議為字串時使用的默認字符集,
charset.port-字符集可基于每個埠進行配置,
BATCHSIZE100每個請求回圈嘗試處理的最大 event 數,使用默認值通常很好,
readBufferSize1024內部 Mina 讀緩沖區的大小,提供性能調整,使用默認值通常很好,
numProcessors(auto-detected)處理訊息時系統上可用的處理器數量,默認是使用 Java Runtime API 自動檢測 CPU 數量,Mina 將為每個檢測到的 CPU 生成 2 個請求處理執行緒,這通常是合理的,
selector.typereplicatingreplicating, multiplexing, or custom
selector.*-取決于 selector.type 值
interceptors-以空格分隔的攔截器串列,
interceptors.*  
SSLfalse將其設定為 true 以啟用 SSL 加密,如果啟用了 SSL,則還必須通過組件級引數(請參閱下文)或全域 SSL 引數(請參閱 SSL / TLS 支持部分)指定 “密鑰庫” 和“密鑰庫密碼” ,
keystore-這是 Java 密鑰庫檔案的路徑,如果未在此處指定,則將使用全域密鑰庫(如果已定義,則配置錯誤),
keystore-password-Java 密鑰庫的密碼,如果未在此處指定,則將使用全域密鑰庫密碼(如果已定義,則配置錯誤),
keystore-typeJKSJava 密鑰庫的型別,這可以是 “JKS” 或“PKCS12”,如果未在此處指定,則將使用全域密鑰庫型別(如果已定義,則默認為 JKS),
exclude-protocolsSSLv3要排除的以空格分隔的 SSL / TLS 協議串列,除指定的協議外,將始終排除 SSLv3,
include-protocols-要包含的以空格分隔的 SSL / TLS 協議串列,啟用的協議將是包含的協議,沒有排除的協議,如果包含協議為空,則它包括每個支持的協議,
exclude-cipher-suites-要排除的以空格分隔的密碼套件串列,
include-cipher-suites-以空格分隔的密碼套件串列,啟用的密碼套件將是包含的密碼套件,不包括排除的密碼套件,如果 included-cipher-suites 為空,則包含每個支持的密碼套件,
For example, a multiport syslog TCP source for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = multiport_syslogtcpa1.sources.r1.channels = c1a1.sources.r1.host = 0.0.0.0a1.sources.r1.ports = 10001 10002 10003a1.sources.r1.portHeader = portSyslog UDPsource

  

 

 

Property NameDefaultDescription
channels 
typeThe component type name, needs to be syslogudp
hostHost name or IP address to bind to
portPort # to bind to
keepFieldsfalseSetting this to true will preserve the Priority, Timestamp and Hostname in the body of the event.
clientIPHeaderIf specified, the IP address of the client will be stored in the header of each event using the header name specified here. This allows for interceptors and channel selectors to customize routing logic based on the IP address of the client. Do not use the standard Syslog header names here (like _host_) because the event header will be overridden in that case.
clientHostnameHeaderIf specified, the host name of the client will be stored in the header of each event using the header name specified here. This allows for interceptors and channel selectors to customize routing logic based on the host name of the client. Retrieving the host name may involve a name service reverse lookup which may affect the performance. Do not use the standard Syslog header names here (like _host_) because the event header will be overridden in that case.
selector.type replicating or multiplexing
selector.*replicatingDepends on the selector.type value
interceptorsSpace-separated list of interceptors
interceptors.*  
For example, a syslog UDP source for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = syslogudpa1.sources.r1.port = 5140a1.sources.r1.host = localhosta1.sources.r1.channels = c1

  

 


HTTP Source < 通過 HTTP POST 和 GET 接受 Flumeevent 的 source.GET 應僅用于實驗. HTTP 請求由可插入的 "處理程式" 轉換為 flume event , 該處理程式必須實作 HTTPSourceHandler 介面. 該處理程式獲取 HttpServletRequest 并回傳 flume event 串列.從一個 Http 請求處理的所有 event 都在一個事務中提交給 channel, 從而允許在諸如檔案 channel 之類的 channel 上提高效率. 如果處理程式拋出例外, 則此 source 將回傳 HTTP 狀態 400. 如果 channel 已滿, 或者 source 無法將 event 附加到 channel, 則 source 將回傳 HTTP 503 - 暫時不可用狀態

在一個發布請求中發送的所有 event 都被視為一個批處理, 并在一個事務中插入到 channel 中

此 source 基于 Jetty 9.4, 并提供了設定其他 Jetty 特定引數的功能, 這些引數將直接傳遞給 Jetty 組件

屬性名稱默認描述
type 組件型別名稱需要為 http
port-source 應系結的埠,
bind0.0.0.0要偵聽的主機名或 IP 地址
handlerorg.apache.flume.source.http.JSONHandler處理程式類的 FQCN,
handler.*-配置處理程式的引數
selector.typereplicatingreplicating or multiplexing
selector.* 取決于 selector.type 值
interceptors-以空格分隔的攔截器串列
interceptors.*  
SSL將屬性設定為 true,以啟用 SSL.HTTP Source 不支持 SSLv3,
exclude-protocols在 SSLv3要排除的以空格分隔的 SSL / TLS 協議串列,除指定的協議外,將始終排除 SSLv3,
include-protocols-要包含的以空格分隔的 SSL / TLS 協議串列,啟用的協議將是包含的協議,沒有排除的協議,如果包含協議為空,則它包括每個支持的協議,
exclude-cipher-suites-要排除的以空格分隔的密碼套件串列,
include-cipher-suites-以空格分隔的密碼套件串列,啟用的密碼套件將是包含的密碼套件,不包括排除的密碼套件,
keystore 密鑰庫的位置,包括密鑰庫檔案名,如果啟用了 SSL 但未在此處指定密鑰庫,則將使用全域密鑰庫(如果已定義,則配置錯誤),
keystore-password 密鑰庫密碼,如果啟用了 SSL 但未在此處指定密鑰庫密碼,則將使用全域密鑰庫密碼(如果已定義,則配置錯誤),
keystore-typeJKS密鑰庫型別,這可以是 “JKS” 或“PKCS12”,
QueuedThreadPool.* 要在 org.eclipse.jetty.util.thread.QueuedThreadPool 上設定的 Jetty 特定設定,NB QueuedThreadPool 僅在設定了此類的至少一個屬性時使用,
HttpConfiguration.* 要在 org.eclipse.jetty.server.HttpConfiguration 上設定 Jetty 特定設定
SslContextFactory.* 要在 org.eclipse.jetty.util.ssl.SslContextFactory 上設定的 Jetty 特定設定(僅在 ssl 設定為 true 時適用),
ServerConnector.* 要在 org.eclipse.jetty.server.ServerConnector 上設定的 Jetty 特定設定

不推薦使用的屬性

物業名稱默認描述
keystorePassword-使用密鑰庫密碼,不推薦的值將被新的值覆寫,
excludeProtocolsSSLv3使用 exclude-protocols,不推薦的值將被新的值覆寫,
enableSSLfalse使用 ssl,不推薦的值將被新的值覆寫,

NB 使用上面列出的物件上的 setter-methods 設定 Jetty 特定設定. 有關完整的詳細資訊, 請參閱這些類的 Javadoc(, , 和 )

使用特定于 Jetty 的設定時, 上面命名的屬性將優先(例如, excludeProtocols 將優先于 SslContextFactory.ExcludeProtocols). 所有房產都是小寫的.

An example http source for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = httpa1.sources.r1.port = 5140a1.sources.r1.channels = c1a1.sources.r1.handler = org.example.REST.RestHandlera1.sources.r1.handler.nickname = random propsa1.sources.r1.HttpConfiguration.sendServerVersion = falsea1.sources.r1.ServerConnector.idleTimeout = 300JSONHandler

  

開箱即用的處理程式可以處理以 JSON 格式表示的 event , 并支持 UTF-8,UTF-16 和 UTF-32 字符集. 處理程式接受一個 event 陣列(即使只有一個 event ,event 必須在陣列中發送), 并根據請求中指定的編碼將它們轉換為 Flumeevent . 如果未指定編碼, 則假定為 UTF-8.JSON 處理程式支持 UTF-8,UTF-16 和 UTF-32.event 表示如下.

[{"headers" : {"timestamp" : "434324343","host" : "random_host.example.com"},"body" : "random_body"},{"headers" : {"namenode" : "namenode.example.com","datanode" : "random_datanode.example.com"},"body" : "really_random_body"}]

  

要設定 charset, 請求必須具有指定為 application/JSON 的 內容型別 ; charset = UTF-8(根據需要用 UTF-16 或 UTF-32 替換 UTF-8)

以此處理程式所期望的格式創建 event 的一種方法是使用 Flume SDK 中提供的 JSONEvent 并使用 Google Gson 使用 Gson#fromJson(Object,Type)方法創建 JSON 字串. 要作為 event 串列的此方法的第二個引數傳遞的型別標記可以通過以下方式創建:

Type type = new TypeToken<List<JSONEvent>>() {}.getType();BlobHandler

  

默認情況下, HTTPSource 將 JSON 輸入拆分為 Flumeevent . 作為替代方案, BlobHandler 是 HTTPSource 的處理程式, 它回傳包含請求引數的 event 以及使用此請求上載的二進制大物件(BLOB). 例如 PDF 或 JPG 檔案. 請注意, 此方法不適用于非常大的物件, 因為它會將整個 BLOB 快取在 RAM 中.

屬性名稱默認描述
handler-此類的 FQCN:org.apache.flume.sink.solr.morphline.BlobHandler
handler.maxBlobLength100000000要讀取的最大位元組數和給定請求的緩沖區

Stress source

StressSource 是一個內部負載生成 source 實作, 對壓力測驗非常有用. 它允許用戶使用空標頭配置 event 有效負載的大小. 用戶可以配置要發送的 event 總數以及要傳遞的最大成功 event 數.

必需屬性以粗體顯示

物業名稱默認描述
type-組件型別名稱,需要是 org.apache.flume.source.StressSource
size500每個 event 的有效載荷大小,單位:位元組
maxTotalEvents-1要發送的最大 event 數
maxSuccessfulEvents-1成功發送的最大 event 數
BATCHSIZE1一批中要發送的 event 數
maxEventsPerSecond0設定為大于零的整數時,在 source 上強制執行速率限制,
Example for agent named a1:a1.sources = stresssource-1a1.channels = memoryChannel-1a1.sources.stresssource-1.type = org.apache.flume.source.StressSourcea1.sources.stresssource-1.size = 10240a1.sources.stresssource-1.maxTotalEvents = 1000000a1.sources.stresssource-1.channels = memoryChannel-1Legacy Sources

  

 


legacy source 允許 Flume 1.x agent 從 Flume 0.9.4 agent 接收 event . 它接受 Flume 0.9.4 格式的 event , 將它們轉換為 Flume 1.0 格式, 并將它們存盤在連接的 channel 中. 0.9.4event 屬性 (如 timestamp,pri,host,nanos 等) 將轉換為 1.xevent 頭屬性. 舊版 source 支持 Avro 和 Thrift RPC 連接. 要在兩個 Flume 版本之間使用此橋接, 您需要使用 avroLegacy 或 thriftLegacysource 啟動 Flume 1.x agent .0.9.4 agent 應該讓 agent Sink 指向 1.x agent 的主機 / 埠.

注意

Flume 1.x 的可靠性語意與 Flume 0.9.x 的可靠性語意不同. 舊版 source 不支持 Flume 0.9.x agent 的 E2E 或 DFO 模式. 唯一支持的 0.9.x 模式是盡力而為, 盡管 1.x 流的可靠性設定將適用于傳統 source 保存到 Flume 1.xchannel 后的 event

必需屬性以粗體顯示

Avro Legacy Source

  屬性名稱默認描述
channels- 
type-組件型別名稱,需要是 org.apache.flume.source.avroLegacy.AvroLegacySource
host-要系結的主機名或 IP 地址
port-要聽的埠#
selector.type replicating or multiplexing
selector.*replicating取決于 selector.type 值
interceptors-以空格分隔的攔截器串列
interceptors.*  
Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = org.apache.flume.source.avroLegacy.AvroLegacySourcea1.sources.r1.host = 0.0.0.0a1.sources.r1.bind = 6666a1.sources.r1.channels = c1Thrift Legacy Source

  

 

 

屬性名稱默認描述
channels- 
type-組件型別名稱,需要是 org.apache.flume.source.thriftLegacy.ThriftLegacySource
host-要系結的主機名或 IP 地址
port-要聽的埠#
selector.type replicating or multiplexing
selector.*replicating取決于 selector.type 值
interceptors-以空格分隔的攔截器串列
interceptors.*  
Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = org.apache.flume.source.thriftLegacy.ThriftLegacySourcea1.sources.r1.host = 0.0.0.0a1.sources.r1.bind = 6666a1.sources.r1.channels = c1Custom Source

  

 


自定義 source 是您自己的 Source 介面實作. 啟動 Flume agent 時, 自定義 source 的類及其依賴項必須包含在 agent 程式的類路徑中. 自定義 source 的型別是其 FQCN.

屬性名稱默認描述
channels- 
type-組件型別名稱,需要是您的 FQCN
selector.type replicating or multiplexing
selector.*replicating取決于 selector.type 值
interceptors-以空格分隔的攔截器串列
interceptors.*  
Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = org.example.MySourcea1.sources.r1.channels = c1Scribe Source

  

 


Scribe 是另一種攝取系統. 要采用現有的 Scribe 攝取系統, Flume 應該使用基于 Thrift 的 ScribeSource 和兼容的傳輸協議. 要部署 Scribe, 請遵循 Facebook 的指南. 必需屬性以粗體顯示

屬性名稱默認描述
type-組件型別名稱,需要是 org.apache.flume.source.scribe.ScribeSource
port1499應該連接 Scribe 的埠
maxReadBufferBytes 16384000Thrift 默認 FrameBuffer 大小
workerThreads5在 Thrift 中處理執行緒數
selector.type  
selector.*  

 

Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.type = org.apache.flume.source.scribe.ScribeSourcea1.sources.r1.port = 1463a1.sources.r1.workerThreads = 5a1.sources.r1.channels = c1Flume SinksHDFS Sink

  


此 sink 將 event 寫入 Hadoop 分布式檔案系統 (HDFS). 它目前支持創建文本和序列檔案. 它支持兩種檔案 type 的壓縮. 可以根據經過的時間或資料大小或 event 數量定期滾動檔案(關閉當前檔案并創建新檔案). 它還根據 event source 自的時間戳或機器等屬性對資料進行磁區 / 磁區. HDFS 目錄路徑可能包含格式轉義序列, 將由 HDFS sink 替換, 以生成用于存盤 event 的目錄 / 檔案名. 使用此 sink 需要安裝 hadoop, 以便 Flume 可以使用 Hadoop jar 與 HDFS 集群進行通信. 請注意, 需要支持 sync() 呼叫的 Hadoop 版本.

以下是支持的轉義序列:

別號描述
%{host}名為 “host” 的 event 標頭的替換值,支持任意標題名稱,
%TUnix 時間,以毫秒為單位
%alocale 的作業日短名稱(周一,周二,......)
%Alocale 的完整作業日名稱(周一,周二......)
%blocale 的短月名(Jan,Feb,...)
%Blocale 的長月名(1 月,2 月......)
%Clocale 的日期和時間(2005 年 3 月 3 日 23:05:25)
%d每月的一天(01)
%E沒有填充的月份日(1)
%d日期;  與%m /%d /%y 相同
%H小時(00..23)
%I小時(01..12)
%j一年中的一天(001..366)
%K小時(0..23)
%M月(01..12)
%N沒有填充的月份(1..12)
%M分鐘(00..59)
%plocale 相當于 am 或 pm
%S自 1970-01-01 00:00:00 UTC 以來的秒數
%S第二(00..59)
%Y年份的最后兩位數(00..99)
%Y年(2010 年)
%Z+ hhmm 數字時區(例如,-0400)
%[localhost]替換運行 agent 程式的主機的 hostname
%[IP]替換運行 agent 程式的主機的 IP 地址
%[FQDN]替換運行 agent 程式的主機的規范 hostname

注意: 轉義字串%[localhost],%[IP]和%[FQDN]都依賴于 Java 獲取 hostname 的能力, 這在某些網路環境中可能會失敗.

正在使用的檔案將在名稱末尾包含 ".tmp". 檔案關閉后, 將洗掉此擴展程式. 這允許排除目錄中的部分完整檔案. 必需屬性以粗體顯示

注意

對于所有與時間相關的轉義序列, event 標題中必須存在帶有 "timestamp" 鍵的標頭(除非 hdfs.useLocalTimeStamp 設定為 true).自動添加此方法的一種方法是使用 TimestampInterceptor.

名稱默認描述
channel- 
type-組件 type 名稱,需要是 hdfs
hdfs.path-HDFS 目錄路徑( eg hdfs://namenode/flume/webdata/  )
hdfs.filePrefixFlumeData名稱前綴為 Flume 在 hdfs 目錄中創建的檔案
hdfs.fileSuffix-附加到檔案的后綴(例如. avro -  注意:不會自動添加句點)
hdfs.inUsePrefix-用于水槽主動寫入的臨時檔案的前綴
hdfs.inUseSuffix.TMP用于臨時檔案的后綴,flume 主動寫入
hdfs.emptyInUseSuffixfalse如果為 false,則在寫入輸出時使用 hdfs.inUseSuffix,關閉輸出后,hdfs.inUseSuffix 將從輸出檔案名中洗掉,如果為 true,則忽略 hdfs.inUseSuffix 引數,而是使用空字串,
hdfs.rollInterval30滾動當前檔案之前等待的秒數(0 = 根據時間間隔從不滾動)
hdfs.rollSize1024觸發滾動的檔案大小,以位元組為單位(0:永不基于檔案大小滾動)
hdfs.rollCount10在滾動之前寫入檔案的 event 數(0 = 從不基于 event 數滾動)
hdfs.idleTimeout0超時后非活動檔案關閉(0 = 禁用自動關閉空閑檔案)
hdfs.batchSize100在將檔案重繪到 HDFS 之前寫入檔案的 event 數
hdfs.codeC-壓縮編解碼器,以下之一:gzip,bzip2,lzo,lzop,snappy
hdfs.fileTypeSequenceFile檔案格式:當前 SequenceFile,DataStream 或 CompressedStream (1)DataStream 不會壓縮輸出檔案,請不要設定 codeC(2)CompressedStream 需要使用可用的 codeC 設定 hdfs.codeC
hdfs.maxOpenFiles5000僅允許此數量的打開檔案,如果超過此數量,則關閉最舊的檔案,
hdfs.minBlockReplicas-指定每個 HDFS 塊的最小副本數,如果未指定,則它來自類路徑中的默認 Hadoop 配置,
hdfs.writeFormat可寫序列檔案記錄的格式,一個文本或可寫,在使用 Flume 創建資料檔案之前設定為 Text,否則 Apache Impala(范訓)或 Apache Hive 無法讀取這些檔案,
hdfs.threadsPoolSize10HDFS IO 操作的每個 HDFS  sink 的執行緒數(open, write, etc. )
hdfs.rollTimerPoolSize1每個 HDFS sink 用于調度定時檔案滾動的執行緒數
hdfs.kerberosPrincipal-用于訪問安全 HDFS 的 Kerberos 用戶主體
hdfs.kerberosKeytab-用于訪問安全 HDFS 的 Kerberos 密鑰表
hdfs.proxyUser  
hdfs.roundfalse是否應將時間戳向下舍入(如果為 true,則影響除%t 之外的所有基于時間的轉義序列)
hdfs.roundValue1舍入到此最高倍(在使用 hdfs.roundUnit 配置的單位中),小于當前時間,
hdfs.roundUnitsecond舍入值的單位 -  second, minute or hour.
hdfs.timeZoneLocal Time應該用于決議目錄路徑的時區名稱,例如 America/Los_Angeles,
hdfs.useLocalTimeStampfalse替換轉義序列時,請使用本地時間(而不是 event 頭中的時間戳),
hdfs.closeTries0啟動近距離嘗試后,sink 必須嘗試重命名檔案的次數,如果設定為 1,則此 sink 將不會重新嘗試失敗的重命名(例如,由于 NameNode 或 DataNode 失敗),并且可能使檔案處于打開狀態,擴展名為. tmp,如果設定為 0,sink 將嘗試重命名該檔案,直到最終重命名該檔案(它將嘗試的次數沒有限制),如果關閉呼叫失敗但資料將保持不變,則檔案可能仍保持打開狀態,在這種情況下,只有在 Flume 重啟后檔案才會關閉,
hdfs.retryInterval180連續嘗試關閉檔案之間的時間(以秒為單位),每次關閉呼叫都會花費多次 RPC 往返 Namenode,因此將此設定得太低會導致名稱節點上的大量負載,如果設定為 0 或更小,則如果第一次嘗試失敗,sink 將不會嘗試關閉檔案,并且可能使檔案保持打開狀態或擴展名為 “.tmp”,
serializerTEXT其他可能的選項包括 avro_event 或 EventSerializer.Builder 介面的實作的完全限定類名 & nbsp;,
serializer.*  

不推薦使用的屬性:

名稱默認描述
hdfs.callTimeout  30000HDFS 操作允許的毫秒數,例如 open,write,flush,close, 如果發生許多 HDFS 超時操作,則應增加此數量,
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = hdfsa1.sinks.k1.channel = c1a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%Sa1.sinks.k1.hdfs.filePrefix = events-a1.sinks.k1.hdfs.round = truea1.sinks.k1.hdfs.roundValue = https://www.cnblogs.com/laoqing/p/10a1.sinks.k1.hdfs.roundUnit = minute

  

 


以上配置將時間戳向下舍入到最后 10 分鐘. 例如, 時間戳為 2012 年 6 月 12 日上午 11:54:34 的 event 將導致 hdfs 路徑變為

  1. /flume/events/2012-06-12/1150/00.
  2. Hive Sink

此 sink 將包含分隔文本或 JSON 資料的 event 直接流式傳輸到 Hive 表或磁區. event 使用 Hive 事務撰寫. 一旦將一組 event 提交給 Hive, 它們就會立即顯示給 Hive 查詢. 水槽將流入的磁區既可以預先創建, 也可以選擇 Flume 創建它們, 如果它們缺失的話. 傳入 event 資料中的欄位將映射到 Hive 表中的相應列

名稱默認描述
channel- 
type-組件 type 名稱需要是 hive
hive.metastore-Hive Metastore URI(  eg thrift://a.b.com:9083  )
hive.database-Hive 資料庫名稱
hive.table-Hive 表名
hive.partition-逗號分隔標識要寫入的磁區的磁區值串列,可能包含轉義序列,例如:如果表格被磁區(大陸:字串,國家:字串,時間:字串),那么'亞洲,印度,2014-02-26-01-21'將表示大陸 = 亞洲,國家 = 印度,時間 = 2014 -02-26-01-21
hive.txnsPerBatchAsk100Hive 向 Flume 等流媒體客戶端授予一批交易而非單筆交易,此設定配置每個事務批處理所需的事務數,來自單個批次中所有事務的資料最終都在一個檔案中,Flume 將在批處理中的每個事務中寫入最多 batchSizeevent ,此設定與 batchSize 一起提供對每個檔案大小的控制,請注意,最終 Hive 會將這些檔案透明地壓縮為更大的檔案,
heartBeatInterval240(以秒為單位)發送到 Hive 的連續心跳之間的間隔,以防止未使用的事務過期,將此值設定為 0 可禁用心跳,
autoCreatePartitionstrueFlume 將自動創建必要的 Hive 磁區以進行流式傳輸
BATCHSIZE15000在單個 Hive 事務中寫入 Hive 的最大 event 數
maxOpenConnections500僅允許此數量的打開連接,如果超過此數量,則關閉最近最少使用的連接,
callTimeout10000(以毫秒為單位)Hive 和 HDFS   I/O 操作的超時,例如 openTxn,write,commit,abort,
serializer Serializer 負責決議 event 中的欄位并將它們映射到 hive 表中的列,serializer 器的選擇取決于 event 中資料的格式,支持的序列化程式:DELIMITED 和 JSON
roundUnitminute舍入值的單位 -  秒,分鐘或小時,
roundValue1舍入到此最高倍數(在使用 hive.roundUnit 配置的單位中),小于當前時間
時區Local Time應該用于決議磁區中轉義序列的時區名稱,例如 America / Los_Angeles,
useLocalTimeStampfalse替換轉義序列時,請使用本地時間(而不是 event 頭中的時間戳),

為 Hive sink 提供了以下序列化程式:

JSON: 處理 UTF8 編碼的 JSON(嚴格語法)event , 不需要配置. JSON 中的物件名稱直接映射到 Hive 表中具有相同名稱的列. 內部使用 org.apache.hive.hcatalog.data.JsonSerDe, 但獨立于 Hive 表的 Serde. 此序列化程式需要安裝 HCatalog.

DELIMITED: 處理簡單的分隔文本 event . 內部使用 LazySimpleSerde, 但獨立于 Hive 表的 Serde.

名稱默認描述
serializer.delimiter(type:字串)傳入資料中的欄位分隔符,要使用特殊字符,請用雙引號括起來,例如 “\t”
serializer.fieldnames-從輸入欄位到 hive 表中的列的映射,指定為 hive 表列名稱的逗號分隔串列(無空格),按發生順序標識輸入欄位,要跳過欄位,請保留未指定的列名稱,例如,'time ,, ip,message'表示輸入映射到 hive 表中的 time,ip 和 message 列的第 1,第 3 和第 4 個欄位,
serializer.serdeSeparatorCtrl-A(type:字符)自定義基礎 serde 使用的分隔符,如果 serializer.fieldnames 中的欄位與表列的順序相同,則 serializer.delimiter 與 serializer.serdeSeparator 相同,并且 serializer.fieldnames 中的欄位數小于或等于表的數量,可以提高效率列,因為傳入 event 正文中的欄位不需要重新排序以匹配表列的順序,對于'\t'這樣的特殊字符使用單引號,確保輸入欄位不包含此字符,注意:如果 serializer.delimiter 是單個字符,最好將其設定為相同的字符

以下是支持的轉義序列:

別號描述
%{host}名為 “host” 的 event 標頭的替換值,支持任意標題名稱,
%TUnix 時間,以毫秒為單位
%alocale 的作業日短名稱(周一,周二,......)
%Alocale 的完整作業日名稱(周一,周二......)
%blocale 的短月名(Jan,Feb,...)
%Blocale 的長月名(1 月,2 月......)
%Clocale 的日期和時間(2005 年 3 月 3 日 23:05:25)
%d每月的一天(01)
%d日期;  與%m /%d /%y 相同
%H小時(00..23)
%I小時(01..12)
%j一年中的一天(001..366)
%K小時(0..23)
%M月(01..12)
%M分鐘(00..59)
%plocale 相當于 am 或 pm
%S自 1970-01-01 00:00:00 UTC 以來的秒數
%S第二(00..59)
%Y年份的最后兩位數(00..99)
%Y年(2010 年)
%Z+ hhmm  數字時區(例如,-0400)

注意

對于所有與時間相關的轉義序列, event 標題中必須存在具有鍵 "timestamp" 的標頭(除非 useLocalTimeStamp 設定為 true). 自動添加此方法的一種方法是使用 TimestampInterceptor.

示例 Hive 表:

create table weblogs ( id int , msg string )partitioned by (continent string, country string, time string)clustered by (id) into 5 bucketsstored as orc;Example for agent named a1:a1.channels = c1a1.channels.c1.type = memorya1.sinks = k1a1.sinks.k1.type = hivea1.sinks.k1.channel = c1a1.sinks.k1.hive.metastore = thrift://127.0.0.1:9083a1.sinks.k1.hive.database = logsdba1.sinks.k1.hive.table = weblogsa1.sinks.k1.hive.partition = asia,%{country},%y-%m-%d-%H-%Ma1.sinks.k1.useLocalTimeStamp = falsea1.sinks.k1.round = truea1.sinks.k1.roundValue = https://www.cnblogs.com/laoqing/p/10a1.sinks.k1.roundUnit = minutea1.sinks.k1.serializer = DELIMITEDa1.sinks.k1.serializer.delimiter ="\t"a1.sinks.k1.serializer.serdeSeparator = '\t'a1.sinks.k1.serializer.fieldnames =id,,msg

  

以上配置將時間戳向下舍入到最后 10 分鐘. 例如, 將時間戳標頭設定為 2012 年 6 月 12 日上午 11:54:34 且 "country" 標頭設定為 "india" 的 event 將評估為磁區(continent ='asia',country ='india',time ='2012-06-12-11-50'. 序列化程式配置為接受包含三個欄位的制表符分隔輸入并跳過第二個欄位.

Logger Sink

在 INFO 級別記錄 event . 通常用于測驗 / 除錯目的. 必需屬性以粗體顯示. 此 sink 是唯一的例外, 它不需要在 "記錄原始資料" 部分中說明的額外配置.

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 & nbsp; logger
maxBytesToLog16要記錄的 event 主體的最大位元組數
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = loggera1.sinks.k1.channel = c1Avro Sink

  

 


這個 Sink 形成了 Flume 的分層收集支持的一半. 發送到此 sink 的 Flume event 將轉換為 Avro event 并發送到配置的 hostname/port pair .event 將從配置的 channel 中批量獲取配置的批處理大小. 必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 avro,
hostname-要系結的 hostname 或 IP 地址,
port-要聽的埠#,
batch-size100要一起批量發送的 event 數,
connect-timeout20000允許第一個(握手)請求的時間量(ms),
request-timeout20000在第一個之后允許請求的時間量(ms),
reset-connection-intervalnone重置連接到下一跳之前的時間量,這將迫使 Avro Sink 重新連接到下一跳,這將允許 sink 在添加新聞主機時連接到硬體負載平衡器后面的主機,而無需重新啟動 agent ,
compression-typenone這可以是 “ none ” 或“  deflate ”,壓縮 type 必須與匹配 AvroSource 的壓縮 type 匹配
compression-level6壓縮 event 的壓縮級別,0 = 無壓縮,1-9 是壓縮,數字越大,壓縮越多
SSLfalse設定為 true 以啟用此 AvroSink 的 SSL,配置 SSL 時,您可以選擇設定“truststore”,“truststore-password”,“truststore-type”,并指定是否“trust-all-certs”,
trust-all-certsfalse如果將此設定為 true,則不會檢查遠程服務器(Avrosource)的 SSL 服務器證書,這不應該在生產中使用,因為它使攻擊者更容易執行中間人攻擊并 “監聽” 加密連接,
truststore-自定義 Java 信任庫檔案的路徑,Flume 使用此檔案中的證書頒發機構資訊來確定是否應該信任遠程 Avro Source 的 SSL 身份驗證憑據,如果未指定,則將使用全域密鑰庫,如果未指定全域密鑰庫,則將使用預設 Java JSSE 證書頒發機構檔案(通常為 Oracle JRE 中的 “jssecacerts” 或“cacerts”),
truststore-password-信任庫的密碼,如果未指定,則將使用全域密鑰庫密碼(如果已定義),
truststore-typeJKSJava 信任庫的 type,這可以是 “JKS” 或其他受支持的 Java 信任庫 type,如果未指定,則將使用全域密鑰庫 type(如果已定義,則 defautl 為 JKS),
exclude-protocols在 SSLv3要排除的以空格分隔的 SSL/TLS 協議串列,除指定的協議外,將始終排除 SSLv3,
maxIoWorkers2 * 機器中可用處理器的數量I / O 作業執行緒的最大數量,這是在 NettyAvroRpcClient NioClientSocketChannelFactory 上配置的,
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = avroa1.sinks.k1.channel = c1a1.sinks.k1.hostname = 10.10.10.10a1.sinks.k1.port = 4545Thrift Sink

  

 


這個水槽形成了 Flume 的分層收集支持的一半. 發送到此 sink 的 Flume event 將轉換為 Thrift event 并發送到配置的 hostname/port pair.event 將從配置的 channel 中批量獲取配置的批處理大小.

可以通過啟用 kerberos 身份驗證將 Thrift sink 配置為以安全模式啟動. 要與以安全模式啟動的 Thriftsource 通信, Thriftsink 也應該以安全模式運行. client-principal 和 client-keytab 是 Thriftsink 用于向 kerberos KDC 進行身份驗證的屬性. server-principal 表示 Thriftsource 的主體, 此 sink 配置為以安全模式連接. 必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要節儉,
hostname-要系結的 hostname 或 IP 地址,
port-要聽的埠#,
batch-size100要一起批量發送的 event 數,
connect-timeout20000允許第一個(握手)請求的時間量(ms),
request-timeout20000在第一個之后允許請求的時間量(ms),
connection-reset-intervalnone重置連接到下一跳之前的時間量,這將迫使 Thrift Sink 重新連接到下一跳,這將允許 sink 在添加新聞主機時連接到硬體負載平衡器后面的主機,而無需重新啟動 agent ,
SSLfalse設定為 true 以為此 ThriftSink 啟用 SSL,配置 SSL 時,您可以選擇設定 “truststore”,“truststore-password” 和“truststore-type”
truststore-自定義 Java 信任庫檔案的路徑,Flume 使用此檔案中的證書頒發機構資訊來確定是否應該信任遠程 Thrift Source 的 SSL 身份驗證憑據,如果未指定,則將使用全域密鑰庫,如果未指定全域密鑰庫,則將使用預設 Java JSSE 證書頒發機構檔案(通常為 Oracle JRE 中的 “jssecacerts” 或“cacerts”),
truststore-password-信任庫的密碼,如果未指定,則將使用全域密鑰庫密碼(如果已定義),
truststore-typeJKSJava 信任庫的 type,這可以是 “JKS” 或其他受支持的 Java 信任庫 type,如果未指定,則將使用全域密鑰庫 type(如果已定義,則 defautl 為 JKS),
exclude-protocolsSSLv3要排除的以空格分隔的 SSL / TLS 協議串列
Kerberos 的false設定為 true 以啟用 kerberos 身份驗證,在 kerberos 模式下,需要 client-principal,client-keytab 和 server-principal 才能成功進行身份驗證并與啟用 kerberos 的 Thrift Source 進行通信,
client-principal-Thrift Sink 使用的 kerberos 校長對 kerberos KDC 進行身份驗證,
client-keytab-Thrift Sink 與客戶端主體結合使用的 keytab 位置,用于對 kerberos KDC 進行身份驗證,
server-principal-Thrift Sink 配置為連接到的 Thrift Source 的 kerberos 主體,
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = thrifta1.sinks.k1.channel = c1a1.sinks.k1.hostname = 10.10.10.10a1.sinks.k1.port = 4545IRC Sink

  

 


IRC sink 從附加 channel 接收訊息, 并將這些訊息中繼到已配置的 IRC 目標. 必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 irc
hostname-要連接的 hostname 或 IP 地址
port6667要連接的遠程主機的埠號
nick-昵稱
user-用戶名
password-用戶密碼
chan-channel
name  
splitlines-(布林值)
splitChars 中n行分隔符(如果你要在組態檔中輸入默認值,那么你需要轉義反斜杠,如下所示:“\ n”)
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = irca1.sinks.k1.channel = c1a1.sinks.k1.hostname = irc.yourdomain.coma1.sinks.k1.nick = flumea1.sinks.k1.chan = #flumeFile Roll Sink

  

 


在本地檔案系統上存盤 event . 必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 file_roll,
sink.directory-將存盤檔案的目錄
sink.pathManagerDEFAULT要使用的 PathManager 實作,
sink.pathManager.extension-如果使用默認的 PathManager,則為檔案擴展名,
sink.pathManager.prefix-如果使用默認 PathManager,則添加到檔案名開頭的字串
sink.rollInterval30每 30 秒滾動一次檔案,指定 0 將禁用滾動并導致所有 event 都寫入單個檔案,
sink.serializerTEXT其他可能的選項包括 avro_event 或 EventSerializer.Builder 介面實作的 FQCN,
sink.batchSize100 
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = file_rolla1.sinks.k1.channel = c1a1.sinks.k1.sink.directory = /var/log/flumeNull Sink

  

 


丟棄從 channel 收到的所有 event . 必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱必須為 null,
BATCHSIZE100 
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = nulla1.sinks.k1.channel = c1HBase Sink

  

 


此 sink 將資料寫入 HBase.Hbase 配置是從類路徑中遇到的第一個 hbase-site.xml 中獲取的. 實作由配置指定的 HbaseEventSerializer 的類用于將 event 轉換為 HBase put 和 / 或 increments . 然后將這些 put 和 increments 寫入 HBase. 該 sink 提供與 HBase 相同的一致性保證, HBase 是當前行的原子性. 如果 Hbase 無法寫入某些 event , 則 sink 將重播該事務中的所有 event

HBase Sink 支持將資料寫入安全 HBase. 要寫入安全 HBase, agent 程式正在運行的用戶必須具有對 sink 配置為寫入的表的寫入權限. 可以在配置中指定用于對 KDC 進行身份驗證的主體和密鑰表. Flume agent 程式類路徑中的 hbase-site.xml 必須將身份驗證設定為 kerberos(有關如何執行此操作的詳細資訊, 請參閱 HBase 檔案)

為方便起見, Flume 提供了兩個序列化器.

SimpleHbaseEventSerializer(org.apache.flume.sink.hbase.SimpleHbaseEventSerializer)按原樣將 event 主體寫入 HBase, 并可選擇增加 Hbase 中的列. 這主要是一個示例實作.

RegexHbaseEventSerializer(org.apache.flume.sink.hbase.RegexHbaseEventSerializer)根據給定的正則運算式打破 event 體, 并將每個部分寫入不同的列.

type 是 FQCN:org.apache.flume.sink.hbase.HBaseSink.

必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 hbase
table-Hbase 中要寫入的表的名稱,
ColumnFamily-Hbase 中的列族寫入,
zookeeperQuorum-法定人數規格,這是 hbase-site.xml 中屬性 hbase.zookeeper.quorum 的值
znodeParent/hbase-ROOT - 區域的 znode 的基本路徑,價值 zookeeper.znode.parent 在 HBase 的 - site.xml 中
BATCHSIZE100每個 txn 要寫入的 event 數,
coalesceIncrementsfalse如果 sink 將多個增量合并到每個批次的單元格中,如果有限數量的單元格有多個增量,這可能會提供更好的性能,
serializerorg.apache.flume.sink.hbase.SimpleHbaseEventSerializer默認增量列 =“iCol”,有效負載列 =“pCol”,
serializer.*-要傳遞給序列化程式的屬性,
kerberosPrincipal-用于訪問安全 HBase 的 Kerberos 用戶主體
kerberosKeytab-用于訪問安全 HBase 的 Kerberos 密鑰表
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = hbasea1.sinks.k1.table = foo_tablea1.sinks.k1.columnFamily = bar_cfa1.sinks.k1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializera1.sinks.k1.channel = c1HBase2 Sink

  

 


HBase2Sink 相當于 HBase 版本 2 的 HBaseSink. 提供的功能和配置引數與 HBaseSink 的情況相同(除了 sinktype 中的 hbase2 標簽和包 / 類名稱)

type 是 FQCN:org.apache.flume.sink.hbase2.HBase2Sink

必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 hbase2
table-HBase 中要寫入的表的名稱,
ColumnFamily-HBase 中的列族寫入,
zookeeperQuorum-這是 hbase-site.xml 中屬性 hbase.zookeeper.quorum 的值
znodeParent/hbase-ROOT - 區域的 znode 的基本路徑,價值 zookeeper.znode.parent 在 HBase 的 - site.xml 中
BATCHSIZE100每個 txn 要寫入的 event 數,
coalesceIncrementsfalse如果 sink 將多個增量合并到每個批次的單元格中,如果有限數量的單元格有多個增量,這可能會提供更好的性能,
serializerorg.apache.flume.sink.hbase2.SimpleHBase2EventSerializer默認增量列 =“iCol”,有效負載列 =“pCol”,
serializer.*-要傳遞給序列化程式的屬性,
kerberosPrincipal-用于訪問安全 HBase 的 Kerberos 用戶主體
kerberosKeytab-用于訪問安全 HBase 的 Kerberos 密鑰表
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = hbase2a1.sinks.k1.table = foo_tablea1.sinks.k1.columnFamily = bar_cfa1.sinks.k1.serializer = org.apache.flume.sink.hbase2.RegexHBase2EventSerializera1.sinks.k1.channel = c1AsyncHBaseSink

  

 


此 sink 使用異步模型將資料寫入 HBase. 實作由配置指定的 AsyncHbaseEventSerializer 的類用于將 event 轉換為 HBase put 和 / 或 increments. 然后將這些放置和增量寫入 HBase. 此 sink 使用 Asynchbase API https://github.com/OpenTSDB/asynchbase 寫入 HBase. 該 sink 提供與 HBase 相同的一致性保證, HBase 是當前行的原子性. 如果 Hbase 無法寫入某些 event , 則 sink 將重播該事務中的所有 event .AsyncHBaseSink 只能與 HBase 1.x 一起使用. AsyncHBaseSink 使用的異步客戶端庫不適用于 HBase 2.type 為 FQCN:org.apache.flume.sink.hbase.AsyncHBaseSink. 必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 asynchbase
table-Hbase 中要寫入的表的名稱,
zookeeperQuorum-法定人數規格,這是 hbase-site.xml 中屬性 hbase.zookeeper.quorum 的值
znodeParent/hbase-ROOT - 區域的 znode 的基本路徑,價值 zookeeper.znode.parent 在 HBase 的 - site.xml 中
ColumnFamily-Hbase 中的列族寫入,
batchSize100每個 txn 要寫入的 event 數,
coalesceIncrementsfalse如果 sink 將多個增量合并到每個批次的單元格中,如果有限數量的單元格有多個增量,這可能會提供更好的性能,
timeout60000sink 為事務中的所有 event 等待來自 hbase 的 acks 的時間長度(以毫秒為單位),
serializerorg.apache.flume.sink.hbase.SimpleAsyncHbaseEventSerializer 
serializer.*-要傳遞給序列化程式的屬性,
async.*-要傳遞給 asyncHbase 庫的屬性,這些屬性優先于舊的 zookeeperQuorum 和 znodeParent 值,您可以在 AsyncHBase 的檔案頁面中找到可用屬性的串列 & nbsp;,

請注意, 此 sink 在配置中獲取 Zookeeper Quorum 和父 znode 資訊. 可以在 flume 組態檔中指定 Zookeeper Quorum 和父節點配置. 或者, 這些配置值取自類路徑中的第一個 hbase-site.xml 檔案.

如果配置中未提供這些, 則 sink 將從類路徑中的第一個 hbase-site.xml 檔案中讀取此資訊.

Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = asynchbasea1.sinks.k1.table = foo_tablea1.sinks.k1.columnFamily = bar_cfa1.sinks.k1.serializer = org.apache.flume.sink.hbase.SimpleAsyncHbaseEventSerializera1.sinks.k1.channel = c1MorphlineSolrSink

  

此 sink 從 Flume event 中提取資料, 對其進行轉換, 并將其近乎實時地加載到 Apache Solr 服務器中, 后者又向最終用戶或搜索應用程式提供查詢.

此 sink 非常適合將原始資料流式傳輸到 HDFS(通過 HdfsSink)并同時提取, 轉換并將相同資料加載到 Solr(通過 MorphlineSolrSink)的用例. 特別是, 此 sink 可以處理來自不同資料 source 的任意異構原始資料, 并將其轉換為對搜索應用程式有用的資料模型

ETL 功能可使用 morphline 組態檔進行自定義, 該檔案定義了一系列轉換命令, 用于將 event 記錄從一個命令傳遞到另一個命令

Morphlines 可以看作是 Unix 管道的演變, 其中資料模型被推廣為使用通用記錄流, 包括任意二進制有效載荷. morphline 命令有點像 Flume 攔截器. Morphlines 可以嵌入到 Flume 等 Hadoop 組件中.

用于決議和轉換一組標準資料格式 (如日志檔案, Avro,CSV, 文本, HTML,xml,PDF,Word,Excel 等) 的命令是開箱即用的, 還有其他自定義命令和決議器用于其他資料格式可以添加為 morphline 插件. 可以索引任何 type 的資料格式, 并且可以生成任何 type 的 Solr 模式的任何 Solr 檔案, 并且可以注冊和執行任何自定義 ETL 邏輯.

Morphlines 操縱連續的記錄流. 資料模型可以描述如下: 記錄是一組命名欄位, 其中每個欄位具有一個或多個值的有序串列. 值可以是任何 Java 物件. 也就是說, 記錄本質上是一個哈希表, 其中每個哈希表條目包含一個 String 鍵和一個 Java 物件串列作為值.(該實作使用 Guava 的 ArrayListMultimap, 它是一個 ListMultimap). 請注意, 欄位可以具有多個值, 并且任何兩個記錄都不需要使用公共欄位名稱.

這個 sink 將 Flumeevent 的主體填充到_attachment_body 中記錄欄位中, 并將 Flumeevent 的標頭復制到同名的記錄欄位中. 然后命令可以對此資料執行操作.

支持路由到 SolrCloud 集群以提高可伸縮性. 索引負載可以分布在大量 MorphlineSolrSink 上, 以提高可伸縮性. 可以跨多個 MorphlineSolrSink 復制索引負載以實作高可用性, 例如使用 Flume 功能, 例如負載平衡 sink 處理器. MorphlineInterceptor 還可以幫助實作到多個 Solr 集合的動態路由(例如, 用于多租戶)

必須將環境所需的 morphline 和 Solr jar 放在 Apache Flume 安裝的 lib 目錄中.

type 是 FQCN:org.apache.flume.sink.Solr.morphline.MorphlineSolrSink

必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 org.apache.flume.sink.solr.morphline.MorphlineSolrSink
morphlineFile-本地檔案系統與 morphline 組態檔的相對或絕對路徑,示例:/etc/flume-ng/conf/morphline.conf
morphlineIdnull如果 morphline 組態檔中有多個 morphlines,則用于標識 morphline 的可選名稱
batchSize1000每個水槽事務要采取的最大 event 數,
batchDurationMillis1000每個水槽事務的最大持續時間(ms),事務在此持續時間之后或超過 batchSize 時提交,以先到者為準,
handlerClassorg.apache.flume.sink.solr.morphline.MorphlineHandlerImpl實作 org.apache.flume.sink.solr.morphline.MorphlineHandler 的類的 FQCN
isProductionModefalse應該為關鍵任務,大規模在線生產系統啟用此標志,這些系統需要在發生不可恢復的例外時無需停機即可取得進展,與未知 Solr 架構欄位相關的損壞或格式錯誤的決議器輸入資料,決議器錯誤和錯誤會產生不可恢復的例外,
recoverableExceptionClassesorg.apache.solr.client.solrj.SolrServerException以逗號分隔的可恢復例外串列,這些例外往往是暫時的,在這種情況下,可以重試相應的任務,示例包括網路連接錯誤,超時等,當生產模式標志設定為 true 時,使用此引數配置的可恢復例外將不會被忽略,因此將導致重試,
isIgnoringRecoverableExceptionsfalse如果不可恢復的例外被意外錯誤分類為可恢復,則應啟用此標志,這使得 sink 能夠取得進展并避免永遠重試 event ,
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = org.apache.flume.sink.Solr.morphline.MorphlineSolrSinka1.sinks.k1.channel = c1a1.sinks.k1.morphlineFile = /etc/flume-ng/conf/morphline.conf# a1.sinks.k1.morphlineId = morphline1# a1.sinks.k1.batchSize = 1000# a1.sinks.k1.batchDurationMillis = 1000ElasticSearchSink

  

 


此 sink 將資料寫入彈性搜索集群. 默認情況下, 將寫入 event 以便 Kibana http://kibana.org/ 圖形界面可以顯示它們 - 就像 logstash 一樣 https://logstash.net/ 撰寫它們一樣

必須將環境所需的 Elasticsearch 和 lucene-core jar 放在 Apache Flume 安裝的 lib 目錄中. Elasticsearch 要求客戶端 JAR 的主要版本與服務器的主要版本匹配, 并且兩者都運行相同的 JVM 次要版本. 如果這不正確, 將出現 SerializationExceptions. 要選擇所需的版本, 請首先確定 Elasticsearch 的版本以及目標群集正在運行的 JVM 版本. 然后選擇與主要版本匹配的 Elasticsearch 客戶端庫.0.19.x 客戶端可以與 0.19.x 群集通信; 0.20.x 可以與 0.20.x 對話, 0.90.x 可以與 0.90.x 對話. 確定 Elasticsearch 版本后, 讀取 pom.xml 檔案以確定要使用的正確 lucene-core JAR 版本.

event 將每天寫入新索引. 名稱將是 < indexName> -yyyy-MM-dd, 其中 < indexName > 是 indexName 引數. sink 將在午夜 UTC 開始寫入新索引.

默認情況下, ElasticSearchLogStashEventSerializer 會為彈性搜索序列化 event . 可以使用 serializer 引數覆寫此行為. 此引數接受 org.apache.flume.sink.Elasticsearch.ElasticSearchEventSerializer 或 org.apache.flume.sink.Elasticsearch.ElasticSearchIndexRequestBuilderFactory 的實作. 不推薦使用 ElasticSearchEventSerializer 來支持更強大的 ElasticSearchIndexRequestBuilderFactory

type 是 FQCN:org.apache.flume.sink.Elasticsearch.ElasticSearchSink

必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是 org.apache.flume.sink.elasticsearch.ElasticSearchSink
hostname-逗號分隔的 hostname:port 串列,如果埠不存在,將使用默認埠'9300'
indexNameflume將附加日期的索引的名稱,示例'flume' - >'flume-yyyy-MM-dd'支持任意標題替換,例如,%{header} 替換為命名 event 標頭的值
indexTypelogs索引檔案的 type,默認為'log'支持任意標頭替換,例如,%{header} 替換為命名 event 標頭的值
clusterNameelasticsearch要連接的 ElasticSearch 集群的名稱
batchSize100每個 txn 要寫入的 event 數,
ttl-TTL 以天為單位,設定時會導致過期檔案自動洗掉,如果沒有設定,檔案將永遠不會被自動洗掉,TTL 在早期的整數形式中都被接受,例如 a1.sink.k1.ttl = 5,還有限定符 ms(毫秒),s(秒),m(分鐘),h(小時),d(天)和 w(周),示例 a1.sink.k1.ttl = 5d 將 TTL 設定為 5 天,按照 < a href="http://www.elasticsearch.org/guide/reference/mapping/ttl-field/以獲取更多資訊," ztid="2867" ow="472" oh="36">http://www.elasticsearch.org/guide/reference/mapping/ttl-field / 以獲取更多資訊,
serializerorg.apache.flume.sink.elasticsearch.ElasticSearchLogStashEventSerializer要使用的 ElasticSearchIndexRequestBuilderFactory 或 ElasticSearchEventSerializer,接受任一類的實作,但首選 ElasticSearchIndexRequestBuilderFactory,
serializer.*-要傳遞給序列化程式的屬性,

注意

使用標頭替換可以方便地使用 event 標頭的值來動態決定在存盤 event 時要使用的 indexName 和 indexType. 使用此功能時應謹慎, 因為 event 提交者現在可以控制 indexName 和 indexType. 此外, 如果使用 Elasticsearch REST 客戶端, 則 event 提交者可以控制所使用的 URL 路徑

Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = Elasticsearcha1.sinks.k1.hostNames = 127.0.0.1:9200,127.0.0.2:9300a1.sinks.k1.indexName = foo_indexa1.sinks.k1.indexType = bar_typea1.sinks.k1.clusterName = foobar_clustera1.sinks.k1.batchSize = 500a1.sinks.k1.ttl = 5da1.sinks.k1.serializer = org.apache.flume.sink.Elasticsearch.ElasticSearchDynamicSerializera1.sinks.k1.channel = c1Kite Dataset Sink

  

將 event 寫入 Kite 資料集的 http://kitesdk.org/docs/current/guide/ 實驗 sink. 此 sink 將反序列化每個傳入 event 的主體, 并將結果記錄存盤在風箏資料集中. 它通過按 URI 加載資料集來確定目標資料集.

唯一支持的序列化的 Avro 和記錄模式必須在 event 標題使用或者被通過, flume.avro.schema.literal 與 JSON 模式表示或 flume.avro.schema.url 有一個網址, 該模式可能會發現(hdfs:/ ... 支持 URI). 這與使用 deserializer.schemaType = LITERAL 的 Log4jAppender 水槽客戶端和 false 脫機目錄 source 的 Avro 反序列化器 兼容.

注 1: 不支持 flume.avro.schema.hash 標頭. 注意 2: 在某些情況下, 在超過滾動間隔后可能會略微發生檔案滾動. 但是, 此延遲不會超過 5 秒. 在大多數情況下, 延遲是可以忽略的.

屬性名稱默認描述
channel- 
type-必須是 org.apache.flume.sink.kite.DatasetSink
kite.dataset.uri-要打開的資料集的 URI
kite.repo.uri-要打開的存盤庫的 URI(不建議使用; 請改用 kite.dataset.uri)
kite.dataset.namespace-資料集的命名空間,其中將寫入記錄(不建議使用; 請改用 kite.dataset.uri)
kite.dataset.name-將寫入記錄的資料集的名稱(不建議使用; 請改用 kite.dataset.uri)
kite.batchSize100每批中要處理的記錄數
kite.rollInterval30釋放資料檔案之前的最長等待時間(秒)
kite.flushable.commitOnBatchtrue如果為 true,將提交 Flume 事務,并在每批 kite.batchSize  記錄上重繪 writer,此設定僅適用于可重繪資料集,如果為 & nbsp;true,則可以將具有提交資料的臨時檔案保留在資料集目錄中,需要手動恢復這些檔案,以使資料對 DatasetReaders 可見,
kite.syncable.syncOnBatchtrue控制 sink 在提交事務時是否也將同步資料,此設定僅適用于可同步資料集,同步 gaurentees 資料將寫入遠程系統上的穩定存盤,同時只重繪資料已離開 Flume 的客戶端緩沖區的 gaurentees,當 kite.flushable.commitOnBatch 屬性設定為 false 時,此屬性也必須設定為 false,
kite.entityParserAvro 將 Flume Events 變為 Kite 物體的 Parser ,有效值是 avro 和 EntityParser.Builder 介面的實作的完全限定類名,
kite.failurePolicyretry政策處理不可恢復的錯誤,如缺少 & nbsp; 架構在 event 頭,默認值 retry 將使當前批處理失敗,并再次嘗試與舊行為匹配,其他有效值是保存,這將寫原始 event 到 kite.error.dataset.uri 資料集,以及一個實作的完全限定類名 FailurePolicy.Builder 介面,
kite.error.dataset.uri-當 kite.failurePolicy 設定為 save 時,保存失敗 event 的資料集的 URI ,需要的時候 kite.failurePolicy 設定為保存,
auth.kerberosPrincipal-用于 HDFS 安全身份驗證的 Kerberos 用戶主體
auth.kerberosKeytab-主體的 Kerberos keytab 位置(本地 FS)
auth.proxyUser-HDFS 操作的有效用戶,如果與 kerberos 主體不同

Kafka Sink

這是一個 Flume Sink 實作, 可以將資料發布到 Kafka http://kafka.apache.org/ 主題. 其中一個目標是將 Flume 與 Kafka 集成, 以便基于拉的處理系統可以處理來自各種 Flume source 的資料.

這目前支持 Kafka 服務器版本 0.10.1.0 或更高版本. 測驗完成了 2.0.1, 這是發布時最高的可用版本

必需屬性以粗體字體標記

屬性名稱默認描述
type-必須設定為 org.apache.flume.sink.kafka.KafkaSink
kafka.bootstrap.servers-Kafka-Sink 將連接到的經紀人串列,以獲取主題磁區串列這可以是經紀人的部分串列,但我們建議至少兩個用于 HA,格式為逗號分隔的 hostname:port 串列
kafka.topicdefault-flume-topicKafka 中將發布訊息的主題,如果配置了此引數,則會將訊息發布到此主題,如果 event 標頭包含 “主題” 欄位,則 event 將發布到該主題,從而覆寫此處配置的主題,支持任意頭部替換,例如,%{header}將替換為名為 “header” 的 event 標頭的值,(如果使用替換,建議將 Kafka agent 的 “auto.create.topics.enable” 屬性設定為 true,)
flumeBatchSize100一批中要處理的訊息數,較大批量可提高吞吐量,同時增加延遲,
kafka.producer.acks1在考慮成功寫入之前,有多少副本必須確認訊息,接受的值為 0(從不等待確認),1(僅等待前導),-1(等待所有副本)將此值設定為 - 1,以避免在某些領導失敗的情況下丟失資料,
useFlumeEventFormatfalse默認情況下,event 直接從 event 主體作為位元組放到 Kafka 主題上,設定為 true 以將 event 存盤為 Flume Avro 二進制格式,與 KafkaSource 上的相同屬性或 Kafka Channel 上的 parseAsFlumeEvent 屬性一起使用時,這將保留生成端的任何 Flume 頭,
defaultPartitionId-指定要發送到此 channel 中的所有 event 的 Kafka 磁區 ID(整數),除非被 partitionIdHeader 覆寫,默認情況下,如果未設定此屬性,則 event 將由 Kafka Producer 的磁區程式分發 - 包括按鍵(如果指定)(或由 kafka.partitioner.class 指定的磁區程式),
partitionIdHeader-設定后,sink 將使用 event 標頭中使用此屬性的值命名的欄位的值,并將訊息發送到主題的指定磁區,如果該值表示無效磁區,則將拋出 EventDeliveryException,如果存在標頭值,則此設定將覆寫 defaultPartitionId,
allowTopicOverridetrue設定后,sink 將允許將訊息生成到 topicHeader 屬性指定的主題中(如果提供),
topicHeadertopic當與 allowTopicOverride 一起設定時,將生成一個訊息,該訊息將使用此屬性的值命名為標頭的值,與 Kafka Source topicHeader 屬性一起使用時應小心,以避免創建環回,
kafka.producer.security.protocolPLAINTEXT如果使用某種級別的安全性寫入 Kafka,則設定為 SASL_PLAINTEXT,SASL_SSL 或 SSL,有關安全設定的其他資訊,請參見下文,
more producer security props 如果使用 SASL_PLAINTEXT,則 SASL_SSL 或 SSL 會參考 Kafka 安全性以獲取需要在生產者上設定的其他屬性,
其他 Kafka Producer Properties-這些屬性用于配置 Kafka Producer,可以使用 Kafka 支持的任何生產者屬性,唯一的要求是使用前綴 kafka.producer 添加屬性名稱 & nbsp;,例如:kafka.producer.linger.ms

注意

Kafka Sink 使用 Flume Event 標頭中的 topic 和 key 屬性將 event 發送到 Kafka. 如果 topic 中存在 headers , 則會將 event 發送到該特定 topic, 從而覆寫為 Sink 配置的主題. 如果 key 在 topic 存在, 關鍵還是使用 Kafkatopic 磁區磁區資料. 具有相同密鑰的 event 將發送到同一磁區. 如果密鑰為空, 則將 event 發送到隨機磁區.

Kafka sink 還為 key.serializer(org.apache.kafka.common.serialization.StringSerializer)和 value.serializer(org.apache.kafka.common.serialization.ByteArraySerializer)

提供默認值. 不建議修改這些引數

不推薦使用的屬性:

屬性名稱默認描述
brokerList-使用 kafka.bootstrap.servers
topicdefault-flume-topic使用 kafka.topic
BATCHSIZE100使用 kafka.flumeBatchSize
requiredAcks1使用 kafka.producer.acks

下面給出 Kafka sink 的示例配置. 以 kafka 生產者前綴 kafka.producer 開頭的屬性. 創建 Kafka 生成器時傳遞的屬性不限于此示例中給出的屬性. 此外, 可以在此處包含您的自定義屬性, 并通過作為方法引數傳入的 Flume Context 物件在前處理器中訪問它們.

a1.sinks.k1.channel = c1a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSinka1.sinks.k1.kafka.topic = mytopica1.sinks.k1.kafka.Bootstrap.servers = localhost:9092a1.sinks.k1.kafka.flumeBatchSize = 20a1.sinks.k1.kafka.producer.acks = 1a1.sinks.k1.kafka.producer.linger.ms = 1a1.sinks.k1.kafka.producer.compression.type = snappy

  

安全和 Kafka Sink

Flume 和 Kafka 之間的通信 channel 支持安全認證和資料加密. 對于安全身份驗證, 可以使用 Kafka 0.9.0 版中的 SASL / GSSAPI(Kerberos V5)或 SSL(即使該引數名為 SSL, 實際協議是 TLS 實作)

截至目前, 資料加密僅由 SSL / TLS 提供.

將 kafka.producer.security.protocol 設定為以下任何值意味著:

SASL_PLAINTEXT - 無資料加密的 Kerberos 或純文本身份驗證

SASL_SSL - 使用資料加密的 Kerberos 或純文本身份驗證

SSL - 基于 TLS 的加密, 帶有可選的身份驗證

警告

啟用 SSL 時性能會下降, 其大小取決于 CPUtype 和 JVM 實作. 參考: Kafka 安全概述 和跟蹤此問題的 jira: https://issues/jira/browse/KAFKA-2561

TLS 和 Kafka Sink:

請閱讀配置 Kafka 客戶端 SSL 中描述的步驟, 以了解用于微調的其他配置設定, 例如以下任何一項: 安全提供程式, 密碼套件, 啟用的協議, 信任庫或密鑰庫 type.

配置服務器端身份驗證和資料加密的示例.

在此處指定信任庫是可選的, 可以使用全域信任庫. 有關全域 SSL 設定的更多詳細資訊, 請參閱 SSL / TLS 支持部分.

注意: 默認情況下, 未定義屬性 ssl.endpoint.identification.algorithm, 因此不會執行 hostname 驗證. 要啟用 hostname 驗證, 請設定以下屬性

a1.sinks.sink1.kafka.producer.ssl.endpoint.identification.algorithm = HTTPS

啟用后, 客戶端將根據以下兩個欄位之一驗證服務器的完全限定域名(FQDN):

通用名稱(CN) https://tools.ietf.org/html/rfc6125#section-2.3 https://tools.ietf.org/html/rfc6125#section-2.3

主題備選名稱(SAN)

如果還需要客戶端身份驗證, 則還需要將以下內容添加到 Flume agent 配置中, 或者可以使用全域 SSL 設定(請參閱 SSL / TLS 支持部分). 每個 Flume agent 都必須擁有其客戶證書, Kafka 經紀人必須單獨或通過其簽名鏈來信任. 常見示例是由單個根 CA 簽署每個客戶端證書, 而后者又由 Kafka 經紀人信任

# optional, the global keystore can be used alternativelya1.sinks.sink1.kafka.producer.ssl.keystore.location = /path/to/client.keystore.jksa1.sinks.sink1.kafka.producer.ssl.keystore.password = <password to access the keystore>

  

如果密鑰庫和密鑰使用不同的密碼保護, 則 ssl.key.password 屬性將為生產者密鑰庫提供所需的額外密鑰

a1.sinks.sink1.kafka.producer.ssl.key.password = <password to access the key>

Kerberos 和 Kafka Sink

要將 Kafkasink 與使用 Kerberos 保護的 Kafka 集群一起使用, 請為生產者設定上面提到的 producer.security.protocol 屬性. 與 Kafka agent 一起使用的 Kerberos 密鑰表和主體在 JAAS 檔案的 "KafkaClient" 部分中指定."客戶端" 部分描述了 Zookeeper 連接(如果需要). 有關 JAAS 檔案內容的資訊, 請參閱 Kafka doc. 可以通過 flume-env.sh 中的 JAVA_OPTS 指定此 JAAS 檔案的位置以及可選的系統范圍的 kerberos 配置:

JAVA_OPTS="$JAVA_OPTS -Djava.security.krb5.conf=/path/to/krb5.conf"JAVA_OPTS="$JAVA_OPTS -Djava.security.auth.login.config=/path/to/flume_jaas.conf"

 

使用 SASL_PLAINTEXT 的示例安全配置:

a1.sinks.sink1.type = org.apache.flume.sink.kafka.KafkaSinka1.sinks.sink1.kafka.Bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093a1.sinks.sink1.kafka.topic = mytopica1.sinks.sink1.kafka.producer.security.protocol = SASL_PLAINTEXTa1.sinks.sink1.kafka.producer.sasl.mechanism = GSSAPIa1.sinks.sink1.kafka.producer.sasl.kerberos.service.name = kafka

  

使用 SASL_SSL 的安全配置示例:

a1.sinks.sink1.type = org.apache.flume.sink.kafka.KafkaSinka1.sinks.sink1.kafka.Bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093a1.sinks.sink1.kafka.topic = mytopica1.sinks.sink1.kafka.producer.security.protocol = SASL_SSLa1.sinks.sink1.kafka.producer.sasl.mechanism = GSSAPIa1.sinks.sink1.kafka.producer.sasl.kerberos.service.name = kafka# optional, the global truststore can be used alternativelya1.sinks.sink1.kafka.producer.ssl.truststore.location = /path/to/truststore.jksa1.sinks.sink1.kafka.producer.ssl.truststore.password = <password to access the truststore>

  

示例 JAAS 檔案. 有關其內容的參考, 請參閱 SASL 配置的 Kafka 檔案中所需認證機制 (GSSAPI / PLAIN) 的客戶端配置部分. 與 Kafka Source 或 Kafka Channel 不同, 不需要 "Client" 部分, 除非其他連接組件需要它. 另外, 請確保 Flume 行程的作業系統用戶對 jaas 和 keytab 檔案具有讀權限.

KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=truekeyTab="/path/to/keytabs/flume.keytab"principal="flume/flumehost1.example.com@YOURKERBEROSREALM";};HTTP Sink

  

此 sink 的行為是它將從 channel 獲取 event , 并使用 HTTP POST 請求將這些 event 發送到遠程服務. event 內容作為 POST 正文發送

此 sink 的錯誤處理行為取決于目標服務器回傳的 HTTP 回應. sink 退避 / 就緒狀態是可配置的, 事務提交 / 回滾結果以及 event 是否有助于成功的 event 排放計數也是可配置的

狀態代碼不可讀的服務器回傳的任何格式錯誤的 HTTP 回應都將導致退避信號, 并且不會從該 channel 中消耗該 event

必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱需要為 http,
endpoint-POST 到的完全限定的 URL 端點
connectTimeout5000套接字 connect-timeout(以毫秒為單位)
request-timeout5000最大請求處理時間(以毫秒為單位)
contentTypeHeadertext/plainHTTP Content-Type 標頭
acceptHeadertext/plainHTTP Accept 標頭值
defaultBackofftrue是否在接收所有 HTTP 狀態代碼時默認退避
defaultRollbacktrue是否在接收所有 HTTP 狀態代碼時默認回滾
defaultIncrementMetricsfalse是否在接收所有 HTTP 狀態代碼時默認增加指標
backoff.CODE-為個人(即 200)代碼或組(即 2XX)代碼配置特定退避
rollback.CODE-為單個(即 200)代碼或組(即 2XX)代碼配置特定回滾
incrementMetrics.CODE-配置單個(即 200)代碼或組(即 2XX)代碼的特定度量增量

請注意, 最具體的 HTTP 狀態代碼匹配用于 backoff,rollback 和 incrementMetrics 配置選項. 如果存在 2XX 和 200 狀態代碼的配置值, 則 200 個 HTTP 代碼將使用 200 值, 而 201-299 范圍內的所有其他 HTTP 代碼將使用 2XX 值.

消耗任何慷訓空 event 而不向 HTTP 端點發出任何請求.

Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = httpa1.sinks.k1.channel = c1a1.sinks.k1.endpoint = http://localhost:8080/someuria1.sinks.k1.connectTimeout = 2000a1.sinks.k1.requestTimeout = 2000a1.sinks.k1.acceptHeader = application/JSONa1.sinks.k1.contentTypeHeader = application/JSONa1.sinks.k1.defaultBackoff = truea1.sinks.k1.defaultRollback = truea1.sinks.k1.defaultIncrementMetrics = falsea1.sinks.k1.backoff.4XX = falsea1.sinks.k1.rollback.4XX = falsea1.sinks.k1.incrementMetrics.4XX = truea1.sinks.k1.backoff.200 = falsea1.sinks.k1.rollback.200 = falsea1.sinks.k1.incrementMetrics.200 = trueCustom Sink

  

自定義 sink 是您自己的 Sink 介面實作. 啟動 Flume agent 程式時, 必須在 agent 程式的類路徑中包含自定義 sink 的類及其依賴項.自定義 sink 的 type 是其 FQCN. 必需屬性以粗體顯示

屬性名稱默認描述
channel- 
type-組件 type 名稱,需要是您的 FQCN
Example for agent named a1:a1.channels = c1a1.sinks = k1a1.sinks.k1.type = org.example.MySinka1.sinks.k1.channel = c1Flume Channels

  

 


channel 是 event 在 agent 上暫存的存盤庫. Source 添加 event ,Sink 洗掉它.

Memory Channel

event 存盤在具有可配置最大大小的記憶體中佇列中. 它非常適合需要更高吞吐量的流量, 并且在 agent 發生故障時準備丟失分階段資料. 必需屬性以粗體顯示

屬性名稱默認描述
type-組件 type 名稱,需要是 & nbsp;memory
capacity100channel 中存盤的最大 event 數
transactionCapacity100每個事務 channel 從 source 或提供給 sink 的最大 event 數
keep-alive3添加或洗掉 event 的超時(以秒為單位)
byteCapacityBufferPercentage20定義 byteCapacity 與 channel 中所有 event 的估計總大小之間的緩沖區百分比,以計算標頭中的資料,見下文,
byteCapacity見說明允許的最大記憶體總位元組數,作為此 channel 中所有 event 的總和,該實作僅計算 Event  主體,這也是提供 byteCapacityBufferPercentage 配置引數的原因,默認值為計算值,等于 JVM 可用的最大記憶體的 80%(即命令列傳遞的 - Xmx 值的 80%),請注意,如果在單個 JVM 上有多個記憶體 channel,并且它們碰巧保持相同的物理 event (即,如果您使用來自單個 source 的復制 channel 選擇器),那么這些 event 大小可能會被重復計算以用于 channelbyteCapacity 目的,將此值設定為 0 將導致此值回退到大約 200 GB 的內部硬限制,
Example for agent named a1:a1.channels = c1a1.channels.c1.type = memorya1.channels.c1.capacity = 10000a1.channels.c1.transactionCapacity = 10000a1.channels.c1.byteCapacityBufferPercentage = 20a1.channels.c1.byteCapacity = 800000JDBC Channel

  

 


event 存盤在由資料庫支持的持久存盤中. JDBC Channel 當前支持嵌入式 Derby. 這是一個持久的 channel, 非常適合可恢復性很重要的流程. 必需屬性以粗體顯示

屬性名稱默認描述
type-組件 type 名稱,需要是 & nbsp;  jdbc
db.typeDERBY資料庫供應商需要是 DERBY,
driver.classorg.apache.derby.jdbc.EmbeddedDriver供應商的 JDBC 驅動程式的類
driver.url(由其他屬性建造)JDBC 連接 URL
db.username“sa”資料庫連接的用戶標識
db.password-資料庫連接的密碼
connection.properties.file-JDBC 連接屬性檔案路徑
create.schematrue如果為 true,則創建 db 模式(如果不存在)
create.indextrue創建索引以加快查找速度
create.foreignkeytrue 
transaction.isolation“READ_COMMITTED”db 會話的隔離級別 READ_UNCOMMITTED,READ_COMMITTED,SERIALIZABLE,REPEATABLE_READ
maximum.connections10允許 db 的最大連接數
最大容量0(無限制)channel 中的最大 event 數
sysprop,* 資料庫供應商特定屬性
sysprop.user.home 存盤嵌入式 Derby 資料庫的主路徑

 

Example for agent named a1:a1.channels = c1a1.channels.c1.type = jdbcKafka Channel

  


event 存盤在 Kafka 群集中(必須單獨安裝).Kafka 提供高可用性和復制, 因此如果 agent 或 kafka agent 崩潰, event 可立即用于其他 sinks

Kafka 頻道可用于多種場景:

使用 Flume source 和 sink - 它為 event 提供了可靠且高度可用的 channel

使用 Flume source 和攔截器但沒有 sink - 它允許將 Flumeevent 寫入 Kafka 主題, 供其他應用程式使用

使用 Flume sink, 但沒有 source - 它是一種低延遲, 容錯的方式將 event 從 Kafka 發送到 Flumesink, 如 HDFS,HBase 或 Solr

這目前支持 Kafka 服務器版本 0.10.1.0 或更高版本. 測驗完成了 2.0.1, 這是發布時最高的可用版本.

配置引陣列織如下:

通常與 channel 相關的配置值應用于 channel 配置級別, 例如: a1.channel.k1.type =

與 Kafka 相關的配置值或 Channel 運行的前綴以 "kafka." 為前綴(這對 CommonClient Configs 是有效的), 例如: a1.channel.k1.kafka.topic 和 a1.channel.k1.kafka.Bootstrap.servers. 這與 hdfssink 的運行方式沒有什么不同

特定于生產者 / 消費者的屬性以 kafka.producer 或 kafka.consumer 為前綴

在可能的情況下, 使用 Kafka 引數名稱, 例如: Bootstrap.servers 和 acks

此版本的 flume 與以前的版本向后兼容, 但是下表中顯示了已棄用的屬性, 并且在組態檔中存在時會在啟動時記錄警告訊息.

必需屬性以粗體顯示

屬性名稱默認描述
type-組件 type 名稱,需要是 org.apache.flume.channel.kafka.KafkaChannel
kafka.bootstrap.servers-channel 使用的 Kafka 集群中的經紀商串列這可以是經紀人的部分串列,但我們建議至少兩個用于 HA,格式為逗號分隔的 hostname:port 串列
kafka.topic水槽溝道頻道將使用的 Kafka 主題
kafka.consumer.group.id水槽channel 用于向 Kafka 注冊的消費者群組 ID,多個 channel 必須使用相同的主題和組,以確保當一個 agent 程式發生故障時,另一個 agent 程式可以獲取資料請注意,具有相同 ID 的非 channel 使用者可能會導致資料丟失,
parseAsFlumeEvent真正期望在頻道中使用 FlumeEvent 架構的 Avro 基準,如果 Flume source 寫入 channel,則應該為 true; 如果其他生成器正在寫入 channel 正在使用的主題,則應為 false,通過使用 flume-ng-sdk 工件提供的 org.apache.flume.source.avro.AvroFlumeEvent,可以在 Flume 之外決議到 Kafka 的 Flume source 訊息
的 pollTimeout500在消費者的 “poll()” 呼叫中等待的時間量(以毫秒為單位),https://kafka.apache.org/090/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#poll(long)
defaultPartitionId-指定要發送到此 channel 中的所有 event 的 Kafka 磁區 ID(整數),除非被 partitionIdHeader 覆寫,默認情況下,如果未設定此屬性,則 event 將由 Kafka Producer 的磁區程式分發 - 包括按鍵(如果指定)(或由 kafka.partitioner.class 指定的磁區程式),
partitionIdHeader-設定時,生產者將從 event 頭中獲取使用此屬性的值命名的欄位的值,并將訊息發送到主題的指定磁區,如果該值表示無效磁區,則該 event 將不被接受,如果存在標頭值,則此設定將覆寫 defaultPartitionId,
kafka.consumer.auto.offset.reset最新當 Kafka 中沒有初始偏移量或服務器上當前偏移量不再存在時(例如因為該資料已被洗掉)該怎么辦:最早:自動將偏移量重置為最早的最新偏移量:自動重置偏移量到最新的偏移量無:如果沒有為消費者的組找到任何其他偏移量,則向消費者拋出例外:向消費者拋出例外,
kafka.producer.security.protocol純文本如果使用某種級別的安全性寫入 Kafka,則設定為 SASL_PLAINTEXT,SASL_SSL 或 SSL,有關安全設定的其他資訊,請參見下文,
kafka.consumer.security.protocol純文本與 kafka.producer.security.protocol 相同,但是用于從 Kafka 閱讀 / 消費,
更多生產者 / 消費者安全道具 如果使用 SASL_PLAINTEXT,則 SASL_SSL 或 SSL 會參考 Kafka 安全性以獲取需要在生產者 / 消費者上設定的其他屬性,

不推薦使用的屬性:

屬性名稱默認描述
brokerList-channel 使用的 Kafka 集群中的經紀商串列這可以是經紀人的部分串列,但我們建議至少兩個用于 HA,格式為逗號分隔的 hostname:port 串列
話題水槽溝道使用 kafka.topic
的 groupId水槽使用 kafka.consumer.group.id
readSmallestOffsetfalse使用 kafka.consumer.auto.offset.reset
migrateZookeeperOffsets真正如果找不到 Kafka 存盤的偏移量,請在 Zookeeper 中查找偏移量并將它們提交給 Kafka,這應該是支持從舊版本的 Flume 無縫 Kafka 客戶端遷移,遷移后,可以將其設定為 false,但通常不需要這樣做,如果未找到 Zookeeper 偏移量,則 kafka.consumer.auto.offset.reset 配置定義如何處理偏移量,

注意

Example for agent named a1:a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannela1.channels.channel1.kafka.Bootstrap.servers = kafka-1:9092,kafka-2:9092,kafka-3:9092a1.channels.channel1.kafka.topic = channel1a1.channels.channel1.kafka.consumer.group.id = flume-consumer

  

安全和 Kafka 頻道:

Flume 和 Kafka 之間的通信 channel 支持安全認證和資料加密. 對于安全身份驗證, 可以使用 Kafka 0.9.0 版中的 SASL / GSSAPI(Kerberos V5)或 SSL(即使該引數名為 SSL, 實際協議是 TLS 實作)

截至目前, 資料加密僅由 SSL / TLS 提供

將 kafka.producer | consumer.security.protocol 設定為以下任何值意味著:

SASL_PLAINTEXT - 無資料加密的 Kerberos 或純文本身份驗證

SASL_SSL - 使用資料加密的 Kerberos 或純文本身份驗證

SSL - 基于 TLS 的加密, 帶有可選的身份驗證.

警告

啟用 SSL 時性能會下降, 其大小取決于 CPUtype 和 JVM 實作. 參考: Kafka 安全概述 和跟蹤此問題的 jira: https://issues/jira/browse/KAFKA-2561

** TLS 和 Kafka 頻道:**

請閱讀配置 Kafka 客戶端 SSL 中描述的步驟 以了解用于微調的其他配置設定, 例如以下任何一項: 安全提供程式, 密碼套件, 啟用的協議, 信任庫或密鑰庫 type.

配置服務器端身份驗證和資料加密的示例.

a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannela1.channels.channel1.kafka.Bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093a1.channels.channel1.kafka.topic = channel1a1.channels.channel1.kafka.consumer.group.id = flume-consumera1.channels.channel1.kafka.producer.security.protocol = SSL# optional, the global truststore can be used alternativelya1.channels.channel1.kafka.producer.ssl.truststore.location = /path/to/truststore.jksa1.channels.channel1.kafka.producer.ssl.truststore.password = <password to access the truststore>a1.channels.channel1.kafka.consumer.security.protocol = SSL# optional, the global truststore can be used alternativelya1.channels.channel1.kafka.consumer.ssl.truststore.location = /path/to/truststore.jksa1.channels.channel1.kafka.consumer.ssl.truststore.password = <password to access the truststore>

  

在此處指定信任庫是可選的, 可以使用全域信任庫. 有關全域 SSL 設定的更多詳細資訊, 請參閱 SSL / TLS 支持部分.

注意: 默認情況下, 未定義屬性 ssl.endpoint.identification.algorithm, 因此不會執行 hostname 驗證. 要啟用 hostname 驗證, 請設定以下屬性

  1. a1.channels.channel1.kafka.producer.ssl.endpoint.identification.algorithm = HTTPS
  2. a1.channels.channel1.kafka.consumer.ssl.endpoint.identification.algorithm = HTTPS

啟用后, 客戶端將根據以下兩個欄位之一驗證服務器的完全限定域名(FQDN):

通用名稱(CN) https://tools.ietf.org/html/rfc6125#section-2.3 https://tools.ietf.org/html/rfc6125#section-2.3

主題備選名稱(SAN)

如果還需要客戶端身份驗證, 則還需要將以下內容添加到 Flume agent 配置中, 或者可以使用全域 SSL 設定(請參閱 SSL / TLS 支持部分). 每個 Flume agent 都必須擁有其客戶證書, Kafka 經紀人必須單獨或通過其簽名鏈來信任. 常見示例是由單個根 CA 簽署每個客戶端證書, 而后者又由 Kafka 經紀人信任.

# optional, the global keystore can be used alternativelya1.channels.channel1.kafka.producer.ssl.keystore.location = /path/to/client.keystore.jksa1.channels.channel1.kafka.producer.ssl.keystore.password = <password to access the keystore># optional, the global keystore can be used alternativelya1.channels.channel1.kafka.consumer.ssl.keystore.location = /path/to/client.keystore.jksa1.channels.channel1.kafka.consumer.ssl.keystore.password = <password to access the keystore>

  

如果密鑰庫和密鑰使用不同的密碼保護, 則 ssl.key.password 屬性將為使用者和生產者密鑰庫提供所需的額外密鑰:

a1.channels.channel1.kafka.producer.ssl.key.password = <password to access the key>a1.channels.channel1.kafka.consumer.ssl.key.password = <password to access the key>

  

** Kerberos 和 Kafka 頻道:**

要將 Kafkachannel 與使用 Kerberos 保護的 Kafka 群集一起使用, 請為生產者和 / 或使用者設定上面提到的 producer / consumer.security.protocol 屬性. 與 Kafka agent 一起使用的 Kerberos 密鑰表和主體在 JAAS 檔案的 "KafkaClient" 部分中指定."客戶端" 部分描述了 Zookeeper 連接(如果需要). 有關 JAAS 檔案內容的資訊, 請參閱 Kafka doc. 可以通過 flume-env.sh 中的 JAVA_OPTS 指定此 JAAS 檔案的位置以及可選的系統范圍的 kerberos 配置:

JAVA_OPTS="$JAVA_OPTS -Djava.security.krb5.conf=/path/to/krb5.conf"JAVA_OPTS="$JAVA_OPTS -Djava.security.auth.login.config=/path/to/flume_jaas.conf"

 

使用 SASL_PLAINTEXT 的示例安全配置:

a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannela1.channels.channel1.kafka.Bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093a1.channels.channel1.kafka.topic = channel1a1.channels.channel1.kafka.consumer.group.id = flume-consumera1.channels.channel1.kafka.producer.security.protocol = SASL_PLAINTEXTa1.channels.channel1.kafka.producer.sasl.mechanism = GSSAPIa1.channels.channel1.kafka.producer.sasl.kerberos.service.name = kafkaa1.channels.channel1.kafka.consumer.security.protocol = SASL_PLAINTEXTa1.channels.channel1.kafka.consumer.sasl.mechanism = GSSAPIa1.channels.channel1.kafka.consumer.sasl.kerberos.service.name = kafka

  

使用 SASL_SSL 的安全配置示例:

a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannela1.channels.channel1.kafka.Bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093a1.channels.channel1.kafka.topic = channel1a1.channels.channel1.kafka.consumer.group.id = flume-consumera1.channels.channel1.kafka.producer.security.protocol = SASL_SSLa1.channels.channel1.kafka.producer.sasl.mechanism = GSSAPIa1.channels.channel1.kafka.producer.sasl.kerberos.service.name = kafka# optional, the global truststore can be used alternativelya1.channels.channel1.kafka.producer.ssl.truststore.location = /path/to/truststore.jksa1.channels.channel1.kafka.producer.ssl.truststore.password = <password to access the truststore>a1.channels.channel1.kafka.consumer.security.protocol = SASL_SSLa1.channels.channel1.kafka.consumer.sasl.mechanism = GSSAPIa1.channels.channel1.kafka.consumer.sasl.kerberos.service.name = kafka# optional, the global truststore can be used alternativelya1.channels.channel1.kafka.consumer.ssl.truststore.location = /path/to/truststore.jksa1.channels.channel1.kafka.consumer.ssl.truststore.password = <password to access the truststore>

  

示例 JAAS 檔案. 有關其內容的參考, 請參閱 SASL 配置的 Kafka 檔案中所需認證機制 (GSSAPI / PLAIN) 的客戶端配置部分. 由于 Kafka Source 也可能連接到 Zookeeper 以進行偏移遷移, 因此 "Client" 部分也添加到此示例中. 除非您需要偏移遷移, 否則不需要這樣做, 或者您需要此部分用于其他安全組件. 另外, 請確保 Flume 行程的作業系統用戶對 jaas 和 keytab 檔案具有讀權限.

Client {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=truekeyTab="/path/to/keytabs/flume.keytab"principal="flume/flumehost1.example.com@YOURKERBEROSREALM";};KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=truekeyTab="/path/to/keytabs/flume.keytab"principal="flume/flumehost1.example.com@YOURKERBEROSREALM";};File Channel

  

必需屬性以粗體顯示

屬性名稱默認值描述 
type-組件 type 名稱,需要是 & nbsp; file ,
checkpointDir~/.flume/file-channel/checkpoint將存盤檢查點檔案的目錄
useDualCheckpointsfalse備份檢查點,如果將其設定為 true,則 & nbsp; 必須設定 backupCheckpointDir
backupCheckpointDir-備份檢查點的目錄,此目錄不能與資料目錄或檢查點目錄相同
dataDirs~/.flume/file-channel/data逗號分隔的目錄串列,用于存盤日志檔案,在不同磁盤上使用多個目錄可以提高檔案 channel 的性能
transactionCapacity10000channel 支持的最大事務大小
checkpointInterval30000檢查點之間的時間量(以毫秒為單位)
maxFileSize 為2146435071單個日志檔案的最大大小(以位元組為單位)  2G
minimumRequiredSpace524288000最小所需可用空間(以位元組為單位),為避免資料損壞,當可用空間低于此值時,檔案 channel 將停止接受接收 / 放置請求 500M
capacity1000000channel 的最大容量 & nbsp;  100 萬
keep-alive3等待放置操作的時間量(以秒為單位)
use-log-replay-v1false推薦:使用原有的重播邏輯
use-fast-replayfalse推薦:不使用佇列重播
checkpointOnClosetrue控制是否在關閉 channel 時創建檢查點,通過避免重放,在關閉時創建檢查點可以提高檔案 channel 的后續啟動速度,
encryption.activeKey-用于加密新資料的密鑰名稱
encryption.cipherProvider-密碼提供程式 type,支持的 type:AESCTRNOPADDING
encryption.keyProvider-密鑰提供程式 type,支持的 type:JCEKSFILE
encryption.keyProvider.keyStoreFile-密鑰庫檔案的路徑
encrpytion.keyProvider.keyStorePasswordFile-密鑰庫密碼檔案的路徑
encryption.keyProvider.keys-所有鍵的串列(例如 activeKey 設定的歷史記錄)
encyption.keyProvider.keys.*.passwordFile-可選密鑰密碼檔案的路徑

注意

默認情況下, 檔案 channel 使用上面指定的用戶主目錄內的檢查點和資料目錄的路徑. 因此, 如果 agent 中有多個活動的檔案 channel 實體, 則只有一個實體可以鎖定目錄并導致其他 channel 初始化失敗.

因此, 有必要為所有已配置的 channel 提供顯式路徑, 最好是在不同的磁盤上

此外, 由于檔案 channel 將在每次提交后同步到磁盤, 因此將其與將 event 一起批處理的 sink/source 耦合可能是必要的, 以便在多個磁盤不可用于檢查點和資料目錄時提供良好的性能.

Example for agent named a1:a1.channels = c1a1.channels.c1.type = filea1.channels.c1.checkpointDir = /mnt/flume/checkpointa1.channels.c1.dataDirs = /mnt/flume/data

  

加密

以下是一些示例配置:

使用密鑰存盤密碼分隔生成密碼密鑰:

keytool -genseckey -alias key-0 -keypass keyPassword -keyalg AES \-keysize 128 -validity 9000 -keystore test.keystore \-storetype jceks -storepass keyStorePassword

 

使用與密鑰庫密碼相同的密碼生成密鑰:

keytool -genseckey -alias key-1 -keyalg AES -keysize 128 -validity 9000 \-keystore src/test/resources/test.keystore -storetype jceks \-storepass keyStorePassworda1.channels.c1.encryption.activeKey = key-0a1.channels.c1.encryption.cipherProvider = AESCTRNOPADDINGa1.channels.c1.encryption.keyProvider = key-provider-0a1.channels.c1.encryption.keyProvider = JCEKSFILEa1.channels.c1.encryption.keyProvider.keyStoreFile = /path/to/my.keystorea1.channels.c1.encryption.keyProvider.keyStorePasswordFile = /path/to/my.keystore.passworda1.channels.c1.encryption.keyProvider.keys = key-0

  

false 設您已使用密鑰 0 輸出密鑰, 并且應使用密鑰 1 加密新檔案:

a1.channels.c1.encryption.activeKey = key-1a1.channels.c1.encryption.cipherProvider = AESCTRNOPADDINGa1.channels.c1.encryption.keyProvider = JCEKSFILEa1.channels.c1.encryption.keyProvider.keyStoreFile = /path/to/my.keystorea1.channels.c1.encryption.keyProvider.keyStorePasswordFile = /path/to/my.keystore.passworda1.channels.c1.encryption.keyProvider.keys = key-0 key-1

  

與上面相同的場景, 但 key-0 有自己的密碼:

a1.channels.c1.encryption.activeKey = key-1a1.channels.c1.encryption.cipherProvider = AESCTRNOPADDINGa1.channels.c1.encryption.keyProvider = JCEKSFILEa1.channels.c1.encryption.keyProvider.keyStoreFile = /path/to/my.keystorea1.channels.c1.encryption.keyProvider.keyStorePasswordFile = /path/to/my.keystore.passworda1.channels.c1.encryption.keyProvider.keys = key-0 key-1a1.channels.c1.encryption.keyProvider.keys.key-0.passwordFile = /path/to/key-0.passwordCustom Channel

  

自定義 channel 是您自己的 Channel 介面實作. 啟動 Flume agent 程式時, 必須在 agent 程式的類路徑中包含自定義 channel 的類及其依賴項. 自定義 channel 的 type 是其 FQCN. 必需屬性以粗體顯示

屬性名稱默認描述
type-組件 type 名稱需要是 FQCN
Example for agent named a1:a1.channels = c1a1.channels.c1.type = org.example.MyChannelFlume Channel Selectors

  

 


如果未指定 type, 則默認為 "replicating"

Replicating Channel Selector (default)

必需屬性以粗體顯示

屬性名稱默認描述
selector.typereplicating組件 type 名稱需要 & nbsp;  replicating
selector.optional-要標記為可選的 channel 集
Example for agent named a1 and it's source called r1:a1.sources = r1a1.channels = c1 c2 c3a1.sources.r1.selector.type = replicatinga1.sources.r1.channels = c1 c2 c3a1.sources.r1.selector.optional = c3

  


在上面的配置中, c3 是可選的 channel.

無法寫入 c3 只是被忽略了. 由于 c1 和 c2 未標記為可選, 因此無法寫入這些 channel 將導致事務失敗.

Multiplexing Channel Selector (多路復用)

必需屬性以粗體顯示

屬性名稱默認描述
selector.typereplicating組件 type 名稱需要進行多路復用 (multiplexing)
selector.headerflume.selector.header 
selector.default- 
selector.mapping,*- 
Example for agent named a1 and it's source called r1:a1.sources = r1a1.channels = c1 c2 c3 c4a1.sources.r1.selector.type = multiplexinga1.sources.r1.selector.header = statea1.sources.r1.selector.mapping.CZ = c1a1.sources.r1.selector.mapping.US = c2 c3a1.sources.r1.selector.default = c4Custom Channel Selector

  

 


自定義 channel 選擇器是您自己的 Channelelector 介面實作. 啟動 Flume agent 程式時, 自定義 channel 選擇器的類及其依賴項必須包含在 agent 程式的類路徑中. 自定義 channel 選擇器的 type 是其 FQCN.

屬性名稱默認描述
selector.type-組件 type 名稱,需要是您的 FQCN 
Example for agent named a1 and its source called r1:a1.sources = r1a1.channels = c1a1.sources.r1.selector.type = org.example.MyChannelSelectorFlume Sink Processors

  

 


接收組允許用戶將多個 sink 分組到一個物體中. sink 處理器可用于在組內的所有 sink 上提供負載平衡功能, 或在時間故障的情況下實作從一個 sink 到另一個 sink 的故障轉移.

必需屬性以粗體顯示

屬性名稱默認描述
sinks-以空格分隔的參與組的 sink 串列
processor.typedefault組件 type 名稱需要是 default,failover 或 load_balance
Example for agent named a1:a1.sinkgroups = g1a1.sinkgroups.g1.sinks = k1 k2a1.sinkgroups.g1.processor.type = load_balanceDefault Sink Processor

  

 


默認 sink 只接受一個 sink. 用戶不必為單個 sink 創建處理器(sink 組). 相反, 用戶可以遵循本用戶指南中上面解釋的 source - channel - sink 模式

Failover Sink Processor

故障轉移 sink 維護一個優先級的 sink 串列, 保證只要有一個可用的 event 將被處理(傳遞)

故障轉移機制的作業原理是將故障 sink 降級到池中, 在池中為它們分配一個冷卻期, 在重試之前隨順序故障而增加. sink 成功發送 event 后, 它將恢復到實時池. sink 具有與之相關的優先級, 數量越大, 優先級越高. 如果在發送 event 時 sink 發生故障, 則接下來將嘗試下一個具有最高優先級的 sink 以發送 event . 例如, 在優先級為 80 的 sink 之前激活優先級為 100 的 sink. 如果未指定優先級, 則根據配置中指定 sink 的順序確定 Sinks 優先級.

要進行配置, 請將 sink 組處理器設定為故障轉移并為所有單個 sink 設定優先級. 所有指定的優先級必須是唯一的 此外, 可以使用 maxpenalty 屬性設定故障轉移時間的上限(以毫秒為單位)

必需屬性以粗體顯示

屬性名稱默認描述
sinks-以空格分隔的參與組的 sink 串列
processor.typedefault組件 type 名稱需要進行故障轉移 & nbsp;  failover
processor.priority-優先價值, 必須是與當前 sink 組關聯的 sink 實體之一,較高優先級值 Sink 較早被激活,絕對值越大表示優先級越高
processor.maxpenalty30000失敗的 sink 的最大退避時間(以毫秒為單位)
Example for agent named a1:a1.sinkgroups = g1a1.sinkgroups.g1.sinks = k1 k2a1.sinkgroups.g1.processor.type = failovera1.sinkgroups.g1.processor.priority.k1 = 5a1.sinkgroups.g1.processor.priority.k2 = 10a1.sinkgroups.g1.processor.maxpenalty = 10000Load balancing Sink Processor(負載均衡接收處理器)

  

 


負載平衡 sink 處理器提供了在多個 sink 上進行負載均衡流量的功能. 它維護一個索引的活動 sink 串列, 必須在其上分配負載. 實作支持使用 round_robin 或 random 機制分配負載. 選擇機制的選擇默認為 round_robin 型別, 但可以通過配置覆寫. 通過從 AbstractSinkSelector 繼承的自定義類支持自定義選擇機制.

呼叫時, 此選擇器使用其配置的選擇機制選擇下一個 sink 并呼叫它. 對于 round_robin 和 random 如果所選的 sink 無法傳遞 event , 則處理器通過其配置的選擇機制選擇下一個可用的 sink. 此實作不會將失敗的 sink 列入黑名單, 而是繼續樂觀地嘗試每個可用的 sink. 如果所有 sink 呼叫都導致失敗, 則選擇器將故障傳播到 sink 運行器.

如果啟用了 backoff , 則 sink 處理器會將失敗的 sink 列入黑名單, 將其洗掉以供給定超時的選擇. 當超時結束時, 如果 sink 仍然沒有回應, 則超時會以指數方式增加, 以避免在無回應的 sink 上長時間等待時卡住. 在禁用此功能的情況下, 在回圈中, 所有失敗的 sink 負載將被傳遞到下一個 sink, 因此不均衡

必需屬性以粗體顯示

屬性名稱默認描述
processor.sink-以空格分隔的參與組的 sink 串列
processor.typedefault組件 type 名稱需要是 load_balance
processor.backofffalse失敗的 sink 是否會以指數方式退回,
processor.selector round_robin選擇機制,必須是 round_robin,random  或自定義類的 FQCN,它繼承自 AbstractSinkelector
processor.selector.maxTimeOut30000由退避選擇器用于限制指數 backoff (以毫秒為單位)
Example for agent named a1:a1.sinkgroups = g1a1.sinkgroups.g1.sinks = k1 k2a1.sinkgroups.g1.processor.type = load_balancea1.sinkgroups.g1.processor.backoff = truea1.sinkgroups.g1.processor.selector = randomCustom Sink Processor

  

 


目前不支持自定義 sink 處理器

Event Serializers

該 file_roll sink 和 HDFS sink 都支持 EventSerializer 介面. 下面提供了隨 Flume 一起提供的 Event Serializer 的詳細資訊.

Body Text Serializer

別名: text . 此攔截器將 event 的主體寫入輸出流, 而不進行任何轉換或修改. event 標題將被忽略. 配置選項如下:

屬性名稱默認描述
appendNewline真正是否在寫入時將換行符附加到每個 event ,由于遺留原因,默認值為 truefalse 定 event 不包含換行符,
Example for agent named a1:a1.sinks = k1a1.sinks.k1.type = file_rolla1.sinks.k1.channel = c1a1.sinks.k1.sink.directory = /var/log/flumea1.sinks.k1.sink.serializer = texta1.sinks.k1.sink.serializer.appendNewline = false"Flume Event" Avro Event Serializer

  

 


Alias: avro_event.

此攔截器將 Flumeevent 序列化為 Avro 容器檔案. 使用的模式與 Avro RPC 機制中用于 Flumeevent 的模式相同.

此序列化程式繼承自 AbstractAvroEventSerializer 類

配置選項如下:

屬性名稱默認描述
syncIntervalBytes2048000Avro 同步間隔,大約為位元組,  2M ???
compressionCodecnull Avro 壓縮編解碼器,有關受支持的編解碼器,請參閱 Avro 的 CodecFactory 檔案,
Example for agent named a1:a1.sinks.k1.type = hdfsa1.sinks.k1.channel = c1a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%Sa1.sinks.k1.serializer = avro_eventa1.sinks.k1.serializer.compressionCodec = snappy

  

 


Avro event 序列化器

別名: 此序列化程式沒有別名, 必須使用完全限定的類名類名指定.

這將 Flume event 序列化為 Avro 容器檔案, 如 "Flume Event" Avro Event Serializer, 但記錄模式是可配置的. 記錄模式可以指定為 Flume 配置屬性, 也可以在 event 頭中傳遞.

要將記錄模式作為 Flume 配置的一部分傳遞, 請使用下面列出的屬性 schemaURL.

要在 event 標頭中傳遞記錄模式, 請指定 包含模式的 JSON 格式表示的 event 標頭 flume.avro.schema.literal 或包含可以找到模式的 URL 的 flume.avro.schema.url( hdfs:/... URIs are supported I)

此序列化程式繼承自 AbstractAvroEventSerializer 類.

配置選項如下:

屬性名稱默認描述
syncIntervalBytes2048000Avro 同步間隔,大約為位元組,
compressionCodecnullAvro 壓縮編解碼器,有關受支持的編解碼器,請參閱 Avro 的 CodecFactory 檔案,
schemaURL Avro 架構 URL,標題中指定的模式 ovverride 此選項,
Example for agent named a1:a1.sinks.k1.type = hdfsa1.sinks.k1.channel = c1a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%Sa1.sinks.k1.serializer = org.apache.flume.sink.hdfs.AvroEventSerializer$Buildera1.sinks.k1.serializer.compressionCodec = snappya1.sinks.k1.serializer.schemaURL = hdfs://namenode/path/to/schema.avscFlume Interceptors

  

 


Flume 具有在運行中修改 / 洗掉 event 的能力. 這是在攔截器的幫助下完成的. 攔截器是實作 org.apache.flume.interceptor.Interceptor 的類介面. 攔截器可以根據攔截器開發者選擇的任何標準修改甚至洗掉 event .Flume 支持攔截器的鏈接. 通過在配置中指定攔截器構建器類名串列, 可以實作此目的. 攔截器在 source 配置中指定為以空格分隔的串列. 指定攔截器的順序是它們被呼叫的順序. 一個攔截器回傳的 event 串列將傳遞給鏈中的下一個攔截器. 攔截器可以修改或洗掉 event . 如果攔截器需要洗掉 event , 它就不會在它回傳的串列中回傳該 event . 如果要洗掉所有 event , 則只回傳一個空串列. 攔截器是命名組件, 下面是它們如何通過配置創建的示例:

a1.sources = r1a1.sinks = k1a1.channels = c1a1.sources.r1.interceptors = i1 i2a1.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.HostInterceptor$Buildera1.sources.r1.interceptors.i1.preserveExisting = falsea1.sources.r1.interceptors.i1.hostHeader = hostnamea1.sources.r1.interceptors.i2.type = org.apache.flume.interceptor.TimestampInterceptor$Buildera1.sinks.k1.filePrefix = FlumeData.%{CollectorHost}.%Y-%m-%da1.sinks.k1.channel = c1

  

請注意, 攔截器構建器將傳遞給 type config 引數. 攔截器本身是可配置的, 可以傳遞配置值, 就像傳遞給任何其他可配置組件一樣. 在上面的示例中, event 首先傳遞給 HostInterceptor, 然后 HostInterceptor 回傳的 event 傳遞給 TimestampInterceptor. 您可以指定完全限定的類名 (FQCN) 或別名時間戳. 如果您有多個收集器寫入相同的 HDFS 路徑, 那么您也可以使用 HostInterceptor

時間戳攔截器 (Timestamp Interceptor)

此攔截器將 event 標頭插入到 event 標頭中, 以毫秒為單位處理 event . 此攔截器插入帶有鍵時間戳 (或由 header 屬性指定) 的標頭, 其值為相關時間戳. 如果已在配置中存在, 則此攔截器可以保留現有時間戳

屬性名稱默認描述
type-組件 type 名稱必須是時間戳或 FQCN
headerNametimestamp用于放置生成的時間戳的標頭的名稱,
preserveExistingfalse如果時間戳已存在,是否應保留 - true 或 false
Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.channels = c1a1.sources.r1.type = seqa1.sources.r1.interceptors = i1a1.sources.r1.interceptors.i1.type = timestamp

  

 


主機攔截器(Host Interceptor)

此攔截器插入運行此 agent 程式的主機的 hostname 或 IP 地址. 它根據配置插入帶有密鑰主機或已配置密鑰的標頭, 其值為主機的 hostname 或 IP 地址.

屬性名稱默認描述
type-組件 type 名稱必須是 & nbsp;host
preserveExistingfalse如果主機頭已存在,是否應保留 - true 或 false
useIPtrue如果為 true,請使用 IP 地址,否則使用 hostname,
hostHeaderhost要使用的標頭密鑰,
Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.interceptors = i1a1.sources.r1.interceptors.i1.type = host

  

 


靜態攔截器 (Static Interceptor)

靜態攔截器允許用戶將具有靜態值的靜態頭附加到所有 event

當前實作不允許一次指定多個標頭. 相反, 用戶可能會鏈接多個靜態攔截器, 每個靜態攔截器定義一個

屬性名稱默認描述
type-組件 type 名稱必須是 & nbsp;static 
preserveExistingtrue如果已配置的標頭已存在,則應保留它 - true 或 false
keykey應創建的標頭的名稱
valuevalue應該創建的靜態值
Example for agent named a1:a1.sources = r1a1.channels = c1a1.sources.r1.channels = c1a1.sources.r1.type = seqa1.sources.r1.interceptors = i1a1.sources.r1.interceptors.i1.type = statica1.sources.r1.interceptors.i1.key = datacentera1.sources.r1.interceptors.i1.value = https://www.cnblogs.com/laoqing/p/NEW_YORKRemove Header Interceptor (洗掉標題攔截器)

  


此攔截器通過洗掉一個或多個 headers 來操縱 Flume event headers. 它可以洗掉靜態定義的 headers, 基于正則運算式的 headers 或串列中的 headers. 如果這些都沒有定義, 或者沒有符合條件的 headers, 則不會修改 Flume 事件.

請注意, 如果只需要洗掉一個 headers, 則按名稱指指定 header 可提供相對于其他兩種方法的性能優勢.

屬性名稱默認描述
type-組件 type 名稱必須是 remove_header
withName-要洗掉的 header 的名稱
fromList-要洗掉的 header 串列,使用 fromListSeparator 指定的分隔符分隔
fromListSeparator\ S * \ S *正則運算式,用于分隔 fromList 指定的串列中的多個 header 名稱,默認值是由任意數量的空白字符包圍的逗號
matching-將洗掉名稱與此正則運算式匹配的所有 header

UUID 攔截器 (UUID Interceptor)

此攔截器在所有截獲的 event 上設定通用唯一識別符號. 示例 UUID 是 b5755073-77a9-43c1-8fad-b7a586fc1b97, 表示 128 位值.

如果 event 的應用程式級別唯一鍵不可用, 請考慮使用 UUIDInterceptor 自動為 event 分配 UUID. 一旦 UUID 進入 Flume 網路就將其分配給 event 非常重要; 也就是說, 在流量的第一個 Flume Source 中. 這使得在 Flume 網路中面對復制和重新發送時 event 的后續重復資料洗掉可以實作高可用性和高性能. 如果應用程式級別密鑰可用, 則優于自動生成的 UUID, 因為它使用所述公知的應用程式級別密鑰在資料存盤中啟用后續更新和 event 洗掉.

屬性名稱默認描述
type-組件 type 名稱必須是 org.apache.flume.sink.solr.morphline.UUIDInterceptor $ Builder
headerNameid要修改的 Flume header 的名稱
preserveExistingtrue如果 UUID 標頭已存在,是否應保留 - true 或 false
prefix“”前綴字串常量,用于預先添加到每個生成的 UUID

Morphline Interceptor (形態攔截器)

此攔截器通過 morphline 組態檔過濾 event , 該檔案定義了一系列轉換命令, 用于將記錄從一個命令傳遞到另一個命令. 例如, morphline 可以忽略某些 event 或通過基于正則運算式的模式匹配來更改或插入某些 event 頭, 或者它可以通過 Apache Tika 在截獲的 event 上自動檢測和設定 MIMEtype. 例如, 這種資料包嗅探可用于 Flume 拓撲中基于內容的動態路由. MorphlineInterceptor 還可以幫助實作到多個 Apache Solr 集合的動態路由(例如, 用于多租戶)

目前, 存在一個限制, 即攔截器的形態線不能為每個輸入 event 生成多個輸出記錄. 此攔截器不適用于重型 ETL 處理 - 如果需要, 請考慮將 ETL 處理從 Flume Source 移至 Flume Sink, 例如移至 MorphlineSolrSink.

必需屬性以粗體顯示

屬性名稱默認描述
type-組件 type 名稱必須是 org.apache.flume.sink.solr.morphline.MorphlineInterceptor $ Builder
morphlineFile-本地檔案系統與 morphline 組態檔的相對或絕對路徑,示例:/etc/flume-ng/conf/morphline.conf
morphlineIdnull如果 morphline 組態檔中有多個 morphlines,則用于標識 morphline 的可選名稱
Sample flume.conf file:a1.sources.avroSrc.interceptors = morphlineinterceptora1.sources.avroSrc.interceptors.morphlineinterceptor.type = org.apache.flume.sink.Solr.morphline.MorphlineInterceptor$Buildera1.sources.avroSrc.interceptors.morphlineinterceptor.morphlineFile = /etc/flume-ng/conf/morphline.confa1.sources.avroSrc.interceptors.morphlineinterceptor.morphlineId = morphline1

  

 


搜索和替換攔截器 (Search and Replace Interceptor)

此攔截器基于 Java 正則運算式提供簡單的基于字串的搜索和替換功能. 還可以進行回溯 / 群組捕捉. 此攔截器使用與 Java Matcher.replaceAll()方法中相同的規則

屬性名稱默認描述
type-組件 type 名稱必須是 search_replace
searchPattern-要搜索和替換的模式,
replaceString-替換字串,
charsetUTF-8event 正文的字符集,默認 false 設為 UTF-8,
Example configuration:a1.sources.avroSrc.interceptors = search-replacea1.sources.avroSrc.interceptors.search-replace.type = search_replace# Remove leading alphanumeric characters in an event body.a1.sources.avroSrc.interceptors.search-replace.searchPattern = ^[A-Za-z0-9_]+a1.sources.avroSrc.interceptors.search-replace.replaceString =Another example:a1.sources.avroSrc.interceptors = search-replacea1.sources.avroSrc.interceptors.search-replace.type = search_replace# Use grouping operators to reorder and munge words on a line.a1.sources.avroSrc.interceptors.search-replace.searchPattern = The quick brown ([a-z]+) jumped over the lazy ([a-z]+)a1.sources.avroSrc.interceptors.search-replace.replaceString = The hungry $2 ate the careless $1

  

 


正則運算式過濾攔截器 (Regex Filtering Interceptor)

此攔截器通過將 event 主體解釋為文本并將文本與配置的正則運算式進行匹配來有選擇地過濾 event . 提供的正則運算式可用于包括 event 或排除 event

屬性名稱默認描述
type-組件 type 名稱必須是 regex_filter
regex".*" 用于匹配 event 的正則運算式
excludeEventsfalse如果為 true,則 regex 確定要排除的 event ,否則 regex 確定要包括的 event ,

正則運算式提取器攔截器(Regex Extractor Interceptor)

此攔截器使用指定的正則運算式提取正則運算式匹配組, 并將匹配組作為標題附加到 event 上. 它還支持可插入序列化程式, 用于在將匹配組添加為 event 標頭之前對其進行格式化.

屬性名稱默認描述
type-組件 type 名稱必須是 regex_extractor
regex-用于匹配 event 的正則運算式
serializer-以空格分隔的序列化程式串列,用于映射與標題名稱匹配并序列化其值,(參見下面的示例)Flume 為以下序列化程式提供內置支持: org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer
serializer 器,.TYPEdefault必須是 default (org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer),org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer,或實作 org.apache.flume.interceptor.RegexExtractorInterceptorSerializer 的自定義類的 FQCN
serializers..name- 
serializers.*-Serializer-specific properties

序列化器用于將匹配映射到標題名稱和格式化標題值; 默認情況下, 您只需指定標題名稱, 將使用默認的 org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer. 此序列化程式只是將匹配映射到指定的標題名稱, 并在正則運算式提取時傳遞值. 您可以使用完全限定的類名 (FQCN) 將自定義序列化程式實作插入到提取器中, 以便以您喜歡的方式格式化匹配.

例 1:

如果 Flumeevent 主體包含 1:2:3.4foobar5 , 則使用以下配置

a1.sources.r1.interceptors.i1.regex = (\\d):(\\d):(\\d)a1.sources.r1.interceptors.i1.serializers = s1 s2 s3a1.sources.r1.interceptors.i1.serializers.s1.name = onea1.sources.r1.interceptors.i1.serializers.s2.name = twoa1.sources.r1.interceptors.i1.serializers.s3.name = three

  

提取的 event 將包含相同的主體, 但后面的標題將添加一個 => 1, 兩個 => 2, 三個 => 3

例 2:

如果 Flumeevent 正文包含 2012-10-18 18:47:57,614 某些 日志 行, 則使用以下配置

a1.sources.r1.interceptors.i1.regex = ^(?:\\n)?(\\d\\d\\d\\d-\\d\\d-\\d\\d\\s\\d\\d:\\d\\d)a1.sources.r1.interceptors.i1.serializers = s1a1.sources.r1.interceptors.i1.serializers.s1.type = org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializera1.sources.r1.interceptors.i1.serializers.s1.name = timestampa1.sources.r1.interceptors.i1.serializers.s1.pattern = yyyy-MM-dd HH:mm

  

提取的 event 將包含相同的主體, 但后面的標題將添加 timestamp => 1350611220000

Flume 屬性

屬性名稱默認描述
flume.called.from.service-如果指定了此屬性,則 Flume agent 將繼續輪詢組態檔,即使在預期位置找不到組態檔也是如此,否則,如果配置在預期位置不存在,Flume agent 將終止,設定此屬性時不需要屬性值(例如,只需指定 - Dflume.called.from.service 即可)

屬性: flume.called.from.service

Flume 每隔 30 秒定期輪詢一次指定組態檔的更改. 如果首次輪詢現有檔案, 或者自上次輪詢以來現有檔案的修改日期發生更改, Flume agent 將從組態檔加載新配置. 重命名或移動檔案不會更改其修改時間. 當 Flume agent 輪詢一個不存在的檔案時, 會發生以下兩種情況之一:

當 agent 首次輪詢不存在的組態檔時, agent 將根據 flume.called.from.service 屬性執行操作. 如果設定了屬性, 則 agent 將繼續輪詢(始終在同一時間 - 每 30 秒). 如果未設定該屬性, 則 agent 會立即終止

當 agent 輪詢一個不存在的組態檔并且這不是第一次輪詢檔案時, agent 不會對此輪詢周期進行配置更改. agent 繼續輪詢而不是終止.

配置過濾器

Flume 提供了一種工具, 用于以配置過濾器的形式將敏感或生成的資料注入配置. 配置密鑰可以設定為配置屬性的值, 它將由配置過濾器替換為它所代表的值

配置過濾器的常見用法

格式類似于 Java 運算式語言, 但它目前不是一個完全有效的 EL 運算式決議器, 只是一種看起來像它的格式

<agent_name>.configfilters =<filter_name><agent_name>.configfilters.<filter_name>.type =<filter_type><agent_name>.sources.<source_name>.parameter = ${<filter_name>['<key_for_sensitive_or_generated_data>']}<agent_name>.sinks.<sink_name>.parameter = ${<filter_name>['<key_for_sensitive_or_generated_data>']}<agent_name>.<component_type>.<component_name>.parameter = ${<filter_name>['<key_for_sensitive_or_generated_data>']} #or<agent_name>.<component_type>.<component_name>.parameter = ${<filter_name>["<key_for_sensitive_or_generated_data>"]} #or<agent_name>.<component_type>.<component_name>.parameter = ${<filter_name>[<key_for_sensitive_or_generated_data>]} #or<agent_name>.<component_type>.<component_name>.parameter = some_constant_data${<filter_name>[<key_for_sensitive_or_generated_data>]}

  

環境變數配置過濾器

屬性名稱默認描述
type-組件 type 名稱必須是 env

示例, 要在配置中隱藏密碼, 請設定其值, 如以下示例所示

a1.sources = r1a1.channels = c1a1.configfilters = f1a1.configfilters.f1.type = enva1.sources.r1.channels = c1a1.sources.r1.type = httpa1.sources.r1.keystorePassword = ${f1['my_keystore_password']}

  

這里 a1.source.r1.keystorePassword 配置屬性將獲取 my_keystore_password 環境變數的值. 設定環境變數的一種方法是運行如下所示的 flume agent:

$ my_keystore_password = Secret123 bin / flume -ng agent --conf conf --conf-file example.conf ...

外部處理配置過濾器(External Process Config Filter)

屬性名稱默認描述
type-組件 type 名稱必須是外部的
command-將執行以獲取給定鍵的值的命令,該命令將被呼叫為:

  并且預期回傳單行值,退出代碼為 0,

charsetUTF-8回傳字串的字符集,

示例, 要在配置中隱藏密碼, 請設定其值, 如以下示例所示:

a1.sources = r1a1.channels = c1a1.configfilters = f1a1.configfilters.f1.type = externala1.configfilters.f1.command = /usr/bin/passwordResolver.sha1.configfilters.f1.charset = UTF-8a1.sources.r1.channels = c1a1.sources.r1.type = httpa1.sources.r1.keystorePassword = ${f1['my_keystore_password']}

  

在此示例中, flume 將運行以下命令以獲取值

$ /usr/bin/passwordResolver.sh my_keystore_password

該 passwordResolver.sh 將回傳 Secret123 與退出代碼 0.

示例, 要生成滾動檔案 sink 的目錄的一部分, 請設定其值, 如以下示例所示:

a1.sources = r1a1.channels = c1a1.configfilters = f1a1.configfilters.f1.type = externala1.configfilters.f1.command = /usr/bin/generateUniqId.sha1.configfilters.f1.charset = UTF-8a1.sinks = k1a1.sinks.k1.type = file_rolla1.sinks.k1.channel = c1a1.sinks.k1.sink.directory = /var/log/flume/agent_${f1['agent_name']}

  

在此示例中, flume 將運行以下命令以獲取值

$ /usr/bin/generateUniqId.sh agent_name

該 generateUniqId.sh 將回傳 1234 與退出代碼 0.

Hadoop 憑據存盤配置過濾器

此功能的類路徑上需要一個 hadoop-common 庫(2.6 + 版本). 如果安裝了 hadoop, 則 agent 會自動將其添加到類路徑中

屬性名稱默認描述
type-組件 type 名稱必須是 hadoop
credential.provider.path-提供者路徑,請參閱 hadoop 檔案_here:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/CredentialProviderAPI.html#Configuring_the_Provider_Path
credstore.java-keystore-provider.password-file-如果檔案用于存盤密碼,則為密碼檔案的名稱,該檔案必須在類路徑上,可以使用 HADOOP_CREDSTORE_PASSWORD 環境變數設定提供程式密碼,也可以將其設定為空,

示例, 要在配置中隱藏密碼, 請設定其值, 如以下示例所示:

a1.sources = r1a1.channels = c1a1.configfilters = f1a1.configfilters.f1.type = hadoopa1.configfilters.f1.credential.provider.path = jceks://file/<path_to_jceks file>a1.sources.r1.channels = c1a1.sources.r1.type = httpa1.sources.r1.keystorePassword = ${f1['my_keystore_password']}

  

Log4j 追加 (Log4J Appender)

將 Log4jevent 附加到 flume agent 的 avrosource. 使用此 appender 的客戶端必須在類路徑中包含 flume-ng-sdk(例如, flume-ng-sdk-1.9.0.jar). 必需屬性以粗體顯示

屬性名稱默認描述
hostname-使用 avrosource 運行遠程 Flume agent 的 hostname,
port-遠程 Flume agent 的 avrosource 正在偵聽的埠,
UnsafeModefalse如果為 true,則 appender 將不會在發送 event 失敗時拋出例外,
AvroReflectionEnabledfalse使用 Avro Reflection 來序列化 Log4jevent ,(當用戶記錄字串時不要使用)
AvroSchemaUrl-可從中檢索 Avro 架構的 URL,

示例 log4j.properties 檔案:

#...log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppenderlog4j.appender.flume.Hostname = example.comlog4j.appender.flume.Port = 41414log4j.appender.flume.UnsafeMode = true# configure a class's logger to output to the flume appenderlog4j.logger.org.example.MyClass = DEBUG,flume#...

  

默認情況下, 通過呼叫 toString()或使用 Log4j 布局 (如果指定) 將每個 event 轉換為字串.

如果 event 是 org.apache.avro.generic.GenericRecord,org.apache.avro.specific.SpecificRecord 的實體 , 或者屬性 AvroReflectionEnabled 設定為 true, 則將使用 Avro 序列化序列化 event .

使用 Avro 架構序列化每個 event 效率很低, 因此最好提供一個架構 URL, 下游 sink(通常是 HDFSsink)可以從該架構 URL 檢索架構.如果未指定 AvroSchemaUrl, 則架構將作為 Flume 標頭包含在內.

示例 log4j.properties 檔案配置為使用 Avro 序列化:

#...log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppenderlog4j.appender.flume.Hostname = example.comlog4j.appender.flume.Port = 41414log4j.appender.flume.AvroReflectionEnabled = truelog4j.appender.flume.AvroSchemaUrl = hdfs://namenode/path/to/schema.avsc# configure a class's logger to output to the flume appenderlog4j.logger.org.example.MyClass = DEBUG,flume#...

  

負載均衡 Log4j 追加 (Load Balancing Log4J Appender)

將 Log4jevent 追加到 flume agent 的 avrosource 串列中. 使用此 appender 的客戶端必須在類路徑中包含 flume-ng-sdk(例如, flume-ng-sdk-1.9.0.jar). 該 appender 支持回圈和隨機方案, 用于執行負載平衡. 它還支持可配置的退避超時, 以便從主機集臨時洗掉向下 agent . 必需屬性以粗體顯示

屬性名稱默認描述
Hosts-一個以空格分隔的 host:port 串列,Flume(通過 AvroSource)正在偵聽 event
SelectorROUND_ROBIN選擇機制,必須是 ROUND_ROBIN,RANDOM 或自定義 FQDN 到繼承自 LoadBalancingSelector 的類,
MaxBackoff-一個 long 值,表示負載平衡客戶端將從無法使用 event 的節點退回的最長時間(以毫秒為單位),默認為無退避
UnsafeModefalse如果為 true,則 appender 將不會在發送 event 失敗時拋出例外,
AvroReflectionEnabledfalse使用 Avro Reflection 來序列化 Log4jevent ,
AvroSchemaUrl-可從中檢索 Avro 架構的 URL,

使用默認值配置的示例 log4j.properties 檔案:

#...log4j.appender.out2 = org.apache.flume.clients.log4jappender.LoadBalancingLog4jAppenderlog4j.appender.out2.Hosts = localhost:25430 localhost:25431# configure a class's logger to output to the flume appenderlog4j.logger.org.example.MyClass = DEBUG,flume#...

  

使用 RANDOM 負載平衡配置的示例 log4j.properties 檔案:

#...log4j.appender.out2 = org.apache.flume.clients.log4jappender.LoadBalancingLog4jAppenderlog4j.appender.out2.Hosts = localhost:25430 localhost:25431log4j.appender.out2.Selector = RANDOM# configure a class's logger to output to the flume appenderlog4j.logger.org.example.MyClass = DEBUG,flume#...

 

使用退避配置的示例 log4j.properties 檔案:

#...log4j.appender.out2 = org.apache.flume.clients.log4jappender.LoadBalancingLog4jAppenderlog4j.appender.out2.Hosts = localhost:25430 localhost:25431 localhost:25432log4j.appender.out2.Selector = ROUND_ROBINlog4j.appender.out2.MaxBackoff = 30000# configure a class's logger to output to the flume appenderlog4j.logger.org.example.MyClass = DEBUG,flume#...

  

安全

HDFSsink,HBasesink,Thriftsource,Thriftsink 和 Kite Datasetsink 都支持 Kerberos 身份驗證. 請參閱相應的部分以配置與 Kerberos 相關的選項.

Flume agent 將作為單個主體對 kerberos KDC 進行身份驗證, 這將由需要進行 kerberos 身份驗證的不同組件使用. 為 Thriftsource,Thriftsink,HDFSsink,HBasesink 和 DataSetsink 配置的主體和 keytab 應該相同, 否則組件將無法啟動.

監控

Flume 中的監控仍在進行中. 變化可能經常發生. 幾個 Flume 組件向 JMX 平臺 MBean 服務器報告度量標準. 可以使用 Jconsole 查詢這些指標.

可用的組件指標

下表顯示了可用于組件的度量標準. 每個組件僅維護一組度量, 由 "x" 表示, 未維護的值顯示默認值, 即 0. 這些表告訴您可以在何處獲得有意義的資料. 度量標準的名稱應該足夠描述, 有關更多資訊, 您必須深入了解組件的 source 代碼.

Sources1

 AvroEXECHTTPJMSKafkaMultiportSyslogTCPScribe
AppendAcceptedCountX      
AppendBatchAcceptedCountX XX   
AppendBatchReceivedCountX XX   
AppendReceivedCountX      
ChannelWriteFailX XXXXX
EventAcceptedCountXXXXXXX
EventReadFail  XXXXX
EventReceivedCountXXXXXXX
GenericProcessingFail  X  X 
KafkaCommitTimer    X  
KafkaEmptyCount    X  
KafkaEventGetTimer    X  
OpenConnectionCountX      

Sources 2

 SequenceGeneratorSpoolDirectorySyslogTcpSyslogUDPTaildirThrift
AppendAcceptedCount     X
AppendBatchAcceptedCountXX  XX
AppendBatchReceivedCount X  XX
AppendReceivedCount     X
ChannelWriteFailXXXXXX
EventAcceptedCountXXXXXX
EventReadFail XXXX 
EventReceivedCount XXXXX
GenericProcessingFail X  X 
KafkaCommitTimer      
KafkaEmptyCount      
KafkaEventGetTimer      
OpenConnectionCount      

Sinks 1

 Avro/ThriftAsyncHBaseElasticSearchHBase 的HBase2
BatchCompleteCountXXXXX
BatchEmptyCountXXXXX
BatchUnderflowCountXXXXX
ChannelReadFailX   X
ConnectionClosedCountXXXXX
ConnectionCreatedCountXXXXX
ConnectionFailedCountXXXXX
EventDrainAttemptCountXXXXX
EventDrainSuccessCountXXXXX
EventWriteFailX   X
KafkaEventSendTimer     
RollbackCount     

Sinks 2

 HDFSEventHiveHTTPKafkaMorphlineRollingFile
BatchCompleteCountXX  X 
BatchEmptyCountXX XX 
BatchUnderflowCountXX XX 
ChannelReadFailXXXXXX
ConnectionClosedCountXX   X
ConnectionCreatedCountXX   X
ConnectionFailedCountXX   X
EventDrainAttemptCountXXX XX
EventDrainSuccessCountXXXXXX
EventWriteFailXXXXXX
KafkaEventSendTimer   X  
RollbackCount   X  

Channels

 FileKafkaMemoryPseudoTxnMemorySpillableMemory
ChannelCapacityX X X
ChannelizeX XXX
CheckpointBackupWriteErrorCountX    
CheckpointWriteErrorCountX    
EventPutAttemptCountXXXXX
EventPutErrorCountX    
EventPutSuccessCountXXXXX
EventTakeAttemptCountXXXXX
EventTakeErrorCountX    
EventTakeSuccessCountXXXXX
KafkaCommitTimer X   
KafkaEventGetTimer X   
KafkaEventSendTimer X   
OpenX    
RollbackCounter X   
UnhealthyX    

JMX 報告

可以通過使用 flume-env.sh 在 JAVA_OPTS 環境變數中指定 JMX 引數來啟用 JMX 報告, 如

export JAVA_OPTS ="- Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 5445 -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false"

注意: 上面的示例禁用安全性. 要啟用安全性, 請參閱

Ganglia 報告

Flume 還可以將這些指標報告給 Ganglia 3 或 Ganglia 3.1 元節點. 要向 Ganglia 報告指標, 必須使用此支持啟動水槽 agent . 必須通過傳遞以下引數來啟動 Flume agent , 作為以 flume.monitoring 為前綴的系統屬性., 可以在 flume-env.sh 中指定:

屬性名稱默認描述
type-組件 type 名稱必須是 ganglia
hosts-逗號分隔的 hostname 串列: Ganglia 服務器的埠
pollFrequency60連續向 Ganglia 服務器報告之間的時間(以秒為單位)
isGanglia3falseGanglia 服務器版本為 3. 默認情況下,Flume 以 Ganglia 3.1 格式發送

我們可以通過 Ganglia 支持啟動 Flume, 如下所示:

$ bin/flume-ng agent --conf-file example.conf --name a1 -Dflume.monitoring.type=ganglia -Dflume.monitoring.hosts=com.example:1234,com.example2:5455

JSON 報告

Flume 還可以以 JSON 格式報告指標. 為了以 JSON 格式啟用報告, Flume 在可配置埠上托管 Web 服務器. Flume 以以下 JSON 格式報告指標:

{"typeName1.componentName1" : {"metric1" : "metricValue1", "metric2" : "metricValue2"},"typeName2.componentName2" : {"metric3" : "metricValue3", "metric4" : "metricValue4"}}

  

這是一個例子:

{"CHANNEL.fileChannel":{"EventPutSuccessCount":"468085","Type":"CHANNEL","StopTime":"0","EventPutAttemptCount":"468086","ChannelSize":"233428","StartTime":"1344882233070","EventTakeSuccessCount":"458200","ChannelCapacity":"600000","EventTakeAttemptCount":"458288"},"CHANNEL.memChannel":{"EventPutSuccessCount":"22948908","Type":"CHANNEL","StopTime":"0","EventPutAttemptCount":"22948908","ChannelSize":"5","StartTime":"1344882209413","EventTakeSuccessCount":"22948900","ChannelCapacity":"100","EventTakeAttemptCount":"22948908"}}

  

屬性名稱默認描述
type-組件 type 名稱必須是 http
port41414啟動服務器的埠,

$ bin/flume-ng agent --conf-file example.conf --name a1 -Dflume.monitoring.type=http -Dflume.monitoring.port=34545

然后, 可以在 http://<hostname>:<port>/metrics 網頁上獲得度量標準. 自定義組件可以報告上面 Ganglia 部分中提到的指標.

自定義報告

可以通過撰寫執行報告的服務器向其他系統報告指標. 任何報告類都必須實作 org.apache.flume.instrumentation.MonitorService 介面 . 這樣的類可以與 GangliaServer 用于報告的方式相同. 他們可以輪詢平臺 mbean 服務器以輪詢 mbeans 以獲取指標. 例如, 如果可以使用名為 HTTPReporting 的 HTTP 監視服務, 如下所示:

$ bin/flume-ng agent --conf-file example.conf --name a1 -Dflume.monitoring.type=com.example.reporting.HTTPReporting -Dflume.monitoring.node=com.example:332

屬性名稱默認描述
type-組件 type 名稱必須是 FQCN

從自定義組件報告指標

任何自定義 flume 組件都應繼承自 org.apache.flume.instrumentation.MonitoredCounterGroup 類. 然后, 該類應為其公開的每個度量標準提供 getter 方法. 請參閱下面的代碼. MonitoredCounterGroup 需要一個屬性串列, 其度量由此類公開. 截至目前, 此類僅支持將度量標準公開為長值.

public class SinkCounter extends MonitoredCounterGroup implementsSinkCounterMBean {private static final String COUNTER_CONNECTION_CREATED ="sink.connection.creation.count";private static final String COUNTER_CONNECTION_CLOSED ="sink.connection.closed.count";private static final String COUNTER_CONNECTION_FAILED ="sink.connection.failed.count";private static final String COUNTER_BATCH_EMPTY ="sink.batch.empty";private static final String COUNTER_BATCH_UNDERFLOW ="sink.batch.underflow";private static final String COUNTER_BATCH_COMPLETE ="sink.batch.complete";private static final String COUNTER_EVENT_DRAIN_ATTEMPT ="sink.event.drain.attempt";private static final String COUNTER_EVENT_DRAIN_SUCCESS ="sink.event.drain.sucess";private static final String[] ATTRIBUTES = {COUNTER_CONNECTION_CREATED, COUNTER_CONNECTION_CLOSED,COUNTER_CONNECTION_FAILED, COUNTER_BATCH_EMPTY,COUNTER_BATCH_UNDERFLOW, COUNTER_BATCH_COMPLETE,COUNTER_EVENT_DRAIN_ATTEMPT, COUNTER_EVENT_DRAIN_SUCCESS};public SinkCounter(String name) {super(MonitoredCounterGroup.Type.SINK, name, ATTRIBUTES);}@Overridepublic long getConnectionCreatedCount() {return get(COUNTER_CONNECTION_CREATED);}public long incrementConnectionCreatedCount() {return increment(COUNTER_CONNECTION_CREATED);}}

  

工具

檔案 channel 完整性工具

檔案 channel 完整性工具可驗證檔案 channel 中各個 event 的完整性, 并洗掉損壞的 event

這些工具可以按如下方式運行:

$bin/flume-ng tool --conf ./conf FCINTEGRITYTOOL -l ./datadir -e org.apache.flume.MyEventValidator -DmaxSize 2000

其中 datadir 是要驗證的資料目錄的逗號分隔串列.

以下是可用選項

選項名稱描述
h/help顯示幫助
l/dataDirs以逗號分隔的工具必須驗證的資料目錄串列

event 驗證工具

event 驗證器工具可用于以特定于應用程式的方式驗證檔案 channelevent . 該工具在每個 event 上應用用戶提供程式驗證登錄, 并洗掉未向邏輯確認的 event

這些工具可以按如下方式運行:

$bin/flume-ng tool --conf ./conf FCINTEGRITYTOOL -l ./datadir -e org.apache.flume.MyEventValidator -DmaxSize 2000

其中 datadir 是要驗證的資料目錄的逗號分隔串列.

以下是可用選項

選項名稱描述
h/help顯示幫助
l/dataDirs以逗號分隔的工具必須驗證的資料目錄串列
e/eventValidator完全合格的 event 驗證器實作名稱,jar 必須在 Flume 類路徑上

Event 驗證器實作必須實作 EventValidator 介面. 建議不要從實作中拋出任何例外, 因為它們被視為無效 event . 其他引數可以通過 - D 選項傳遞給 EventValitor 實作.

讓我們看一個基于簡單大小的 event 驗證器的示例, 它將拒絕大于指定的最大大小的 event

public static class MyEventValidator implements EventValidator {private int value = https://www.cnblogs.com/laoqing/p/0;private MyEventValidator(int val) {value = val;}@Overridepublic boolean validateEvent(Event event) {return event.getBody() <= value;}public static class Builder implements EventValidator.Builder {private int sizeValidator = 0;@Overridepublic EventValidator build() {return new DummyEventVerifier(sizeValidator);}@Overridepublic void configure(Context context) {binaryValidator = context.getInteger("maxSize");}}}

  

拓撲設計注意事項

Flume 非常靈活, 允許大量可能的部署方案. 如果您計劃在大型生產部署中使用 Flume, 那么花一些時間考慮如何根據 Flume 拓撲來表達您的問題是明智的. 本節介紹一些注意事項

Flume 是否適合您的問題?

如果您需要將文本日志資料提取到 Hadoop / HDFS 中, 那么 Flume 最適合您的問題, 完全停止. 對于其他用例, 以下是一些指導原則:

Flume 旨在通過相對穩定, 可能復雜的拓撲來傳輸和攝取定期生成的 event 資料."event 資料" 的概念定義非常廣泛. 對 Flume 來說, event 只是一個普通的位元組. event 的大小有一些限制 - 例如, 它不能大于您可以存盤在記憶體中或單個機器上的磁盤上 - 但實際上, 水槽 event 可以是從文本日志條目到影像檔案的所有內容. event 的關鍵屬性是它們以連續的流式方式生成. 如果您的資料沒有定期生成(即您嘗試將大量資料批量加載到 Hadoop 集群中), 那么 Flume 仍然可以正常作業, 但對您的情況來說可能有點過頭了. Flume 喜歡相對穩定的拓撲結構. 您的拓撲不需要是不可變的, 因為 Flume 可以處理拓撲中的更改而不會丟失資料, 并且還可以容忍由于故障轉移或配置而定期重新配置. 如果您每天都要更改拓撲結構, 那么它可能無法正常作業, 因為重新配置需要一些思考和開銷.

Flume 中的流量可靠性

Flume 流的可靠性取決于幾個因素. 通過調整這些因素, 您可以使用 Flume 實作各種可靠性選項.

您使用什么 type 的 channel .Flume 具有持久的 channel(將資料保存到磁盤的 channel)和非持久 channel(如果機器出現故障將丟失資料). 持久 channel 使用基于磁盤的存盤, 存盤在此類 channel 中的資料將在機器重啟或非磁盤相關故障中持續存在.

您的 channel 是否已為作業量充分配置. Flume 中的 channel 充當各種跳躍的緩沖區. 這些緩沖區具有固定容量, 一旦該容量已滿, 您將在流中的早期點創建背壓. 如果此壓力傳播到流量 source,Flume 將變得不可用并可能丟失資料.

您是否使用冗余拓撲. Flume 讓你在冗余拓撲中復制流. 這可以提供非常容易的容錯 source, 并且可以克服磁盤或機器故障.

考慮 Flume 拓撲結構中可靠性的最佳方法是考慮各種故障情況及其結果. 如果磁盤發生故障會怎么樣? 如果機器出現故障會怎樣? 如果您的終端 sink(例如 HDFS)停機一段時間并且您有背壓, 會發生什么? 可能的設計空間巨大, 但您需要提出的基本問題只是極少數.

Flow 拓撲設計

設計 Flume 拓撲的第一步是列舉資料的所有 source 和目標(終端 sink). 這些將定義拓撲的邊緣點. 下一個考慮因素是是否引入中間聚合層或 event 路由. 如果要從大量 source 中收集資料, 則聚合資料以簡化終端 sink 的提取可能會有所幫助. 聚合層還可以通過充當緩沖區來消除 source 的突發性或 sink 的不可用性. 如果要在不同位置之間路由資料, 您可能還希望在不同點分割流: 這會創建可能本身包含聚合點的子拓撲.

調整 Flume 部署的大小

一旦了解了拓撲的外觀, 下一個問題就是需要多少硬體和網路容量. 首先, 量化您生成的資料量. 這并不總是一項簡單的任務! 大多數資料流是突發性的 (例如, 由于晝夜模式) 并且可能是不可預測的. 一個好的起點是考慮每個拓撲層中的最大吞吐量, 包括每秒 event 數和每秒位元組數. 一旦知道給定層的所需吞吐量, 就可以計算該層所需節點數的下限. 要確定可達到的吞吐量, 最好使用合成或采樣 event 資料在硬體上試驗 Flume. 通常, 基于磁盤的 channel 應該獲得 10 的 MB / s, 而基于記憶體的 channel 應該達到 100 的 MB / s 或更多. 但性能會有很大差異, 具體取決于硬體和操作環境.

調整聚合吞吐量可以為每層提供所需節點數量的下限. 有幾個原因需要額外的節點, 例如增加冗余和更好地吸收負載中的突發.

故障排除

處理 agent 失敗

如果 Flume agent 程式關閉, 則該 agent 程式上托管的所有流程都將中止. 重新啟動 agent 后, 將恢復流程. 使用檔案 channel 或其他穩定 channel 的流將從中斷處繼續處理 event . 如果無法在同一硬體上重新啟動 agent , 則可以選擇將資料庫遷移到另一個硬體并設定新的 Flume agent , 該 agent 可以繼續處理 db 中保存的 event . 可以利用資料庫 HA 期貨將 Flume agent 移動到另一個主機.

兼容性

HDFS

目前 Flume 支持 HDFS 0.20.2 和 0.23.

組件摘要

Component InterfaceType AliasImplementation Class
org.apache.flume.Channelmemoryorg.apache.flume.channel.MemoryChannel
org.apache.flume.Channeljdbcorg.apache.flume.channel.jdbc.JdbcChannel
org.apache.flume.Channelfileorg.apache.flume.channel.file.FileChannel
org.apache.flume.Channelorg.apache.flume.channel.PseudoTxnMemoryChannel
org.apache.flume.Channelorg.example.MyChannel
org.apache.flume.Sourceavroorg.apache.flume.source.AvroSource
org.apache.flume.Sourcenetcatorg.apache.flume.source.NetcatSource
org.apache.flume.Sourceseqorg.apache.flume.source.SequenceGeneratorSource
org.apache.flume.Sourceexecorg.apache.flume.source.ExecSource
org.apache.flume.Sourcesyslogtcporg.apache.flume.source.SyslogTcpSource
org.apache.flume.Sourcemultiport_syslogtcporg.apache.flume.source.MultiportSyslogTCPSource
org.apache.flume.Sourcesyslogudporg.apache.flume.source.SyslogUDPSource
org.apache.flume.Sourcespooldirorg.apache.flume.source.SpoolDirectorySource
org.apache.flume.Sourcehttporg.apache.flume.source.http.HTTPSource
org.apache.flume.Sourcethriftorg.apache.flume.source.ThriftSource
org.apache.flume.Sourcejmsorg.apache.flume.source.jms.JMSSource
org.apache.flume.Sourceorg.apache.flume.source.avroLegacy.AvroLegacySource
org.apache.flume.Sourceorg.apache.flume.source.thriftLegacy.ThriftLegacySource
org.apache.flume.Sourceorg.example.MySource
org.apache.flume.Sinknullorg.apache.flume.sink.NullSink
org.apache.flume.Sinkloggerorg.apache.flume.sink.LoggerSink
org.apache.flume.Sinkavroorg.apache.flume.sink.AvroSink
org.apache.flume.Sinkhdfsorg.apache.flume.sink.hdfs.HDFSEventSink
org.apache.flume.Sinkhbaseorg.apache.flume.sink.hbase.HBaseSink
org.apache.flume.Sinkhbase2org.apache.flume.sink.hbase2.HBase2Sink
org.apache.flume.Sinkasynchbaseorg.apache.flume.sink.hbase.AsyncHBaseSink
org.apache.flume.Sinkelasticsearchorg.apache.flume.sink.elasticsearch.ElasticSearchSink
org.apache.flume.Sinkfile_rollorg.apache.flume.sink.RollingFileSink
org.apache.flume.Sinkircorg.apache.flume.sink.irc.IRCSink
org.apache.flume.Sinkthriftorg.apache.flume.sink.ThriftSink
org.apache.flume.Sinkorg.example.MySink
org.apache.flume.ChannelSelectorreplicatingorg.apache.flume.channel.ReplicatingChannelSelector
org.apache.flume.ChannelSelectormultiplexingorg.apache.flume.channel.MultiplexingChannelSelector
org.apache.flume.ChannelSelectororg.example.MyChannelSelector
org.apache.flume.SinkProcessordefaultorg.apache.flume.sink.DefaultSinkProcessor
org.apache.flume.SinkProcessorfailoverorg.apache.flume.sink.FailoverSinkProcessor
org.apache.flume.SinkProcessorload_balanceorg.apache.flume.sink.LoadBalancingSinkProcessor
org.apache.flume.SinkProcessor 
org.apache.flume.interceptor.Interceptortimestamporg.apache.flume.interceptor.TimestampInterceptor$Builder
org.apache.flume.interceptor.Interceptorhostorg.apache.flume.interceptor.HostInterceptor$Builder
org.apache.flume.interceptor.Interceptorstaticorg.apache.flume.interceptor.StaticInterceptor$Builder
org.apache.flume.interceptor.Interceptorregex_filterorg.apache.flume.interceptor.RegexFilteringInterceptor$Builder
org.apache.flume.interceptor.Interceptorregex_extractororg.apache.flume.interceptor.RegexFilteringInterceptor$Builder
org.apache.flume.channel.file.encryption.KeyProvider$Builderjceksfileorg.apache.flume.channel.file.encryption.JCEFileKeyProvider
org.apache.flume.channel.file.encryption.KeyProvider$Builderorg.example.MyKeyProvider
org.apache.flume.channel.file.encryption.CipherProvideraesctrnopaddingorg.apache.flume.channel.file.encryption.AESCTRNoPaddingProvider
org.apache.flume.channel.file.encryption.CipherProviderorg.example.MyCipherProvider
org.apache.flume.serialization.EventSerializer$Buildertextorg.apache.flume.serialization.BodyTextEventSerializer$Builder
org.apache.flume.serialization.EventSerializer$Builderavro_eventorg.apache.flume.serialization.FlumeEventAvroEventSerializer$Builder
org.apache.flume.serialization.EventSerializer$Builderorg.example.MyEventSerializer$Builder

別名約定

這些別名的約定在上面的組件特定示例中使用, 以使所有示例中的名稱保持簡短和一致.

Alias NameAlias Type
aagent
cchannel
rsource
ksink
gsink group
iinterceptor
ykey
hhost
sserializer

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/46530.html

標籤:大數據

上一篇:PB9 連接2008/2012 問題

下一篇:關于呼叫AVICAP32錄像問題.

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more