事件存儲在Kafka羣集中(必須單獨安裝)。 Kafka提供高可用性和複用(high availability and replication),因此如果代理或kafka代理崩潰,事件可立即用於其他接收器.
Kafka channel 可用於多種場景:
- 使用Flume source and sink - 它爲事件提供了可靠且高度可用的通道
- 使用Flume source and interceptor但沒有sink - 它允許將Flume事件寫入Kafka主題,供其他應用程序使用
- 使用Flume sink,但沒有source - 它是一種低延遲,容錯的方式將事件從Kafka發送到Flume接收器,如HDFS,HBase或Solr
由於依賴於該版本附帶的Kafka客戶端,此版本的Flume需要Kafka 0.9或更高版本。 與之前的Flume版本相比,channel的配置發生了變化。
配置參數組織如下:
- 通常與通道相關的配置值應用於通道配置級別,例如:
a1.channel.k1.type =
- 與Kafka或Channel運行方式相關的配置值以
"kafka."
爲前綴(這對於CommonClient Configs是有效的),例如:a1.channels.k1.kafka.topic
和a1.channels.k1.kafka.bootstrap.servers
。 這與hdfs接收器的運行方式沒有什麼不同 - 特定於producer/consumer的屬性以
kafka.producer
或kafka.consumer
爲前綴 - 在可能的情況下,使用Kafka參數名稱,例如:
bootstrap.servers
和acks
此版本的flume與以前的版本向後兼容,但是下表中顯示了已棄用的屬性,並且在配置文件中存在時會在啓動時記錄警告消息。
Property Name | Default | Description |
---|---|---|
type | – | 組件類型名稱,需要是org.apache.flume.channel.kafka.KafkaChannel |
kafka.bootstrap.servers | - | channel使用的Kafka集羣中的代理列表,可以是部分代理,但我們建議至少兩個,因爲HA。 格式爲逗號分隔的hostname:port 列表 |
kafka.topic | flume-channel | channel將使用的Kafka主題 |
kafka.consumer.group.id | flume | channel用於向Kafka註冊的消費者羣組ID。 多個channel必須使用相同的topic和group ,以確保當一個代理失敗時,另一個可以獲取數據。請注意,使具有相同ID的non-channel消費者可能導致數據丟失。 |
parseAsFlumeEvent | true | 期望在channel中使用FlumeEvent模式的Avro基準。 如果Flume源寫入通道,則應該爲true ;如果其他producers正在寫入channel正在使用的主題,則應爲false 。 通過使用flume-ng-sdk工件提供的org.apache.flume.source.avro.AvroFlumeEvent ,可以在Flume之外解析到Kafka的Flume源消息 |
migrateZookeeperOffsets | true | 如果找不到Kafka存儲的偏移量,請在Zookeeper中查找偏移量並將它們提交給Kafka。 這應該是支持從舊版本的Flume無縫Kafka客戶端遷移。 遷移後,可以將其設置爲false,但通常不需要這樣做。 如果未找到Zookeeper偏移量,則kafka.consumer.auto.offset.reset 配置定義如何處理偏移量。 |
pollTimeout | 500 | 在消費者調用的“poll()”中等待的時間(以毫秒爲單位)。https://kafka.apache.org/090/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#poll(long) |
defaultPartitionId | – | 指定要發送到此通道中的所有事件的Kafka分區ID(整數),除非被partitionIdHeader 覆蓋。 默認情況下,如果未設置此屬性,則事件將由Kafka Producer的分區程序分發 - 包括key (如果指定)(或由kafka.partitioner.class 指定的分區程序)。 |
partitionIdHeader | – | 設置時,生產者將從事件頭中獲取使用此屬性的值命名的字段的值,並將消息發送到主題的指定分區。 如果該值表示無效分區,則該事件將不被接受。 如果存在標頭值,則此設置將覆蓋defaultPartitionId 。 |
kafka.consumer.auto.offset.reset | latest | 當Kafka中沒有初始偏移量或服務器上當前偏移量不再存在時(例如因爲該數據已被刪除)該怎麼辦:最早:自動將偏移量重置爲最早的最新偏移量:自動重置偏移量 到最新的偏移量none:如果沒有爲消費者組找到任何其他偏移量,則向消費者拋出異常:向消費者拋出異常。 |
kafka.producer.security.protocol | PLAINTEXT | 如果使用某種級別的安全性寫入Kafka,則設置爲SASL_PLAINTEXT ,SASL_SSL 或SSL 。 有關安全設置的其他信息,請參見下文。 |
kafka.consumer.security.protocol | PLAINTEXT | 與kafka.producer.security.protocol 相同,但是用於從Kafkareading/consuming。 |
more producer/consumer security props | 如果使用SASL_PLAINTEXT ,則SASL_SSL 或SSL 會引用Kafka安全性以獲取需要在producer/consumer上設置的其他屬性。 |
不推薦使用的屬性
Property Name | Default | Description |
---|---|---|
brokerList | – | channel使用的Kafka集羣中的brokers列表,可以是部分brokers,但我們建議至少兩個,因爲HA。 格式爲逗號分隔的hostname:port 列表 |
topic | flume-channel | 使用kafka.topic |
groupId | flume | 使用kafka.consumer.group.id |
readSmallestOffset | false | 使用kafka.consumer.auto.offset.reset |
注意:由於通道負載平衡的方式,代理首次啓動時可能會出現重複事件
Example for agent named a1:
a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9092,kafka-2:9092,kafka-3:9092
a1.channels.channel1.kafka.topic = channel1
a1.channels.channel1.kafka.consumer.group.id = flume-consumer
Security and Kafka Channel:
Flume和Kafka之間的通信渠道支持安全認證和數據加密。 對於安全身份驗證,可以使用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時性能會下降,其大小取決於CPU類型和JVM實現。 參考:Kafka安全概述和跟蹤此問題的jira:KAFKA-2561
TLS and Kafka Channel:
請閱讀配置Kafka客戶端SSL中描述的步驟,以瞭解用於微調的其他配置設置,例如以下任何一項:安全提供程序,密碼套件,啓用的協議,信任庫或密鑰庫類型。
配置服務器端身份驗證和數據加密的示例。
a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093
a1.channels.channel1.kafka.topic = channel1
a1.channels.channel1.kafka.consumer.group.id = flume-consumer
a1.channels.channel1.kafka.producer.security.protocol = SSL
a1.channels.channel1.kafka.producer.ssl.truststore.location = /path/to/truststore.jks
a1.channels.channel1.kafka.producer.ssl.truststore.password = <password to access the truststore>
a1.channels.channel1.kafka.consumer.security.protocol = SSL
a1.channels.channel1.kafka.consumer.ssl.truststore.location = /path/to/truststore.jks
a1.channels.channel1.kafka.consumer.ssl.truststore.password = <password to access the truststore>
注意:默認情況下,未定義屬性
ssl.endpoint.identification.algorithm
,因此不會執行主機名驗證。 要啓用主機名驗證,請設置以下屬性a1.channels.channel1.kafka.producer.ssl.endpoint.identification.algorithm = HTTPS
a1.channels.channel1.kafka.consumer.ssl.endpoint.identification.algorithm = HTTPS
啓用後,客戶端將根據以下兩個字段之一驗證服務器的完全限定域名(FQDN):
- 通用名稱(CN)https://tools.ietf.org/html/rfc6125#section-2.3
- 主題備選名稱(SAN)https://tools.ietf.org/html/rfc5280#section-4.2.1.6
如果還需要客戶端身份驗證,則還應將以下內容添加到Flume代理配置中。 每個Flume代理都必須擁有其客戶證書,該證書必須由Kafka brokers單獨或通過其簽名鏈進行信任。 常見示例是由單個根CA簽署每個客戶端證書,而後者又由Kafka代理信任。
a1.channels.channel1.kafka.producer.ssl.keystore.location = /path/to/client.keystore.jks
a1.channels.channel1.kafka.producer.ssl.keystore.password = <password to access the keystore>
a1.channels.channel1.kafka.consumer.ssl.keystore.location = /path/to/client.keystore.jks
a1.channels.channel1.kafka.consumer.ssl.keystore.password = <password to access the keystore>
如果密鑰庫和密鑰使用不同的密碼保護,則ssl.key.password屬性將爲consume和 producer密鑰庫提供所需的額外密鑰:
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 and Kafka Channel:
要將Kafka通道與使用Kerberos保護的Kafka羣集一起使用,請爲producer和/或consumer設置上面提到的producer/consumer.security.protocol
屬性。 與Kafka brokers 一起使用的Kerberos密鑰表和主體在JAAS文件的“KafkaClient”部分中指定。 “Client”部分描述了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.KafkaChannel
a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093
a1.channels.channel1.kafka.topic = channel1
a1.channels.channel1.kafka.consumer.group.id = flume-consumer
a1.channels.channel1.kafka.producer.security.protocol = SASL_PLAINTEXT
a1.channels.channel1.kafka.producer.sasl.mechanism = GSSAPI
a1.channels.channel1.kafka.producer.sasl.kerberos.service.name = kafka
a1.channels.channel1.kafka.consumer.security.protocol = SASL_PLAINTEXT
a1.channels.channel1.kafka.consumer.sasl.mechanism = GSSAPI
a1.channels.channel1.kafka.consumer.sasl.kerberos.service.name = kafka
使用SASL_SSL的示例安全配置:
a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093
a1.channels.channel1.kafka.topic = channel1
a1.channels.channel1.kafka.consumer.group.id = flume-consumer
a1.channels.channel1.kafka.producer.security.protocol = SASL_SSL
a1.channels.channel1.kafka.producer.sasl.mechanism = GSSAPI
a1.channels.channel1.kafka.producer.sasl.kerberos.service.name = kafka
a1.channels.channel1.kafka.producer.ssl.truststore.location = /path/to/truststore.jks
a1.channels.channel1.kafka.producer.ssl.truststore.password = <password to access the truststore>
a1.channels.channel1.kafka.consumer.security.protocol = SASL_SSL
a1.channels.channel1.kafka.consumer.sasl.mechanism = GSSAPI
a1.channels.channel1.kafka.consumer.sasl.kerberos.service.name = kafka
a1.channels.channel1.kafka.consumer.ssl.truststore.location = /path/to/truststore.jks
a1.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 required
useKeyTab=true
storeKey=true
keyTab="/path/to/keytabs/flume.keytab"
principal="flume/flumehost1.example.com@YOURKERBEROSREALM";
};
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="/path/to/keytabs/flume.keytab"
principal="flume/flumehost1.example.com@YOURKERBEROSREALM";
};