使用分区为日期的文件从kafka写入hdfs的最有效方法是什么

时间:2013-07-02 13:22:17

标签: hadoop hdfs apache-kafka

我正在研究应该通过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文件夹。 这个问题的最佳解决方案/设计/开源是什么

5 个答案:

答案 0 :(得分:5)

您绝对应该从linkedIn查看Camus API实现。 Camus是LinkedIn的Kafka-> HDFS管道。它是一个mapreduce作业,可以从Kafka中分发数据。看看这个post我写的是一个简单的例子,它从twitter流中提取并根据推文时间戳写入HDFS。

项目可在github上获取 - https://github.com/linkedin/camus

Camus需要两个主要组件来读取和解码来自Kafka的数据并将数据写入HDFS -

解码从Kafka

读取的消息

Camus有一组解码器有助于解码来自Kafka的消息,Decoders基本上扩展了com.linkedin.camus.coders.MessageDecoder,它实现了基于时间戳分区数据的逻辑。此目录中存在一组预定义的解码器,您可以根据这些编写自己的解码器。 camus/camus-kafka-coders/src/main/java/com/linkedin/camus/etl/kafka/coders/

将消息写入HDFS

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提供的保证。

https://www.datatorrent.com/apphub/kafka-to-hdfs-sync/

答案 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可以插入。