2013-07-24 54 views
1

第一個問題......和學習的Hadoop ...的Hadoop(1.1.2)XML處理和重寫文件在這裏

我已經花了過去兩週試圖瞭解關於Hadoop的一切,但似乎每座山都有一座山。

這裏的設置:小(< 50MB)XML文件(格式爲XML文檔)

  1. 地段(1元)。
  2. 每個文件是記錄/記錄使用舊的API mapred
  3. 僞分佈式Hadoop集羣(1.1.2)
  4. (可以改變,如果新的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(); 
    } 
} 

回答

0

我會說一個簡單的解決辦法請使用TextOutputFormat,然後使用Text作爲輸出鍵,並使用NullWritable作爲輸出值。

TextOutputFormat使用分隔符分隔您從作業輸出的鍵和值對。根據您的要求,您不需要這種安排,但您只想輸出一個XML體。如果您傳遞null或NullWritable作爲輸出鍵或值,則TextOutputFormat將不會寫入null或分隔符,只是非null鍵或值。

使用XmlINputFormat的另一種方法是使用WholeFileInput(詳見Tom White的Hadoop - 權威指南)。

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