我有kafka集群接收来自制作人的avro事件。
我想使用flume来使用这些事件并将它们作为avro文件放入HDFS中
这可能与水槽有关吗?
有没有人有配置文件示例演示如何操作?
Yosi
答案 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模式创建了配置单元表,我能够按预期访问数据。