2013-05-03 143 views
5

目前我進入Apache Hadoop(使用Java實現MapReduce作業)。我研究了一些示例(如WordCount示例)。我在玩編寫自定義mapreduce應用程序(我使用Cloudera Hadoop Demo VM)方面取得了成功。我的問題是關於一些實現和運行時問題。Hadoop MapReduce,Java執行問題

的作業類的原型如下:

public class WordCount { 

    public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 
    public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
    // mapping 
     } 
    } 
    } 

    public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { 
    public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
     // reducing 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    JobConf conf = new JobConf(WordCount.class); 
    conf.setJobName("wordcount"); 
    // setting map and reduce classes, and various configs 
    JobClient.runJob(conf); 
    } 
} 

我有一些問題,我想谷歌他們,但Hadoop是很正規的,我必須告訴大家,文件(就像一個大參考書) ,不適合初學者。

我的問題:

  • 做的Map和Reduce類必須是靜態內部類中 主類,或者他們可以在任何地方
  • 你可以用任何東西(從Main僅可見?) Java SE和可用庫必須提供如普通Java SE應用程序一樣的功能嗎?我的意思是,像JAXB,番石榴,傑克遜JSON等
  • 什麼是編寫通用解決方案的最佳做法?我的意思是:我們想要以不同的(但稍微相似)方式處理大量的日誌文件。日誌文件的最後一個標記始終是包含一些條目的JSON映射。一個處理可以是:按照日誌行(keyA,keyB從地圖)進行計數和分組,並且另一個可以是:通過日誌行(keyX,來自地圖的keyY)進行計數和分組。 (我正在考慮一些基於配置文件的解決方案,您可以在其中爲程序提供實際所需的條目,如果您需要新的分辨率,則只需提供配置並運行應用程序即可)。
  • 可能相關:在WordCount示例中,Map和Reduce類是靜態內部類,main()對它們沒有影響,只是將這些類提供給框架。你可以讓這些類是非靜態的,提供一些字段和構造函數來改變運行時的一些當前值(如我提到的配置參數)。

也許我在挖掘細節不必要的。總體問題是:hadoop mapreduce程序仍然是我們習慣使用的常規JavaSE應用程序嗎?

回答

5

這是你的答案。

  1. 映射器和減速器類可以是在單獨的Java類,在封裝結構的任何地方或只要MapTask/ReduceTask的類加載器能夠加載映射器/減速器類在單獨的jar文件可以。您顯示的示例是針對Hadoop初學者的快速測試。

  2. 是的,您可以使用任何Java庫。應通過-files選項hadoop jar命令或使用Hadoop API將這些第三方罐子提供給MapTask/ReduceTask。查看此鏈接here有關將第三方庫添加到Map/Reduce類路徑的更多信息

  3. 是的,您可以使用這些方法之一配置並將配置傳遞到Map/Reduce作業。

    3。1使用org.apache.hadoop.conf.Configuration對象,如下設置在客戶端程序(配置Java類與main()方法

    Configuration conf = new Configuration(); conf.set("config1", "value1"); Job job = new Job(conf, "Whole File input");

的的Map/Reduce程序可以訪問配置對象,並獲取值設定對於使用get()方法的屬性,如果配置設置很小,則建議使用此方法

3.2使用分佈式緩存加載配置並使其在Map/Reduce程序中可用。單擊here分佈式緩存尾巴。這種方法更可取。

4. main()是應該負責配置和提交Hadoop作業的客戶端程序。如果沒有配置的設置,則默認設置將被使用。該配置,例如映射器類,消脂類,輸入路徑,輸出路徑,輸入格式類,減速器數等。如:

此外,看文檔here上作業配置

是,地圖/減少程序仍然是JavaSE程序,但它們分佈在Hadoop集羣中的各臺機器上。比方說,Hadoop集羣有100個節點並提交了字數統計的例子。 Hadoop框架創建Java進程爲這些地圖和Reduce任務,並調用回調方法,如map()/reduce()在哪裏的數據存在機器的子集。實質上,您的映射器/縮減器代碼將在存在數據的計算機上執行。我建議你閱讀的The Definitive Guide

我希望第6章,這有助於。

+0

謝謝,非常豐富! – gyorgyabraham 2013-05-06 12:11:56