Apache kafka 从卡夫卡到HDFS(带水槽)的avro事件

Apache kafka 从卡夫卡到HDFS(带水槽)的avro事件,apache-kafka,flume,avro,flume-ng,Apache Kafka,Flume,Avro,Flume Ng,我有一个卡夫卡集群,它从制作人那里接收avro事件 我想使用flume来使用这些事件,并将它们作为avro文件放在HDFS中 水槽能这样吗 是否有人有配置文件的示例来演示如何执行此操作 Yosi这确实是可能的 如果您希望从Kafka消费,则需要设置一个Kafka源和一个将使用Avro的HDFS接收器 以下是指向Kafka源的配置选项的链接: 设置源配置非常简单。当然,您需要对此进行测试,以验证您选择的设置在您的系统中运行良好 要使用Avro设置HDFS,您需要设置HDFS接收器,幸运的是,本网站

我有一个卡夫卡集群,它从制作人那里接收avro事件

我想使用flume来使用这些事件,并将它们作为avro文件放在HDFS中

水槽能这样吗

是否有人有配置文件的示例来演示如何执行此操作


Yosi

这确实是可能的

如果您希望从Kafka消费,则需要设置一个Kafka源和一个将使用Avro的HDFS接收器

以下是指向Kafka源的配置选项的链接:

设置源配置非常简单。当然,您需要对此进行测试,以验证您选择的设置在您的系统中运行良好

要使用Avro设置HDFS,您需要设置HDFS接收器,幸运的是,本网站介绍了如何设置HDFS接收器:

最后,您需要配置一个通道。我有使用Flume的内存通道和默认设置的经验(我相信…现在无法检查),它工作得很好


我建议您花点时间阅读Flume文档:因为所有这些信息都包含在这里。在设置Flume代理以处理数据之前,了解正在使用的系统非常重要。

请考虑这种情况。对于来自卡夫卡的avro事件(只有二进制数据,没有模式),下面是为我工作的代理

架构将使用下面的代理添加到接收器端

#source
MY_AGENT.sources.my-source.type = org.apache.flume.source.kafka.KafkaSource
MY_AGENT.sources.my-source.channels = my-channel
MY_AGENT.sources.my-source.batchSize = 10000
MY_AGENT.sources.my-source.useFlumeEventFormat = false
MY_AGENT.sources.my-source.batchDurationMillis = 5000
MY_AGENT.sources.my-source.kafka.bootstrap.servers =${BOOTSTRAP_SERVERS}
MY_AGENT.sources.my-source.kafka.topics = my-topic
MY_AGENT.sources.my-source.kafka.consumer.group.id = my-topic_grp
MY_AGENT.sources.my-source.kafka.consumer.client.id = my-topic_clnt
MY_AGENT.sources.my-source.kafka.compressed.topics = my-topic
MY_AGENT.sources.my-source.kafka.auto.commit.enable = false
MY_AGENT.sources.my-source.kafka.consumer.session.timeout.ms=100000
MY_AGENT.sources.my-source.kafka.consumer.request.timeout.ms=120000
MY_AGENT.sources.my-source.kafka.consumer.max.partition.fetch.bytes=704857
MY_AGENT.sources.my-source.kafka.consumer.auto.offset.reset=latest

#channel
MY_AGENT.channels.my-channel.type = memory
MY_AGENT.channels.my-channel.capacity = 100000000
MY_AGENT.channels.my-channel.transactionCapacity = 100000
MY_AGENT.channels.my-channel.parseAsFlumeEvent = false

#Sink
MY_AGENT.sinks.my-sink.channel = my-channel
MY_AGENT.sinks.my-sink.type = hdfs
MY_AGENT.sinks.my-sink.hdfs.writeFormat= Text
MY_AGENT.sinks.my-sink.hdfs.fileType = DataStream
MY_AGENT.sinks.my-sink.hdfs.kerberosPrincipal =${user}
MY_AGENT.sinks.my-sink.hdfs.kerberosKeytab =${keytab}
MY_AGENT.sinks.my-sink.hdfs.useLocalTimeStamp = true
MY_AGENT.sinks.my-sink.hdfs.path = hdfs://nameservice1/my_hdfs/my_table1/timestamp=%Y%m%d
MY_AGENT.sinks.my-sink.hdfs.rollCount=0
MY_AGENT.sinks.my-sink.hdfs.rollSize=0
MY_AGENT.sinks.my-sink.hdfs.batchSize=100000
MY_AGENT.sinks.my-sink.hdfs.maxOpenFiles=2000
MY_AGENT.sinks.my-sink.hdfs.callTimeout=50000
MY_AGENT.sinks.my-sink.hdfs.fileSuffix=.avro

MY_AGENT.sinks.my-sink.serializer = org.apache.flume.sink.hdfs.AvroEventSerializer$Builder
MY_AGENT.sinks.my-sink.serializer.schemaURL = hdfs://nameservice1/my_hdfs/avro_schemas/${AVSC_FILE}
我想强调的几件事

MY_AGENT.sinks.MY sink.hdfs.writeFormat=Text
。。帮助仅转储来自Flume事件的数据(忽略Flume事件标题…)

MY_AGENT.sinks.MY-sink.serializer.schemaURL=hdfs://nameservice1/my_hdfs/avro_schemas/${AVSC_FILE}
。。需要传递适当的模式(将添加到avro文件中的二进制数据)。hdfs中的最终输出文件将具有schema+数据


将数据存储在HDFS中后,使用适当的avro模式创建了配置单元表,我可以按预期访问数据。

您是否尝试过这样做?例如:您最终使用@yosi的解决方案是什么?是否可以将avro数据作为“字节流”写入HDFS,而不指定模式来解码数据?据我所知,avro模式是在序列化数据中编码的。