又或者是更有彈性的R的rmr2套件
說穿了以上的解決方案底層的邏輯都還是把較簡單的程式碼轉換成java code再執行
因此,為了
用java寫mapreduce的架構主要有三個部分:
1.Map class
2.Reduce class
3.主程式
在建立好Map和Reduce兩個class以後
再於主程式內用job方法呼叫
另外job方法也用來設定運行時的指令和資料輸入
說了一大堆,實際開始寫code才發現太複雜的mapreduce我也hadle不了啦(逃~~)
只好從小怪開始打起
wordcount的範例在網路上實在太多了有點蘚
所以就來做個平均數計意思意思一下
首先data長這樣,已經丟到hadoop上了是用逗點分隔的
我希望計算Tom和Mary等人三科的平均分數
$hadoop fs -cat chinese.txt Tom,90 Mary,95 Lisa,94 Luke,87 Marx,76 Teresa,89 $hadoop fs -cat math.txt: Tom,67 Mary,68 Lisa,75 Luke,82 Marx,66 Teresa,74 $hadoop fs -cat science.txt: Tom,56 Mary,75 Lisa,85 Luke,96 Marx,74 Teresa,69
java code在這:
import java.io.IOException; import java.util.StringTokenizer; import java.util.Iterator; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.filecache.DistributedCache; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.Mapper.Context; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; import org.apache.hadoop.util.StringUtils; public class Avg{ //map步驟 public static class Map extends Mapper
寫完之後還沒結束
得先用commend line把code做成一個job
mkdir test_classes javac -classpath /{hadoop_home}/hadoop-core-0.20.2-cdh3u1.jar :/{hadoop_home}/commons-cli-1.2.jar : -d test_classes Avg.java jar -cvf ~/Avg.jar -C test_classes/ .
用javac編譯的時候記得要用-classpath指令把參考的library指給他(很重要)
之後再把它打包成.jar的檔案
之後就可以用hadoop jar指令執行了!
$hadoop jar ~/Avg.jar org.test.Avg {input} {output}
執行完來看看結果
$hadoop fs -cat ~/part-m-0000 Luke 88 Marx 72 Mary 79 Teresa 77 Tom 71
------ 後記:
其實這樣的東西不是很夠用 T_T 稍微進階版的Multiple input可以參考另一篇
在執行最後一步,$hadoop jar ~/Avg.jar org.test.Avg {input} {output}
回覆刪除會失敗且出現,java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org.apache.hadoop.io.LongWritable
請問板主有遇到這個問題嗎?該如何解決?謝謝
檢查class path底下的jar有沒有漏掉
刪除請問我執行javac時會發生錯誤,是哪裡出了問題嗎? 謝謝
回覆刪除Avg.java:46: error: incompatible types
for (IntWritable v : value) {
^
required: IntWritable
found: Object
Note: Avg.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
再compile一次加上-Xlint:unchecked選項試試看
刪除作者已經移除這則留言。
回覆刪除不能用啊...
回覆刪除