1

这里的第一个问题......和学习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();
    }
}
4

1 回答 1

0

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

TextOutputFormat使用定界符分隔您从作业中输出的键值对。对于您的要求,您不需要这种安排,但您只想输出一个 XML 正文。如果您将 null 或 NullWritable 作为输出键或值传递,TextOutputFormat则不会写入 null 或分隔符,只会写入非空键或值。

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

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

于 2013-07-25T00:05:48.283 回答