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 = 
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 = 

注意:默认情况下,未定义属性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 = 
a1.channels.channel1.kafka.consumer.ssl.keystore.location = /path/to/client.keystore.jks
a1.channels.channel1.kafka.consumer.ssl.keystore.password = 

如果密钥库和密钥使用不同的密码保护,则ssl.key.password属性将为consume和 producer密钥库提供所需的额外密钥:

a1.channels.channel1.kafka.producer.ssl.key.password = 
a1.channels.channel1.kafka.consumer.ssl.key.password = 

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 = 
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 = 

示例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";
};

你可能感兴趣的:(flume)