2013年3月25日 星期一

Spring Data - Hadoop and MapReduce



O'Reilly 的 Spring Data 這本書中文翻譯本出了!速度真快,英文版都還沒看幾張就翻譯好了~@o@ 對於資訊焦慮又懶惰如我的人來說,這本書的架構清楚有條理,內容算是深入淺出可以很快就吸收。

話說這次會想要看這本書主要是想搞清楚Spring Data 對於在寫Hadoop的程式能有啥幫助,因為以前用過Spring Data 搭配MongoDB就覺得很方便。

這本書為了讓讀者容易了解Spring Data的好處,所以在鋪陳上有下一番功夫,首先先介紹一般MapReduce程式是如何撰寫,有什麼麻煩和不方變得地方,如果用了Spring Data 以後能有什麼改變,甚至還進一步的建議讀者搭配Spring Integration 和 Spring Batch 一起服用。

首先作者先以Hadoop 的 hello word - word count來舉例,一般Hadoop必須怎麼寫與執行,必須先設定好Hadoop的環境變數,然後再執行以下指令:

# hadoop jar hadoop-examples-1.0.1.jar wordcount /user/howie/input/article.txt /user/howie/output


但是真實世界的案例,一定是希望能透過傳遞參數直接改變程式所要連接的對象(比如說不同的Hadoop Server),因此這本書透過範例,一步一步取代傳統的作法,首先先利用maven 的appassembler:assemble 功能,包成在Linux下的執行檔:

# cd hadoop/wordcount
# mvn clean package appassembler:assemble
# sh ./target/appassembler/bin/wordcount hdfs://localhost:9000/user/howie/input
hdfs://localhost:9000/user/howie/output


不過這個方法的缺點是連線的參數與設定檔已經跟程式包在一起,所以第二步再開始取代掉程式寫死設定Job的方法,改成由spring 的方式,可以透過xml設定,這也是為了之後可以把參數設定拉出來埋下伏筆:

Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);


改成把所有設定值都拉到spring-context.xml

fs.default.name=${hd.fs}

input-path="${wordcount.input.path}"
output-path="${wordcount.output.path}"
mapper="org.apache.hadoop.examples.WordCount.TokenizerMapper"
reducer="org.apache.hadoop.examples.WordCount.IntSumReducer"


最後只需要這樣就可以執行程式,其他東西都透過讀取設定檔來搞定

$ mvn clean package appassembler:assemble
$ sh ./target/appassembler/bin/wordcount


而且只要改成這樣,之後就可以完全納入Spring 的 @Autowired 管理範疇,不過我發現這本比較著重在MapReduce的範例,反而Hbase的設定就草草帶過,結果反而在Hbase遇到比較多問題....=_= 之後再整理一下Hbase的設定改如何設定。


感覺最近又進入死腦筋鑽牛角尖狀態...明明還有好多事要做,卻一直堅持要把spring data 跟hadoop搞清楚...Orz..
張貼留言