2013-07-29 110 views
0

我想頻繁地將文件從文件服務器加載到HDFS。較小的文件(2 MB到20 MB)經常加載到文件服務器。這些文件必須加載到HDFS進行MR處理。 在將這些文件提供給Map-Reduce作業之前,我發現有兩個問題。Flume - 將文件從文件服務器加載到HDFS

  1. 如果這些文件在運行MR作業的時間挑選並加載到HDFS,則需要很長的這些加載到HDFS本身。

  2. 這些較小的文件必須合併MR作業。

問題

  1. 可水槽用來讀取更頻繁的文件服務器,這些較小的文件,並存儲在HDFS?

  2. 我知道有CombineFileInputFormat和SequenceFiles來組合這些文件進行處理,但是這些小文件可以連在它存儲在HDFS之前嗎?

回答

1

問題的可能答案。

這是一段時間以來,我使用了水槽。仍然希望他們幫助。

  1. 可水槽用來讀取更頻繁的文件服務器,這些較小的文件,並存儲在HDFS?

由於數據源是可定製的,水槽可用於傳輸事件的數據包括大量的數量,但不限於網絡流量數據,社交媒體產生的數據,電子郵件和幾乎任何數據源可能。

注意:Flume不支持tail作爲源。可以將tail命令包裝在一個可執行源中以流式傳輸該文件。

對於尾礦庫文件,您可以check this out

目錄爲多個文件源的實現可以tracked here

你可以閱讀有關HDFS sink here,可以寫信給HDFS

。我知道有CombineFileInputFormat和SequenceFiles 將這些文件合併處理,但是這些較小的文件是否可以在存儲在HDFS中之前連接成 ?

Flume基本上在Event機制上工作。可以根據所用時間或數據大小或事件數量定期滾動文件(關閉當前文件並創建一個新文件)。檢查HDFS接收器的相同鏈接。

如果文件數量很大,可以使用CombineFileINputFormat。在寫入HDFS之前,我不知道如何做到這一點。

注:

正如我已經說過水槽工作在基於事件的機制,據我知道這不是傳輸文件。如果你看看這個interface for Event,你會注意到下面的方法

byte[] getBody():返回此事件中包含的數據的原始字節數組。

void setBody(byte[] body):設置此事件中包含的數據的原始字節數組。

因此,一個事件的最大大小是byte []可以採用的大小。我不知道你的文件可以放在那裏。你必須自己測試它。此外,還有其他的條件,我現在不記得,可能會阻礙你將文件傳輸到HDFS。

+0

謝謝JtheRocker。實際上,我沒有對文件服務器目錄的任何控制,並且文件中不需要尾部。我需要flume在網絡位置將文件傳輸到HDFS,並在到達時或間隔時傳輸。這些文件的平均速度可能是每小時1000個文件,最高文件可能達到3000個。 – learninghuman

+0

@ManikandanKannan:請檢查 - 我已經更新了答案。 –

+0

謝謝。如果不是flume,還有其他方式將數據攝入HDFS嗎?一種選擇是將文件加載到hadoop namenode的本地文件系統中,然後使用HDFS put命令加載到HDFS中。 – learninghuman

相關問題