我正在研究应该通过kafka写入hdfs的项目。 假设有在线服务器将消息写入kafka。每条消息都包含时间戳。 我想根据消息中的时间戳创建一个输出将是文件/文件的作业。 例如,如果kafka中的数据是
{"ts":"01-07-2013 15:25:35.994", "data": ...}
...
{"ts":"01-07-2013 16:25:35.994", "data": ...}
...
{"ts":"01-07-2013 17:25:35.994", "data": ...}
我想将3个文件作为输出
kafka_file_2013-07-01_15.json
kafka_file_2013-07-01_16.json
kafka_file_2013-07-01_17.json
当然,如果我再次运行这个工作,并且队列中有一条新消息,如
{"ts":"01-07-2013 17:25:35.994", "data": ...}
它应该创建一个文件
kafka_file_2013-07-01_17_2.json // second chunk of hour 17
我见过一些开源,但大多数都是从kafka读到一些hdfs文件夹。 这个问题的最佳解决方案/设计/开源是什么
答案 0 :(得分:5)
您绝对应该从linkedIn查看Camus API
实现。 Camus是LinkedIn的Kafka-> HDFS管道。它是一个mapreduce作业,可以从Kafka中分发数据。看看这个post我写的是一个简单的例子,它从twitter流中提取并根据推文时间戳写入HDFS。
项目可在github上获取 - https://github.com/linkedin/camus
Camus需要两个主要组件来读取和解码来自Kafka的数据并将数据写入HDFS -
Camus有一组解码器有助于解码来自Kafka的消息,Decoders基本上扩展了com.linkedin.camus.coders.MessageDecoder
,它实现了基于时间戳分区数据的逻辑。此目录中存在一组预定义的解码器,您可以根据这些编写自己的解码器。 camus/camus-kafka-coders/src/main/java/com/linkedin/camus/etl/kafka/coders/
Camus需要一组RecordWriterProvider类,它们扩展com.linkedin.camus.etl.RecordWriterProvider
,告诉Camus应该写入HDFS的有效负载。这个目录中有一组预定义的RecordWriterProvider,您可以根据这些编写自己的
camus-etl-kafka/src/main/java/com/linkedin/camus/etl/kafka/common
答案 1 :(得分:2)
如果您正在寻找更实时的方法,请查看StreamSets Data Collector。它也是用于摄取的Apache许可开源工具。
HDFS目标可配置为根据您指定的模板写入基于时间的目录。它已经包含一种在传入消息中指定字段的方法,用于确定消息的写入时间。配置被称为"时间基础"你可以指定类似${record:value("/ts")}
的内容。
*完全披露我是一名从事此工具的工程师。
答案 2 :(得分:1)
检查一下从Kafka到HDFS的持续摄取。由于它取决于Apache Apex,因此它具有Apex提供的保证。
答案 3 :(得分:1)
如果您使用的是Apache Kafka 0.9或更高版本,则可以使用Kafka Connect API。
结帐https://github.com/confluentinc/kafka-connect-hdfs
这是一个Kafka连接器,用于在Kafka和HDFS之间复制数据。
答案 4 :(得分:0)
结帐加缪: https://github.com/linkedin/camus
这将以Avro格式写入数据,但其他RecordWrite可以插入。