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



这里的第一个问题。。。学习hadoop。。。

在过去的两周里,我一直在努力理解hadoop的一切,但似乎每座山背后都有一座山

设置如下:

  1. 大量(100万)的小型(<50MB)XML文件(格式化为XML的文档)
  2. 每个文件都是一个记录
  3. 伪分布式Hadoop集群(1.1.2)
  4. 使用旧的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对象。

相关内容

  • 没有找到相关文章

最新更新