簡體   English   中英

Hadoop(1.1.2)XML處理和重寫文件

[英]Hadoop (1.1.2) XML processing & re-writing file

這里的第一個問題...和學習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不會只寫非空鍵或值,而不會寫空值或定界符。

使用XmlINputFormat的另一種方法是使用WholeFileInput(如Tom White的Hadoop-權威指南中所述 )。

無論哪種方式,您都需要編寫映射器以使用輸入值Text對象(可能帶有XML SAX或DOM解析器),然后將轉換后的XML作為Text對象輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM