如何将JSON写入由Kafka的日期划分的HDFS

时间:2017-05-02 22:35:25

标签: json hdfs apache-kafka flume

我们在kafka中有jsons如下: {'date':'2017-01-01','timestamp':1483228800,'field1':xxxx,...}。 {'date':'2017-01-02','timestamp':1483315200,'field1':xxxx,...}。 我们想使用flume从kafka加载事件到hdfs。我们希望文件按日期从json分区。但是,我们不知道水槽是否支持此功能。似乎只有httpsource支持jsonhandler。我想知道kafka源是否有相同的支持。

我们的配置

a.sources = kafka1
a.channels = channel1
a.sinks = hdfs1
a.sources.kafka1.channel = channel1
a.sources.kafka1.type =  org.apache.flume.source.kafka.KafkaSource

a.sources.kafka1.topic = topic1

a.channels.channel1.type = memory
a.sinks.hdfs1.type = hdfs
a.sinks.hdfs1.channel = channel1
a.sinks.hdfs1.path = maprfs:///user/abc/topic1/date=%{date}
a.sinks.hdfs1.fileType = SequenceFile
a.sinks.hdfs1.useLocalTimeStamp = false

因此,日期为空。如何获得实际日期值? 任何帮助将不胜感激。 非常感谢

2 个答案:

答案 0 :(得分:0)

我发现了一种方法。基本上,我们需要添加正则表达式拦截器来提取日期信息并将其放入“水槽标题”中。

答案 1 :(得分:0)

如果您的Kafka频道由JSON对象填充,您可以按如下方式设置代理:

a.channels= kafka1
a.sinks = hdfs1

a.channels.kafka1.type = org.apache.flume.channel.kafka.KafkaChannel
a.channels.kafka1.kafka.bootstrap.servers = hostnameorip:9092,hostnameorip:9092
a.channels.kafka1.kafka.topic = topic_sample
a.channels.kafka1.kafka.consumer.group.id = consumer_group_sample

a.sinks.hdfs1.type = hdfs
a.sinks.hdfs1.channel = kafka1
a.sinks.hdfs1.path = /user
a.sinks.hdfs1.fileType = SequenceFile
a.sinks.hdfs1.filePrefix = /abc/topic1/date=%{date}

我不是Flume的专家,但如果你想做的只是从Kafka拉出事件并存储在HDFS中,你就不需要使用源码。您可以通过引用字段名称从JSON事件中提取字段以在文件名中使用:%{field}

我希望这会有所帮助