2014-05-08 100 views
0

我有一個要求,我的MAP應該讀取一個大的HDFS文本文件,並將其作爲「text_file_name text_file_contents」作爲key:value對寫入序列文件。寫入hdfs序列文件

我的映射器然後將這個序列文件的路徑發送到Reducer。

目前我在做什麼是:

  • 讀取文本文件中的所有行,並保持它們追加到文本()變量(例如,「內容」)。
  • 進行一次讀取整個文本文件,「內容」寫入序列文件

但是,我不知道短信()是否能夠存儲大文件。因此,要做到以下幾點:

  • 讀取文本文件一行
  • 使用它寫入序列文件(writer.append(鍵,值),其中「作家」是SequenceFile.Writer)
  • 直到整個文本文件被寫入。

這種方法的問題是,它會在我寫入序列文件的每一行寫入「key」。

所以,只是想知道,

  • 如果文本()可以存儲任何大小的文件,如果我繼續追加了嗎?
  • 我該如何避免在writer.append()中寫入「key」,但是第一次寫入?
  • 可以使用writer.appendRaw()。我沒有得到關於這個功能的足夠的文檔。
+0

AFAIK'Text()'的大小沒有限制,但是直到寫入之前都存儲在內存中,所以這裏的綁定是Hadoop worker分配的堆大小。這些文件有多大? –

+0

目前我的檔案並不大。但是,我希望我的程序能夠處理這種情況。實際上,我想在序列文件中以Json格式編寫輸出。因此,擔心如果Json數據碰巧很大,那麼我將只能在序列文件的第一行中寫入部分數據,並在接下來的幾行中寫入剩餘數據。但是,即使我能夠在seq中的一行中編寫非常大的json數據。文件,在從文件中讀取文件時,可能無法在Text()變量中調用(由於堆大小限制)。 – user3548344

+0

爲什麼你需要在mapper中完成這件事?如果你可以同時使用map和reduce階段,解決方案非常簡單 – Sudarshan

回答

0

爲了回答您的問題:

  1. 文本()可以存儲高達最大2GB的。
  2. 您可以通過編寫NullWritable或將key.ignore設置爲false來避免編寫密鑰。

但是,當你第一次使用第二種方法時,你也不能寫你的密鑰。所以最好使用NullWritable