我是Hadoop的新手,但這是我上個月的一個學習項目。Hadoop 1輸入文件= 1輸出文件,僅限地圖
在試圖保持這種含糊不清的,是有用的人,讓我扔出去的基本目標第一....假設:
- 你有一個大的數據集(明顯),數以百萬計基本的ASCII文本文件。
- 每個文件都是「記錄」。
- 的記錄被存儲在一個目錄結構,以確定客戶&日期
- 例如/用戶/ hduser /數據/ customer1表/ YYYY-MM-DD,/用戶/ hduser /數據/的customer2/YYYY-MM-DD
- 你想模仿輸入結構的輸出結構
- 例如/用戶/ hduser /出/ customer1表/ YYYY-MM-DD,/用戶/ hduser /出/的customer2/YYYY-MM-DD
我已經看過多線程:
- Multiple output path java hadoop mapreduce
- MultipleTextOutputFormat alternative in new api
- Separate Output files in Hadoop mapreduce
- Speculative Task Execution - 要嘗試解決-m部分####的問題
還有更多..我也一直在閱讀湯姆懷特的Hadoop書。我一直在努力學習這一點。而且我經常在新API和舊API之間交換,這增加了嘗試學習這一點的困惑。
許多人指出MultipleOutputs(或舊的api版本),但我似乎無法產生我想要的輸出 - 例如,MultipleOutputs似乎不接受「/」來創建目錄結構寫()
需要採取哪些步驟來創建具有所需輸出結構的文件? 目前,我有一個WholeFileInputFormat類,以及相關RecordReader具有(NullWritable K,ByteWritable V)對(如果需要的話,可以改變)
我的地圖設置:
public class MapClass extends Mapper<NullWritable, BytesWritable, Text, BytesWritable> {
private Text filenameKey;
private MultipleOutputs<NullWritable, Text> mos;
@Override
protected void setup(Context context) throws IOException, InterruptedException {
InputSplit split = context.getInputSplit();
Path path = ((FileSplit) split).getPath();
filenameKey = new Text(path.toString().substring(38)); // bad hackjob, until i figure out a better way.. removes hdfs://master:port/user/hduser/path/
mos = new MultipleOutputs(context);
}
}
還有一個清理()函數調用mos.close()和圖()功能是目前未知的(我需要幫助這裏)
這是足夠的信息指出一個新手在答案的方向?我的下一個想法是在每個map()任務中創建一個MultipleOutputs()對象,每個對象都有一個新的baseoutput字符串,但我不確定它是否有效,甚至是正確的操作。
建議將不勝感激,程序中的任何內容都可以改變,除了輸入 - 我只是想學習框架 - 但我想盡可能接近這個結果(稍後我可能會考慮將記錄結合到更大的文件,但它們已經是每個記錄20MB,並且我想確保它在我無法在記事本中讀取之前能夠正常工作。
編輯:可以通過修改/擴展TextOutputFormat.class?似乎它可能有一些方法可以工作,但我不確定哪些方法我需要重寫...
我還沒有嘗試過,但書「的Hadoop權威指南」說,從最新的API中MultipleOutputs支持使用文件路徑分隔符(/)。你是說它不起作用嗎? – Rags
@Rags這可能是我執行MultipleOutputs時的一個錯誤 – Pseudo