Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2022-06-28, 05:24

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




發表新文章 回覆主題  [ 7 篇文章 ] 
發表人 內容
 文章主題 : heap size爆滿造成的錯誤,與多次測試都沒成功,叢集式下run的
文章發表於 : 2014-02-16, 15:42 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
請問我最近一直在用叢集式跑例子,
每次都跑到同一個例子跑不完,都是有問題才造成中斷。

一開始測試的都是用while迴圈一直重複跑mapreduce
但是跑出來的檔案會非常多,因為要把很多資料輸出出來,會造成錯誤的例子
都是輸出檔案已經到十萬~二十萬個就出錯了。

上網看是說小檔案是hadoop上的大問題,
所以最新一次測試是完全不輸出檔案,只輸出再while迴圈下一回要input的檔案,
約只有7個檔案,可是我的map任務數量約有二十多萬個,結果出錯了

14/02/16 03:39:24 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/02/16 03:39:25 INFO input.FileInputFormat: Total input paths to process : 1
14/02/16 03:39:59 INFO mapred.JobClient: Running job: job_201402151036_0014
14/02/16 03:40:00 INFO mapred.JobClient: map 0% reduce 0%
Exception in thread "main" org.apache.hadoop.ipc.RemoteException: java.lang.OutOfMemoryError: Java heap space

at org.apache.hadoop.ipc.Client.call(Client.java:1070)
at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:225)
at org.apache.hadoop.mapred.$Proxy2.getJobStatus(Unknown Source)
at org.apache.hadoop.mapred.JobClient$NetworkedJob.updateStatus(JobClient.java:234)
at org.apache.hadoop.mapred.JobClient$NetworkedJob.isComplete(JobClient.java:316)
at org.apache.hadoop.mapred.JobClient.monitorAndPrintJob(JobClient.java:1294)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:533)
at only.WinMstEnd.run(WinMstEnd.java:333)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
at only.WinMstEnd.main(WinMstEnd.java:498)

這次是跑最遠的一次,但是出現Java heap space錯誤,那上網看懷疑是map數量太多造成的錯誤,所以就算沒輸出太多小檔案,
map任務數量太多也會造成錯誤是嗎。。

所以這樣的問題有得解決嗎,請問我分析的有錯嗎
請問heap size的空間是怎麼得出的,Heap Size is 740.06 MB/888.94 MB 這是我的容量
請問888.94是怎麼得出的,有辦法擴充嗎,煩請大大門回答,感謝。


我的程式是跑graph的例子,每次跑用vertex與edge與weight組成的圖,
隨著vertex增加,map總任務數量也隨之增加,每次都跑到map總數約二十萬左右的例子就錯誤了,
想請問有好辦法解決嗎,因為我就只差這個問題了,一直煩惱為甚麼都不能跑到最後,如果在不考慮時間的情況下。。。

我讓每個map任務變成一個大的map任務來做,減少map任務數量,似乎會得到比較好的結果,那請問除了加大記憶體容量,還有解決辦法嗎??
似乎一回的mapreduce沒跑完,記憶體都不會釋放的樣子,可是我看heapsize會一直慢慢增加,偶而減少一點,漂浮不定!?這是甚麼意思呢!?懇情回答~謝謝!



請問我看hadoop手冊,是說hadoop預設是HDFS會把64m的檔案丟給一台電腦做,假如果今天一個檔案只有幾mb,
我的setInputFormatClass我是設定NLineInputFormat.LINES_PER_MAP, "2",
兩行就一個map任務工作,是否預設的HDFS會把64m的檔案丟給一台電腦做就不成立了!?
變成兩行就丟給一台電腦做!?(實做上是這樣,想來確認看看,因為蠻有疑慮的)


最後再請教個問題,一個檔案有好多行,假如只有一個map任務在工作,所以裡面的map方法會一直跑每行的工作,這是預設,
有辦法不用"換行"當作一個map 方法的input嗎!?
class mapper(k,v){
void map(k,v){}}

