Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2022-07-03, 20:37

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




發表新文章 回覆主題  [ 9 篇文章 ] 
發表人 內容
 文章主題 : map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-04-03, 16:01 
離線

註冊時間: 2013-08-08, 11:35
文章: 13
各位先進好!
最近有個想法,
map輸入輸出為<Object, Text, Text, IntWritable>時
就map輸出出來的形式就類似於<A, 1>
他所佔的byte數應為1byte(Text佔的大小)+4byte(IntWritable佔的大小)=5byte

那個1只是為了要讓map知道說我存在一個A這個key的話, 浪費的byte也太多了吧!!!
於是我就想說, 我要將map輸出為" ", 也就是empty string,這樣的話就可以大量的減少記憶體的消耗了!!

可是實際在測試的時候, 我發現宣告的部分卻有些問題
首先第一, 目前我寫的手法是, 因為我輸出是" ",
所以我把value宣告為Text格式,
可是Text格式所佔的byte應該是1byte,
也就是說我浪費了7個bits在那個七個零,
有辦法宣告只有一個bits的型式嗎?

再來第二, 假使我使用了combiner函式, 就書上來說,
map輸出格式=combiner輸入格式, combiner輸出格式=reduce輸入格式,
我根據這樣做了, 雖說解決一些問題關於main的setMapOutputKey以及Value的宣告,
卻無法執行, 我在一篇國外的論壇回文上看到了這說法"map的輸出型式需與combiner輸出形式相同",
我果斷將combiner註解掉....可以work了, 但是why...?我想用combiner啊!!(吶喊)

還請各位先進幫忙解惑..!!
ps..50030web輸出的畫面兩個不同的叢集用相同的hadoop版本, 為什麼跑出來的結果比較少T^T....
附加檔案:
檔案註釋: 資料比較少的
T10I4D100KN100K-2-2.jpg
T10I4D100KN100K-2-2.jpg [ 124.09 KiB | 被瀏覽 8771 次 ]


附加檔案:
檔案註釋: 資料比較多的
2.png
2.png [ 64.57 KiB | 被瀏覽 8771 次 ]
回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-04-03, 23:35 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
csh10301989 寫:
各位先進好!
最近有個想法,
map輸入輸出為<Object, Text, Text, IntWritable>時
就map輸出出來的形式就類似於<A, 1>
他所佔的byte數應為1byte(Text佔的大小)+4byte(IntWritable佔的大小)=5byte

那個1只是為了要讓map知道說我存在一個A這個key的話, 浪費的byte也太多了吧!!!
於是我就想說, 我要將map輸出為" ", 也就是empty string,這樣的話就可以大量的減少記憶體的消耗了!!

可是實際在測試的時候, 我發現宣告的部分卻有些問題
首先第一, 目前我寫的手法是, 因為我輸出是" ",
所以我把value宣告為Text格式,
可是Text格式所佔的byte應該是1byte,
也就是說我浪費了7個bits在那個七個零,
有辦法宣告只有一個bits的型式嗎?

再來第二, 假使我使用了combiner函式, 就書上來說,
map輸出格式=combiner輸入格式, combiner輸出格式=reduce輸入格式,
我根據這樣做了, 雖說解決一些問題關於main的setMapOutputKey以及Value的宣告,
卻無法執行, 我在一篇國外的論壇回文上看到了這說法"map的輸出型式需與combiner輸出形式相同",
我果斷將combiner註解掉....可以work了, 但是why...?我想用combiner啊!!(吶喊)

還請各位先進幫忙解惑..!!


1. 如果真的想要減少 Value 所佔的資料量,可以改用 NullWritable。Reducer 中,改計算拿到幾個 value。
只是我必須說....Text 跟 IntWritable 還有 NullWritable 都是「物件」不是「資料型態」
所以大小差多少....可能要跑跑 Debuger 才知道了
2. 關於"map的輸出型式需與combiner輸出形式相同"的限制是因為您直接拿 Reducer 類別當 Combiner 吧?

根據出錯的情形,數學邏輯是這樣:

<Object, Text> -> map() -> <Text, Text>
您設計的 reducer 拿來當 combiner 會是 <Text, list(Text)> -> reduce() -> <Text, IntWritable>
此時所有 mapper 經過 combiner 後的結果是 <Text, list(IntWritable)>
跟 reducer 所需要的輸入 <Text, list(Text)> 是不相符的。

解法:另外設計一個類別給 Combiner 用。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-04-15, 08:26 
離線

註冊時間: 2013-08-08, 11:35
文章: 13
Dear Jazz
您好, 這幾個禮拜我用您所推薦的NullWritable後,
整個byte所佔的量大大的降低了, 非常感謝您!!

不過就您第二點所說的
因為我的combiner和reducer必須做計數的動作,
因此都必須用intwritable來放數值,
也看過您回應的其他篇文章,

您說如果combiner內用reducer的話
輸入輸出必須"一樣"

我目前的輸入輸出是這樣
map:<object, Text, Text, NullWritable>
combiner:<Text, NullWritable, Text, InWritable>
reduce:<Text , IntWritable, Text , IntWritable>

