[英]hadoop hdfs java - what is the best way to copy a list of files from hdfs to hdfs
[英]What is most efficient way to write from kafka to hdfs with files partitioning into dates
我正在研究应该通过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文件夹。 这个问题的最佳解决方案/设计/开源是什么
您一定要从linkedIn查看Camus API
实现。 Camus是LinkedIn的Kafka-> HDFS管道。 它是一个mapreduce作业,可以从Kafka中分发数据。 看看我为一个简单的例子写的这篇文章 ,它从twitter流中提取并根据推文时间戳写入HDFS。
项目可在github上获得 - https://github.com/linkedin/camus
Camus需要两个主要组件来读取和解码Kafka的数据并将数据写入HDFS -
Camus有一组com.linkedin.camus.coders.MessageDecoder
有助于解码来自Kafka的消息, com.linkedin.camus.coders.MessageDecoder
基本上扩展了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
如果您正在寻找更实时的方法,您应该查看StreamSets Data Collector 。 它也是一个Apache许可的开源工具,用于摄取。
HDFS目标可配置为根据您指定的模板写入基于时间的目录。 它已经包含一种在传入消息中指定字段的方法,用于确定消息的写入时间。 配置称为“时间基础”,您可以指定类似${record:value("/ts")}
。
*完全披露我是这个工具的工程师。
检查一下从Kafka到HDFS的持续摄取。 由于它依赖于Apache Apex ,因此它具有Apex提供的保证。
如果您使用的是Apache Kafka 0.9或更高版本,则可以使用Kafka Connect API。
看看https://github.com/confluentinc/kafka-connect-hdfs
这是一个Kafka连接器,用于在Kafka和HDFS之间复制数据。
Checkout Camus: https : //github.com/linkedin/camus
这将以Avro格式写入数据,但其他RecordWrite可插拔。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.