檔案=>
1.#### \t
2.#### \t
3.#### \t
4.#### \t
5.#### \t
6.#### \t
有辦法一個map方法的value一次就得到兩行字串嗎!?就是得到1.#### 2.####
下一回map方法就是得到3.#### 4.####


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: heap size爆滿造成的錯誤,與多次測試都沒成功,叢集式下run的
文章發表於 : 2014-02-18, 12:31 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
AndyTsai 寫:
所以這樣的問題有得解決嗎,請問我分析的有錯嗎
請問heap size的空間是怎麼得出的,Heap Size is 740.06 MB/888.94 MB 這是我的容量
請問888.94是怎麼得出的,有辦法擴充嗎,煩請大大門回答,感謝。


88.94 MB 大概是因為您採用的是預設的 HADOOP_HEAPSIZE
那個是 NameNode 的 JVM 被配給的記憶體大小。設定於 hadoop-env.sh。

您遇到的 MapReduce 問題,應該是 MapReduce Child 記憶體不足的問題。
請修改 mapred-site.xml ,加入 mapred.child.java.opts 預設值是 200Xmx
調大應該會有幫助。

AndyTsai 寫:
我的程式是跑graph的例子,每次跑用vertex與edge與weight組成的圖,
隨著vertex增加,map總任務數量也隨之增加,每次都跑到map總數約二十萬左右的例子就錯誤了,
想請問有好辦法解決嗎,因為我就只差這個問題了,一直煩惱為甚麼都不能跑到最後,如果在不考慮時間的情況下。。。

我讓每個map任務變成一個大的map任務來做,減少map任務數量,似乎會得到比較好的結果,那請問除了加大記憶體容量,還有解決辦法嗎??
似乎一回的mapreduce沒跑完,記憶體都不會釋放的樣子,可是我看heapsize會一直慢慢增加,偶而減少一點,漂浮不定!?這是甚麼意思呢!?懇情回答~謝謝!


Hadoop MapReduce 為了加速,所以會優先 Cache 所有可用記憶體,直到總容量的 90% 上限。
有人會強制跑 GC,有權限的管理者可以從系統面直接跑 sysctl -w vm.drop_caches=3
都有助於清除快取。但您現階段遇到的問題應該是單一個 Mapper 或 Reducer 遇到記憶體上限。
請想成每個 mapper 跟 reducer 都是一台虛擬機器,這台虛擬機器預設只配了 200M 給該類別的程式運作。

AndyTsai 寫:
請問我看hadoop手冊,是說hadoop預設是HDFS會把64m的檔案丟給一台電腦做,假如果今天一個檔案只有幾mb,
我的setInputFormatClass我是設定NLineInputFormat.LINES_PER_MAP, "2",
兩行就一個map任務工作,是否預設的HDFS會把64m的檔案丟給一台電腦做就不成立了!?
變成兩行就丟給一台電腦做!?(實做上是這樣,想來確認看看,因為蠻有疑慮的)


如果一個檔案只有幾 MB,只佔一個 Block,那只會產生一個 Mapper
這個 Mapper 因為您指定的 NLineInputFormat 每次會從該 Block 取出兩行,跑一次 map() 函數
直到讀完為止,但這些動作都在同一台執行。

AndyTsai 寫:
最後再請教個問題,一個檔案有好多行,假如只有一個map任務在工作,所以裡面的map方法會一直跑每行的工作,這是預設,
有辦法不用"換行"當作一個map 方法的input嗎!?
class mapper(k,v){
void map(k,v){}}

檔案=>
1.#### \t
2.#### \t
3.#### \t
4.#### \t
5.#### \t
6.#### \t
有辦法一個map方法的value一次就得到兩行字串嗎!?就是得到1.#### 2.####
下一回map方法就是得到3.#### 4.####


您上文提到 NLineInputFormat 可以讀出指定行數,如果行為不是您要的,那可能要自訂 InputFormat 跟 RecordReader

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: heap size爆滿造成的錯誤,與多次測試都沒成功,叢集式下run的
文章發表於 : 2014-02-18, 16:31 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
jazz 寫:
AndyTsai 寫:
請問我看hadoop手冊,是說hadoop預設是HDFS會把64m的檔案丟給一台電腦做,假如果今天一個檔案只有幾mb,
我的setInputFormatClass我是設定NLineInputFormat.LINES_PER_MAP, "2",
兩行就一個map任務工作,是否預設的HDFS會把64m的檔案丟給一台電腦做就不成立了!?
變成兩行就丟給一台電腦做!?(實做上是這樣,想來確認看看,因為蠻有疑慮的)