然後根據您最後一段所說的, 宣告一個新的class...
不知有無範例可以參考, 我看網路上大多都是直接套用reducer的範例
苦於卡關一個多禮拜, 才上來求助的T^T..拜託嚕


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-04-20, 18:23 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
http://blog.csdn.net/jokes000/article/details/7072963

代碼:
    public static class Combine extends Reducer<Text,Text,Text,Text> { 
         
        // Reduce Method 
        public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 
            double sum = 0; 
            int count = 0; 
            for (Text value : values) { 
                String fields[] = value.toString().split(","); 
                sum += Double.parseDouble(fields[0]); 
                count += Integer.parseInt(fields[1]); 
            } 
            context.write(key, new Text(sum+","+count)); 
        } 
    } 


- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-04-22, 09:28 
離線

註冊時間: 2013-08-08, 11:35
文章: 13
Dear Jazz
疑??這樣的寫法不是也是調用reducer的combiner嗎?
如果這樣的話
combiner和reducer的輸入輸出不同的話不會出錯嗎?...
我自己也改過這樣的寫法, 但是由於卡在maper的value輸出(NullWritable)
導致combiner的輸入和reducer的輸入不一樣.

原因也是差在combiner和reducer的輸入
原本希望的型式
map:<object, Text, Text, NullWritable>
combiner:<Text, NullWritable, Text, InWritable>
reduce:<Text , IntWritable, Text , IntWritable>
可是這樣寫會因為IntWritable而出錯

但是改成
map:<object, Text, Text, NullWritable>
combiner:<Text, NullWritable, Text, InWritable>
reduce:<Text , NullWritable, Text , IntWritable>
就可以了, 可是等於計算完的結果不是我所需要的

現在我的問題應該是卡在combiner,
我必須要在combiner做Nullwritable進來的個數計數,
reducer才能拿計數的值在做總和,
有想過很多, 但是如果為了使用combiner而放棄NullWritable的話,
似乎就有點本末倒置了...
請問是否有解決的方法呢?...


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-04-22, 23:15 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
您可以查目前最新的 API
http://hadoop.apache.org/docs/r2.2.0/api/allclasses-noframe.html
出現 Combiner 的地方都是繼承自 Reducer
Ex. http://hadoop.apache.org/docs/r2.2.0/api/org/apache/hadoop/mapreduce/lib/aggregate/ValueAggregatorCombiner.html
並沒有一個類別是 Combiner 的抽象類別。

看了些資料,看來 Combiner 有些限制,也就是輸入 Key, Value 必須與輸出 Key,Value 型態相同。
(input) <k1, v1> -> map -> <k2, v2> -> combine* -> <k2, v2> -> reduce -> <k3, v3> (output)
http://wiki.apache.org/hadoop/HadoopMapReduce
http://www.thecloudavenue.com/2011/12/what-should-be-inputouput-keyvalue.html
因為 Combiner 做的事情是把在 Mapper 中的 (K2,V2) 先跑一次 reduce() 函數(這也是為何它是繼承自 Reducer 類別)
然後才吐到硬碟當作中間產物。

引言回覆:
When a certain number of key-value pairs have been written, this buffer is flushed by passing all the values of each key to the combiner's reduce method and outputting the key-value pairs of the combine operation as if they were created by the original map operation.


結論:
若要依以上討論之邏輯實作,必須改用 ChainMapper 而非 Combiner

<object, Text> -> map1 -> <Text, NullWritable> -> map2 -> <Text, InWritable> -> reduce -> <Text , IntWritable>


- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-05-12, 17:50 
離線

註冊時間: 2013-08-08, 11:35
文章: 13
Dear Jazz
感謝解惑,
目前正在努力套入中,
另外最近在學習hadoop-2.2.0的叢集安裝
說實在0.2.0跟2.2.0真的差很多東西,
之前的安裝文檔幾乎派不上用場,
這幾天才將它完成,
問題來了...
原本50030可以看job的資料
一些分段的時間(map time/ shuffle time 和 reduce time), 輸出的byte...等等的

但是改到2.2.0之後在:8088的網頁,
網頁的頁面上就只能查找到總運行時間,
難道只能從跑完之後的終端機上面查看整體資料嗎?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-05-12, 23:26 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
YARN 架構確實改蠻大的,我也還沒很熟悉 8088 頁面提供的資訊。
假設您並不一定要用到 YARN 架構的彈性,可以跑 HDFS v2 搭配 MapReduce v1 。
(目前 Cloudera CDH4 都是這麼建議,要到 CDH5 才改用 YARN )

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map combiner reduce key/value宣告格式的一些小問題
文章發表於 : 2014-05-14, 22:17 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
我不確定是否有用,不過後來想想 YARN 架構的 Job 歷史應該是由 History Server 管理,
所以也許您可以透過 History Server 去找,甚至透過它的 RESTful API 另外寫一個頁面來呈現您需要的數據。
http://archive.cloudera.com/cdh4/cdh/4/hadoop/hadoop-yarn/hadoop-yarn-site/HistoryServerRest.html
For Your Reference.

- Jazz


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

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


誰在線上

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


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

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