从卡夫卡到HDFS的avro活动

时间:2015-10-23 19:23:40

标签: apache-kafka flume avro flume-ng

我有kafka集群接收来自制作人的avro事件。

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

这可能与水槽有关吗?

有没有人有配置文件示例演示如何操作?

Yosi

2 个答案:

答案 0 :(得分:1)

这确实是可能的。

如果你想从Kafka消费,那么你需要设置一个Kafka源和一个将使用Avro的HDFS接收器。

以下是Kafka源配置选项的链接:http://flume.apache.org/FlumeUserGuide.html#kafka-source

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

要使用Avro设置HDFS,您需要设置HDFS接收器,但很幸运,本网站介绍了如何执行此操作:http://thisdataguy.com/2014/07/28/avro-end-to-end-in-hdfs-part-2-flume-setup/

最后,您需要配置一个频道。我有使用Flume的内存通道和默认设置的经验(我相信......现在无法检查)并且它运行良好。

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

答案 1 :(得分:0)

请考虑这种情况。对于来自kafka的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中的最终输出文件将具有架构+数据。

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