这里的第一个问题。。。学习hadoop。。。
在过去的两周里,我一直在努力理解hadoop的一切,但似乎每座山背后都有一座山
设置如下:
- 大量(100万)的小型(<50MB)XML文件(格式化为XML的文档)
- 每个文件都是一个记录
- 伪分布式Hadoop集群(1.1.2)
- 使用旧的mapred API(如果新的API支持所需内容,则可以更改)
我发现XmlInputFormat("Mahout XmlInputFormat")是读取文件的一个很好的起点,因为我可以将整个XML文档指定为
我的理解是XmlInputFormat将负责确保每个文件都是它自己的记录(因为每个文件/记录存在1个标记)。
我的问题是:我想使用Hadoop处理每个文档,搜索信息,然后为每个文件/记录重写或输出一个添加了新xml标记的新xml文档。
不怕阅读和学习,但一个可以玩的骨架真的会帮助我"玩"和学习hadoop
这是我的司机:
public static void main(String[] args) {
JobConf conf = new JobConf(myDriver.class);
conf.setJobName("bigjob");
// Input/Output Directories
if (args[0].length()==0 || args[1].length()==0) System.exit(-1);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
conf.set("xmlinput.start", "<document>");
conf.set("xmlinput.end", "</document>");
// Mapper & Combiner & Reducer
conf.setMapperClass(Mapper.class);
conf.setReducerClass(Reduce.class);
conf.setNumReduceTasks(0);
// Input/Output Types
conf.setInputFormat(XmlInputFormat.class);
conf.setOutputFormat(?????);
conf.setOutputKeyClass(????);
conf.setOutputValueClass(????);
try {
JobClient.runJob(conf);
} catch (Exception e) {
e.printStackTrace();
}
}
我认为一个简单的解决方案是使用TextOutputFormat
,然后使用Text
作为输出键,使用NullWritable
作为输出值。
TextOutputFormat
使用分隔字符来分隔从作业输出的键和值对。对于您的需求,您不需要这种安排,但您只想输出单个XML体。如果将null或NullWritable作为输出键或值传递,TextOutputFormat
将不写入null或分隔符,只写入非null键或值。
使用XmlINputFormat的另一种方法是使用WholeFileInput(如Tom White的Hadoop-权威指南中所述)。
否则,您需要编写映射程序来使用输入值Text对象(可能使用XMLSAX或DOM解析器),然后将转换后的XML输出为Text对象。