如果一個檔案只有幾 MB,只佔一個 Block,那只會產生一個 Mapper
這個 Mapper 因為您指定的 NLineInputFormat 每次會從該 Block 取出兩行,跑一次 map() 函數
直到讀完為止,但這些動作都在同一台執行。

AndyTsai 寫:
請問我看hadoop手冊,是說hadoop預設是HDFS會把64M的檔案丟給一台電腦做,假如果今天一個檔案只有幾mb,
我的setInputFormatClass我是設定NLineInputFormat.LINES_PER_MAP, "2",
兩行就一個map任務工作,是否預設的HDFS會把64m的檔案丟給一台電腦做就不成立了!?
變成兩行就丟給一台電腦做!?(實做上是這樣,想來確認看看,因為蠻有疑慮的)


如果一個檔案只有幾 MB,只佔一個 Block,那只會產生一個 Mapper
這個 Mapper 因為您指定的 NLineInputFormat 每次會從該 Block 取出兩行,跑一次 map() 函數
直到讀完為止,但這些動作都在同一台執行。
- Jazz



感謝jazz大大回答,但是這塊與我目前的認知有很大的出入,也是我在hadoop手冊上的疑惑,
我先說一下目前我的認知,我的檔案都只假設一個,而這個檔案有"30行",而setInputFormatClass是設定要怎麼配置mapper任務,
假設NLineInputFormat 設為2,這樣就會是每兩行給一個mapper進行處理,這裡我預設一台電腦只有一個mapper好了(預設是兩個),
如果我有五台電腦,那三十行會產生15個mapper任務,如此均分給五台電腦,每台電腦只會執行三次mapper任務,而這點我是在50030確認的
因為我確實是有看到每個mapper任務是讓哪台電腦處理的,在檔案只有1MB左右,並沒有完全只在一台電腦上處理,如此如果依照手冊上說的,一個檔案在一個block,只產生一個Mapper,NLineInputFormat
每次取兩行跑map()函數,直到15個mapper任務都在"同一台"電腦跑完,似乎跟我的觀察有很大的出入,想請問jazz大大,我的理解的問題在哪呢!?

TextInputFormat=>是依照幾個檔案就會有幾個Mapper任務,每個Mapper任務把檔案裡面全部的行數去跑map()函數
NLineInputFormat=>是依照檔案數不管,只管所有檔案裡面有幾行,依NLineInputFormat設定數決定會有幾行給一個Mapper做,
而Mapper再把這幾行去跑map()函數
而這裡所有的Mapper任務都會依照有幾台電腦來均分給所有電腦處理
jazz大大,我這些觀察是有錯嗎!?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: heap size爆滿造成的錯誤,與多次測試都沒成功,叢集式下run的
文章發表於 : 2014-02-24, 10:26 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
AndyTsai 寫:
感謝jazz大大回答,但是這塊與我目前的認知有很大的出入,也是我在hadoop手冊上的疑惑,
我先說一下目前我的認知,我的檔案都只假設一個,而這個檔案有"30行",而setInputFormatClass是設定要怎麼配置mapper任務,
假設NLineInputFormat 設為2,這樣就會是每兩行給一個mapper進行處理,這裡我預設一台電腦只有一個mapper好了(預設是兩個),
如果我有五台電腦,那三十行會產生15個mapper任務,如此均分給五台電腦,每台電腦只會執行三次mapper任務,而這點我是在50030確認的
因為我確實是有看到每個mapper任務是讓哪台電腦處理的,在檔案只有1MB左右,並沒有完全只在一台電腦上處理,如此如果依照手冊上說的,一個檔案在一個block,只產生一個Mapper,NLineInputFormat
每次取兩行跑map()函數,直到15個mapper任務都在"同一台"電腦跑完,似乎跟我的觀察有很大的出入,想請問jazz大大,我的理解的問題在哪呢!?

TextInputFormat=>是依照幾個檔案就會有幾個Mapper任務,每個Mapper任務把檔案裡面全部的行數去跑map()函數
NLineInputFormat=>是依照檔案數不管,只管所有檔案裡面有幾行,依NLineInputFormat設定數決定會有幾行給一個Mapper做,
而Mapper再把這幾行去跑map()函數
而這裡所有的Mapper任務都會依照有幾台電腦來均分給所有電腦處理
jazz大大,我這些觀察是有錯嗎!?


