![](/img/trans.png)
[英]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.