Flume (九) Channels - Kafka Channel

事件存儲在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.topica1.channels.k1.kafka.bootstrap.servers。 這與hdfs接收器的運行方式沒有什麼不同
  • 特定於producer/consumer的屬性以kafka.producerkafka.consumer爲前綴
  • 在可能的情況下,使用Kafka參數名稱,例如:bootstrap.serversacks

此版本的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_PLAINTEXTSASL_SSLSSL。 有關安全設置的其他信息,請參見下文。
kafka.consumer.security.protocol PLAINTEXT kafka.producer.security.protocol相同,但是用於從Kafkareading/consuming。
more producer/consumer security props 如果使用SASL_PLAINTEXT,則SASL_SSLSSL會引用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):

如果還需要客戶端身份驗證,則還應將以下內容添加到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";
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章