我是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