Mahout踩坑之路

1、版本對比

公司版Mahoutjava

 

  • 因爲Mahout只能容許於hadoop0.20以上版本上,而百度的hadoop是hadoop0.19的一個分支。所以百度HPC組曾經將Mahout移植到百度的hadoop集羣。
  • Mahout上古版本,只有itembased一種算法,且只能用於百度版hadoop。

開源Mahout算法

  • 運行於開源hadoop集羣。
  • 建議Mahout0.8版本,支持多種算法。

2、安裝、使用

1. 下載開源mahoutapache

http://archive.apache.org/dist/mahout/babel

推薦用mahout 0.8版本oop

2. 配置ui

解壓縮後編輯mahout-distribution-0.8/bin/mahout文件this

HADOOP_CONF_DIR='/home/work/hadoop-opensource/confurl

HADOOP_HOME='/home/work/hadoop-opensource'spa

3. 運行命令orm

sh mahout-distribution-0.8/bin/mahout

返回結果是參數說明,按照你的需求配置參數便可。

示例代碼

date=$1
cd /home/work/mahout/mahout-distribution-0.8
sh bin/mahout hadoop fs -rmr /user/rp-rd/yitengfei/site-rec/cf/$1/temp/
sh bin/mahout recommenditembased \
-Dmapred.map.tasks=700 \
-Dmapred.reduce.tasks=700 \
-Dmapred.map.capacity=700 \
-Dmapred.reduce.capacity=700 \
-Dmapred.child.java.opts=-Xms4096m \
-Dmapred.reduce.child.java.opts=-Xms4096m \
--input /user/rp-rd/yitengfei/site-rec/data_item_id/$1 \
--output /user/rp-rd/yitengfei/site-rec/cf/$1/output \
--tempDir /user/rp-rd/yitengfei/site-rec/cf/$1/temp \
--similarityClassname SIMILARITY_COOCCURRENCE \
--numRecommendations 100
exit 0

 

3、踩過的坑

1. id只支持[0, 2^32-1]的正整數

mahout的輸入userid、itemid是long型的,但內部會將id轉成int型。因此只支持的32位無符號int的範圍,即取值範圍[0, 2^32-1]的數。

因此若是id類型是baiduid、cuid、url的話,須要先將id作32位簽名。

2. OutOfMemoryError 內存不足錯誤

緣由是:mahout在計算協同矩陣前有一輪job countObservations,它使用一個reduce統計用戶數量,並且是用HashMap存儲,致使數據量稍大,內存就超限。

可是在後續的計算中countObservations數據並無使用到,這是一輪無用且致使致命錯誤的任務。

解決辦法是使用mahout0.8,此坑只在mahout0.9中出現。

3. 另外一種OutOfMemoryError 內存不足錯誤

即便在mahout0.8,也存在一些使用內存存儲hashmap的狀況,致使數據量大時oom

recommenditembased和itemsimilarity的第四輪job normsAndTranspose,map階段分別用hashmap存儲了每一個item的norm、nonZeroEntries(非0評分用戶數)、maxValues(最大pref)。

輸入數據200G,item數3500萬,oom。

解決辦法只能是調大內存、調大map數。

相關文章
相關標籤/搜索