ncuelab117 寫:
寫mapreduce程式遇到2個狀況..
1.有兩個不同的檔案需要比較,兩個檔案都很大,超過100MB
第一個檔案每一個input需要搜尋第二個檔案搜尋一遍
我的做法是先把第二個檔案在mapper開始前,先把它每一條資料存到一個ArrayList
但是當data2過大時會發生記憶體不足的問題
2.有一隻mapreduce程式是在記憶體建一棵FP-tree,跑FP-growth找出購物車紀錄的frequence item set
但當input資料過大時,一樣有記憶體不夠的問題。
想問一下mapreduce程式是怎麼解決把資料存在記憶體,而記憶體有限制的情況??
聽起來是單一 map() 就已經會遇到單機記憶體上限的問題(也許跟 HeapSize 設定有關)
這種問題需要看的參數很多,跟應用特徵也有很大的關聯。
因此初步只能建議:
A. 針對問題一:
根據描述,這種檔案比對的問題,常用的手法是 DistributedCache
也就是如果有一個檔案是類似「查表法」的「表」,那就把該檔視為每個 Task 的附加資料。
B. 針對問題二:
記憶體不足的問題,通常要配合其他工具,像是 Java Profiler
因為縱使有 log 也只是呈現出記憶體不足的表徵,但記憶體使用量的動態特徵無法呈現於 Log (除非在程式碼中加入對應追蹤)
初步建議:
1. 檢查由外而內檢查是否有辦法透過修改記憶體上限的方式,來讓程式繼續執行下去:
(A) 放大 yarn.nodemanager.resource.memory-mb
(B) 放大 yarn.scheduler.maxium-allocation-mb
(C) 放大 mapreduce.map.memory-mb
(D) 放大 mapreduce.map.java.opts

2. 使用 VisualVM 觀察 java process 的特徵 (除錯階段可以使用 local mode 會比較容易 debug)

- Jazz