Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2022-07-02, 13:27

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 6 篇文章 ] 
發表人 內容
 文章主題 : 請問setOutputKeyClass與setMapOutputKeyClass的問題
文章發表於 : 2013-12-23, 02:56 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
請問setOutputKeyClass與setOutputValueClass
是取決於Map與Reduce的輸出型別是什麼

今天我的問題是當我Map與Reduce型別不同時,我的setOutputKeyClass改寫為
public static class MSTMapper extends
Mapper<Object, Text, IntWritable, Text> {}

static class MSTReducer extends Reducer<IntWritable, Text, Text, Text> {}

Map輸出為(intWritable, Text) Reduce為(Text, Text>)

我寫為:
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

請問這個寫法有錯誤嗎 我是上網找的
在Reduce輸出型別都顯示錯誤
所以想問大大門因該要怎麼寫才對

雖然我後來有把程式都改成統一Text型別,但還是想知道這個問題該怎麼解決!?

再請問我看得一個程式,不管setNumReduceTasks設定為多少
Reduce執行的動作永遠是key1 -> key2 -> key3 -> key4 -> key5
並不會出現若 reducer 個數是 3

reducer #1 : key1 -> key4
reducer #2 : key2 -> key5
reducer #3 : key3
這樣...請問是否程式哪個地方還可以設定成只以一個Redcue來跑呢??(永遠都是全域排序!?)


原始碼連結: http://hadooptutorial.wikispaces.com/file/view/MST.java
http://hadooptutorial.wikispaces.com/file/view/ExampleBaseJob.java/239931339/ExampleBaseJob.java


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請問setOutputKeyClass與setMapOutputKeyClass的問題
文章發表於 : 2013-12-24, 21:16 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
AndyTsai 寫:
請問setOutputKeyClass與setOutputValueClass
是取決於Map與Reduce的輸出型別是什麼
請問這個寫法有錯誤嗎 我是上網找的
在Reduce輸出型別都顯示錯誤
所以想問大大門因該要怎麼寫才對
再請問我看得一個程式,不管setNumReduceTasks設定為多少
Reduce執行的動作永遠是key1 -> key2 -> key3 -> key4 -> key5
並不會出現若 reducer 個數是 3
這樣...請問是否程式哪個地方還可以設定成只以一個Redcue來跑呢??(永遠都是全域排序!?)


如果 setNumReduceTasks 怎麼設定都還是只有一個,那很可能是跑在單機模式(Local Mode)吧。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請問setOutputKeyClass與setMapOutputKeyClass的問題
文章發表於 : 2013-12-24, 21:43 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
AndyTsai 寫:
請問這個寫法有錯誤嗎 我是上網找的
在Reduce輸出型別都顯示錯誤
所以想問大大門因該要怎麼寫才對
雖然我後來有把程式都改成統一Text型別,但還是想知道這個問題該怎麼解決!?


不是很確定,因為沒看到「顯示錯誤」是什麼錯誤。
有時候也許因為您拿 Reducer 的類別當 combiner。

job.setMapperClass(Map.class);
job.setCombinerClass(Reduce.class);
job.setReducerClass(Reduce.class);



正常假設只有設定 MapperClass = Map.class 與 ReducerClass = Reduce.class ,順序是這樣

(Object, Text) -> map() -> (IntWritable, Text) -> reduce() -> (Text, Text)

如果拿 Reduce.class 當 CombinerClass 的話,那就會變成

(Object, Text) -> map() -> (IntWritable, Text) -> reduce() -> (Text, Text) -> reduce -> (Text, Text)

這樣就會遇到 Reducer 警告輸入型別錯誤。期待 (IntWritable,Text) 可是收到 (Text, Text)

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請問setOutputKeyClass與setMapOutputKeyClass的問題
文章發表於 : 2013-12-27, 17:13 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
這是錯誤訊息
13/12/27 17:09:41 WARN mapred.LocalJobRunner: job_local_0001
java.io.IOException: wrong key class: class org.apache.hadoop.io.Text is not class org.apache.hadoop.io.IntWritable
at org.apache.hadoop.mapred.IFile$Writer.append(IFile.java:164)
at org.apache.hadoop.mapred.Task$CombineOutputCollector.collect(Task.java:1157)
at org.apache.hadoop.mapred.Task$NewCombinerRunner$OutputConverter.write(Task.java:1481)
at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
at test.NewMst$Reduce.reduce(NewMst.java:103)
at test.NewMst$Reduce.reduce(NewMst.java:1)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
at org.apache.hadoop.mapred.Task$NewCombinerRunner.combine(Task.java:1502)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1436)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1298)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.close(MapTask.java:699)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:766)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
13/12/27 17:09:41 INFO mapred.JobClient: map 0% reduce 0%
13/12/27 17:09:41 INFO mapred.JobClient: Job complete: job_local_0001
13/12/27 17:09:41 INFO mapred.JobClient: Counters: 0

=======================================
我知道setOutputKeyClass與setOutputValueClass
是設定map與reduce輸出後的資料型態,並且要一致
如果今天我map得輸出資料型態是IntWritable與Text
reduce得輸出資料型態是Text與Text
map與reduce輸出後型態不一致因該怎麼設定

我是這樣設
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
用了四行,但似乎不對,所以才上來請教一下,謝謝大大門回答!!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請問setOutputKeyClass與setMapOutputKeyClass的問題
文章發表於 : 2013-12-28, 09:54 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
AndyTsai 寫:
這是錯誤訊息
13/12/27 17:09:41
at org.apache.hadoop.mapred.Task$CombineOutputCollector.collect(Task.java:1157)


看起來有跑 Combiner ....
那就要看您的類別宣告了

mapper<K1,V1,K2, V2> -> combiner<K2,V2,K3,V3> -> reducer<K3,V3,K4,K4>

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請問setOutputKeyClass與setMapOutputKeyClass的問題
文章發表於 : 2013-12-28, 19:01 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
謝謝JAZZ大大回答,我把setCombinerClass槓掉就可以跑了,問題已解決!


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 6 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作