0
我有一個要求,我的MAP應該讀取一個大的HDFS文本文件,並將其作爲「text_file_name text_file_contents」作爲key:value對寫入序列文件。寫入hdfs序列文件
我的映射器然後將這個序列文件的路徑發送到Reducer。
目前我在做什麼是:
- 讀取文本文件中的所有行,並保持它們追加到文本()變量(例如,「內容」)。
- 進行一次讀取整個文本文件,「內容」寫入序列文件
但是,我不知道短信()是否能夠存儲大文件。因此,要做到以下幾點:
- 讀取文本文件一行
- 使用它寫入序列文件(writer.append(鍵,值),其中「作家」是SequenceFile.Writer)
- 直到整個文本文件被寫入。
這種方法的問題是,它會在我寫入序列文件的每一行寫入「key」。
所以,只是想知道,
- 如果文本()可以存儲任何大小的文件,如果我繼續追加了嗎?
- 我該如何避免在writer.append()中寫入「key」,但是第一次寫入?
- 可以使用writer.appendRaw()。我沒有得到關於這個功能的足夠的文檔。
AFAIK'Text()'的大小沒有限制,但是直到寫入之前都存儲在內存中,所以這裏的綁定是Hadoop worker分配的堆大小。這些文件有多大? –
目前我的檔案並不大。但是,我希望我的程序能夠處理這種情況。實際上,我想在序列文件中以Json格式編寫輸出。因此,擔心如果Json數據碰巧很大,那麼我將只能在序列文件的第一行中寫入部分數據,並在接下來的幾行中寫入剩餘數據。但是,即使我能夠在seq中的一行中編寫非常大的json數據。文件,在從文件中讀取文件時,可能無法在Text()變量中調用(由於堆大小限制)。 – user3548344
爲什麼你需要在mapper中完成這件事?如果你可以同時使用map和reduce階段,解決方案非常簡單 – Sudarshan