30 行 = 1 個 Block = 1 個 InputSplit = 1 個 mapper
若用 TextInputFormat , 則會在這一個 mapper 物件中,由 RecordReader 每次讀入一行,然後執行一次 map() 函數,共呼叫 30 次 map()。
若用 NLineInputFormat,並將行數設為 2,則 RecordReader 每次讀入兩行,共呼叫 15 次 map(),但仍只有一個 Mapper。
請看 http://JobTrakcer:50030 的數字,應可得到驗證。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: heap size爆滿造成的錯誤,與多次測試都沒成功,叢集式下run的
文章發表於 : 2014-02-24, 18:38 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
JAZZ大大,您看一下我的東西,
圖片上可以看出input records=1716

而我的程式設計:
job.setInputFormatClass(NLineInputFormat.class);
job.getConfiguration().set(NLineInputFormat.LINES_PER_MAP, "1000");

然後從上面的Map (Total Tasks)上任務數為2,而我原先認為此數的"2"
,指的因該是產生了"2"個mapper任務,所以我才有此疑問
(我對mapper的定義是每個map任務的意思,也就是每台電腦預設能跑兩個map任務,兩個reduce任務,不知道是否這點在形容上跟jazz大大不同)
所以本然我的認知因該是這樣,30 行 = 1 個 Block = 15 個 InputSplit = 15 個 mapper(不同host同步處理)
也就是每個mapper會有兩個record丟進每個mapper的map()函數,
所以才有NLineInputFormat是決定mapper任務的定義,因為沒有很清楚,
才想跟jazz大大弄清楚點,感謝。


附加檔案:
1.gif
1.gif [ 164.16 KiB | 被瀏覽 6041 次 ]
回頂端
 個人資料 E-mail  
 
 文章主題 : Re: heap size爆滿造成的錯誤,與多次測試都沒成功,叢集式下run的
文章發表於 : 2014-02-24, 19:03 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
你是對的。我剛剛跑了一下程式驗證,確實 NLineInputFormat 會產生多個 InputSplit

From: https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapred/lib/NLineInputFormat.html
引言回覆:
NLineInputFormat which splits N lines of input as one split.


所以預設的 TextInputFormat 會根據 Block 大小,決定 InputSplit 個數,進而決定 Mapper 個數。
但是 NLineInputFormat 會根據 N 的行數設定,決定 InputSplit 的個數,也就是 Mapper 的個數。

我做實驗,1 個檔,四行 = 4 個 InputSplit = 4 個 Mapper ,如果不設定 N 的話,預設是 1
若 N 設為 2,則會變成 2 個 mapper。
若 N 設為 4,則只會有 1 個 mapper。

程式碼在 https://github.com/jazzwang/hadoop_labs/tree/master/lab015

- Jazz

AndyTsai 寫:
JAZZ大大,您看一下我的東西,
圖片上可以看出input records=1716

而我的程式設計:
job.setInputFormatClass(NLineInputFormat.class);
job.getConfiguration().set(NLineInputFormat.LINES_PER_MAP, "1000");

然後從上面的Map (Total Tasks)上任務數為2,而我原先認為此數的"2"
,指的因該是產生了"2"個mapper任務,所以我才有此疑問
(我對mapper的定義是每個map任務的意思,也就是每台電腦預設能跑兩個map任務,兩個reduce任務,不知道是否這點在形容上跟jazz大大不同)
所以本然我的認知因該是這樣,30 行 = 1 個 Block = 15 個 InputSplit = 15 個 mapper(不同host同步處理)
也就是每個mapper會有兩個record丟進每個mapper的map()函數,
所以才有NLineInputFormat是決定mapper任務的定義,因為沒有很清楚,
才想跟jazz大大弄清楚點,感謝。


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: heap size爆滿造成的錯誤,與多次測試都沒成功,叢集式下run的
文章發表於 : 2014-02-26, 11:34 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
感謝JAZZ大大驗證喔,我是用NLineInputFormat定義的,所以需要比較釐清一點。


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

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


誰在線上

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


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

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