Hadoop(1.1.2)XML处理&重写文件

时间:2013-07-24 16:45:58

标签: java xml apache hadoop mapreduce

这里的第一个问题......并且学习hadoop ......

我花了两周的时间试图了解有关hadoop的一切,但似乎每座山都有一座山。

以下是设置:

  1. 很多(100万)小(<50MB)XML文件(格式化为XML的文档)。
  2. 每个文件都是记录/记录
  3. 伪分布式Hadoop集群(1.1.2)
  4. 使用旧的mapred API(可以更改,如果新API支持所需的内容)
  5. 我发现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();
        }
    }
    

1 个答案:

答案 0 :(得分:0)

我想说一个简单的解决方案是使用TextOutputFormat,然后使用Text作为输出键,NullWritable作为输出值。

TextOutputFormat使用分隔符分隔您从作业输出的键和值对。根据您的要求,您不需要这种安排,但您只想输出单个XML体。如果传递null或NullWritable作为输出键或值,TextOutputFormat将不会写入null或分隔符,只会写入非null键或值。

使用XmlINputFormat的另一种方法是使用WholeFileInput(详见Tom White的 Hadoop - 权威指南)。

无论如何,您需要编写映射器以使用输入值Text对象(可能使用XML SAX或DOM解析器),然后将转换后的XML输出为Text对象。