Taiwan Hadoop Forum

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

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




發表新文章 回覆主題  [ 15 篇文章 ]  前往頁數 12  下一頁
發表人 內容
 文章主題 : 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-03-28, 21:23 
離線

註冊時間: 2013-03-27, 13:40
文章: 5
大家好!
小弟在 3 台 Win7 電腦上裝 hadoop4win-setup-full_0.1.5.exe 執行 Hadoop
Hadoop 版本為 0.20.2
其中一台設為 jobtracker、namenode、secondarynamenode、tasktracker、datanode
剩餘二台設為 tasktracker、datanode

目前遇到當 Hadoop 重複執行相同檔案時,Task Trackers Nodes 會因 Seconds since heartbeat 秒數增加
結果 Nodes 一個一個死去
測試程式碼如下:

Main
代碼:
public static void main(String[] args) throws Exception {

     for(int i=0;i<100;i++){

    Configuration conf = new Configuration();
    conf.set("mapred.job.tracker", "10.5.32.173:9001");
 
    String[] ars=new String[]{"test","out"+i};
    String[] otherArgs = new GenericOptionsParser(conf, ars).getRemainingArgs();

    Job job = new Job(conf, "test");
    job.setJarByClass(testmain.class);
    job.setMapperClass(Maper_one.class);

     job.setMapOutputKeyClass(NullWritable.class);
     job.setMapOutputValueClass(NullWritable.class);
    job.setNumReduceTasks(0);
   
    job.setInputFormatClass(MyInputformat.class);       

   
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));

    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

    job.waitForCompletion(true);
         
         }

     }

Map
代碼:
public class Maper_one extends Mapper<Text, Text, NullWritable, NullWritable>{       
   boolean flag=true;
     public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
      
         if(flag){
            System.out.println(key.toString());
            flag=false;
            
         }
        
     }
    
}


其中Map Key為檔名,Map 單純 print 出檔名,Main 重覆執行 Hadoop Map運算,輸入檔案為 25 個20~60M txt檔
一開始幾個Job都可以順利執行完成,
但在途中會發生如第10個 Job 會在 Map 9X%的時候停住
去 jobtracker 網頁看的時候有幾個 task 停在 COMMIT_PENDING 狀態都在同一個 TaskTrackers Node
往 jobtracker 網頁看 TaskTrackers Node 的 Seconds since heartbeat 不斷升高
jobtracker 最後與此 Node 斷開,在斷開的 Node 主機輸入
$ jps
3148 TaskTracker
3264 Jps
4416 DataNode
5952 Child
3600 Child
看到TaskTracker 仍有執行
TaskTrackers Node 在斷開前的 TaskLog 也有印出檔名
無中斷的 Error 發生只有 Node 斷開後 jobtracker 網頁顯示 Lost task tracker: tracker_.. 訊息

在第11個Job 執行時,TaskTrackers Node只剩2個
持續發生同上的狀況,最後TaskTrackers Node連線數0,Job也無中斷

困惑了好幾天!希望大家能提供一些解決方向


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-03-29, 23:27 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
嗯,因為有 3 台,每台預設可以跑 2 個 mapper
所以同時會有 6 個 mapper 在執行。

剛開始 Child process 裡的 flag = true
執行完第一次 map() ,flag = false
讀取每個檔案的第2行就不做事了......
直到 Cache 記憶體被塞滿.....XD
然後 Child 佔滿記憶體以後,就發生系統負載過重,無法正常回應狀態給 JobTracker 的情形
然後就全部 TaskTracker 離線 .....

若您跑在虛擬機器上,記憶體沒有給太多(Ex. 1GB)
預設 Hadoop4Win 已經調整過每個 Java Process 的 HEAPSIZE 是 256M
NN, JB, TT, DN 4個 java process 就會佔用 1GB,
而在執行 mapper 時會另外多兩個 Child Java process
那就會用超過 1GB 記憶體......

Anyway,程式邏輯本身顯示了您誤以為每一個檔案讀取每一行都會重新產生一個 mapper 物件。
實際上是每一個 Block 對應一個 InputSplit,每個 InputSplit 會產生一個 mapper 物件,
只有初始化時 flag 才會等於 true。讀取該 InputSplit 中第一行時,還維持 True,但第2行以後就全部都是 false。

這裡您用了 MyInputFormat 所以不確定 RecordReader 是怎麼實作......
Mapper 也挑選 (NullWritable,NullWritable) 當輸出,而沒有呼叫 Context.write()
整體覺得會掛掉是合理啦~很有可能是資源耗盡,但具體情形最好還是請您自己觀察一下 Windows 的系統狀態吧!

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-03-30, 15:34 
離線

註冊時間: 2013-03-27, 13:40
文章: 5
謝謝您的回覆!

安裝 hadoop 的電腦記憶體為 16G

想請問關於記憶體部分需調整 mapred-site.xml 的 mapred.child.java.opts 參數
或 hadoop-env.sh 的 export HADOOP_HEAPSIZE 還是其他檔案參數調整呢?
程式也無跳出記憶體不足的 error 顯示
我是照 Hadoop4Win 安裝,Cygwin 部分有限制記憶體的部分需調整嗎?

MyInputFormat 是從 TextInputFormat 源碼修改 ,只將 Key 改為檔名,及 InputSplit 回傳 false
是希望一個檔案是產生一個 mapper 處理,每一檔案都小於Block size

只讀取一行是由於之前發現 TaskTracker 會不斷離線,擔心是程式有死迴圈狀況,所以單純 Map 在讀取檔案第一行後印出檔名,
目的想觀察 TaskTracker 會不會還是一直離線
這樣需做何處理才不會導致Cache 記憶體塞滿呢?

關於 mapper 輸出,若改 Context.write(null,null) 想達到 Mapper 無輸出,會比原先無呼叫 Context.write() 好嗎?

觀察離線的 TaskTracker , Child Java process 還是在執行,但由windows 工作管理員觀看CPU使用率近 0% 與記憶體量也很低

由離線的 TaskTracker Log 看
成功執行的task
代碼:
2013-03-30 14:56:39,779 INFO org.apache.hadoop.mapred.TaskTracker: LaunchTaskAction (registerTask): attempt_201303301425_0002_m_000014_0 task's state:UNASSIGNED
2013-03-30 14:56:39,779 INFO org.apache.hadoop.mapred.TaskTracker: Trying to launch : attempt_201303301425_0002_m_000014_0
2013-03-30 14:56:40,090 INFO org.apache.hadoop.mapred.TaskTracker: In TaskLauncher, current free slots : 1 and trying to launch attempt_201303301425_0002_m_000014_0
2013-03-30 14:56:41,433 INFO org.apache.hadoop.mapred.TaskTracker: JVM with ID: jvm_201303301425_0002_m_-545198583 given task: attempt_201303301425_0002_m_000014_0
2013-03-30 14:56:49,379 INFO org.apache.hadoop.mapred.TaskTracker: attempt_201303301425_0002_m_000014_0 0.8121404%
2013-03-30 14:56:51,121 INFO org.apache.hadoop.mapred.TaskTracker: Task attempt_201303301425_0002_m_000014_0 is in commit-pending, task state:COMMIT_PENDING
2013-03-30 14:56:51,121 INFO org.apache.hadoop.mapred.TaskTracker: attempt_201303301425_0002_m_000014_0 0.8121404%
2013-03-30 14:56:52,223 INFO org.apache.hadoop.mapred.TaskTracker: Received commit task action for attempt_201303301425_0002_m_000014_0
2013-03-30 14:56:52,382 INFO org.apache.hadoop.mapred.TaskTracker: attempt_201303301425_0002_m_000014_0 0.9988352%
2013-03-30 14:56:53,226 INFO org.apache.hadoop.mapred.TaskTracker: attempt_201303301425_0002_m_000014_0 0.9988352%
2013-03-30 14:56:53,228 INFO org.apache.hadoop.mapred.TaskTracker: Task attempt_201303301425_0002_m_000014_0 is done.
2013-03-30 14:56:53,228 INFO org.apache.hadoop.mapred.TaskTracker: reported output size for attempt_201303301425_0002_m_000014_0  was 0
2013-03-30 14:56:55,222 INFO org.apache.hadoop.mapred.TaskTracker: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find taskTracker/jobcache/job_201303301425_0002/attempt_201303301425_0002_m_000014_0/output/file.out in any of the configured local directories


卡住的task
代碼:
2013-03-30 14:58:04,783 INFO org.apache.hadoop.mapred.TaskTracker: LaunchTaskAction (registerTask): attempt_201303301425_0002_m_000085_0 task's state:UNASSIGNED
2013-03-30 14:58:04,783 INFO org.apache.hadoop.mapred.TaskTracker: Trying to launch : attempt_201303301425_0002_m_000085_0
2013-03-30 14:58:05,143 INFO org.apache.hadoop.mapred.TaskTracker: In TaskLauncher, current free slots : 1 and trying to launch attempt_201303301425_0002_m_000085_0
2013-03-30 14:58:06,347 INFO org.apache.hadoop.mapred.TaskTracker: JVM with ID: jvm_201303301425_0002_m_-150518350 given task: attempt_201303301425_0002_m_000085_0
2013-03-30 14:58:12,916 INFO org.apache.hadoop.mapred.TaskTracker: Task attempt_201303301425_0002_m_000085_0 is in commit-pending, task state:COMMIT_PENDING
2013-03-30 14:58:12,916 INFO org.apache.hadoop.mapred.TaskTracker: attempt_201303301425_0002_m_000085_0 0.0%
2013-03-30 14:58:13,788 INFO org.apache.hadoop.mapred.TaskTracker: Received commit task action for attempt_201303301425_0002_m_000085_0
2013-03-30 14:58:13,982 INFO org.apache.hadoop.mapred.TaskTracker: attempt_201303301425_0002_m_000085_0 0.9979442%
2013-03-30 14:58:13,983 INFO org.apache.hadoop.mapred.TaskTracker: Task attempt_201303301425_0002_m_000085_0 is done.
2013-03-30 14:58:13,983 INFO org.apache.hadoop.mapred.TaskTracker: reported output size for attempt_201303301425_0002_m_000085_0  was 0


其中
INFO org.apache.hadoop.mapred.TaskTracker: org.apache.hadoop.util.DiskChecker$DiskErrorException:
這好像不對 task 執行有影響
卡住的task 反而無顯示上行訊息,看不出有其他Error訊息

希望大家能提供意見,謝謝!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-03-31, 18:18 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
行為是有點怪,不過建議看能否給個完整的 code
好試試看能否在其他機器上也重現這個現象。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-04-02, 19:39 
離線

註冊時間: 2013-03-27, 13:40
文章: 5
輸入檔案為100個20~60M TXT檔案
目前還是會發生 TaskTracker 陸續斷線問題!

程式碼如附件
假如有任何發現或問題
煩請您通知
謝謝!


附加檔案:
src.zip [4.29 KiB]
被下載 463 次
回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-04-09, 11:54 
離線

註冊時間: 2013-03-27, 13:40
文章: 5
最近觀察JobTracker Log 查詢卡住的 task 編號
代碼:
2013-04-08 15:59:10,267 INFO org.apache.hadoop.mapred.JobTracker: Adding task 'attempt_201304081536_0016_m_000006_0' to tip task_201304081536_0016_m_000006, for tracker 'tracker_7900-PUB16.kyec.com.tw:127.0.0.1/127.0.0.1:56135'
2013-04-08 16:00:27,759 INFO org.apache.hadoop.mapred.JobTracker: attempt_201304081536_0016_m_000006_0 is 77492 ms debug.
2013-04-08 16:03:47,778 INFO org.apache.hadoop.mapred.JobTracker: attempt_201304081536_0016_m_000006_0 is 277511 ms debug.
2013-04-08 16:07:07,783 INFO org.apache.hadoop.mapred.JobTracker: attempt_201304081536_0016_m_000006_0 is 477516 ms debug.
2013-04-08 16:10:27,788 INFO org.apache.hadoop.mapred.JobTracker: attempt_201304081536_0016_m_000006_0 is 677521 ms debug.
2013-04-08 16:10:27,788 INFO org.apache.hadoop.mapred.JobTracker: Launching task attempt_201304081536_0016_m_000006_0 timed out.
2013-04-08 16:10:27,788 INFO org.apache.hadoop.mapred.TaskInProgress: Error from attempt_201304081536_0016_m_000006_0: Error launching task
2013-04-08 16:10:27,788 INFO org.apache.hadoop.mapred.TaskInProgress: Error from attempt_201304081536_0016_m_000006_0: Lost task tracker: tracker_7900-PUB16.kyec.com.tw:127.0.0.1/127.0.0.1:56135
2013-04-08 16:10:27,788 INFO org.apache.hadoop.mapred.JobTracker: Removed completed task 'attempt_201304081536_0016_m_000006_0' from 'tracker_7900-PUB16.kyec.com.tw:127.0.0.1/127.0.0.1:56135'

因 Task time out 導致與此 TaskTracker 斷線


觀察因 time out 離線的 TaskTracker Log 查詢卡住的 task 編號
代碼:
2013-04-08 15:59:10,523 INFO org.apache.hadoop.mapred.TaskTracker: LaunchTaskAction (registerTask): attempt_201304081536_0016_m_000006_0 task's state:UNASSIGNED
2013-04-08 15:59:10,523 INFO org.apache.hadoop.mapred.TaskTracker: Trying to launch : attempt_201304081536_0016_m_000006_0
2013-04-08 15:59:11,210 INFO org.apache.hadoop.mapred.TaskTracker: In TaskLauncher, current free slots : 1 and trying to launch attempt_201304081536_0016_m_000006_0
2013-04-08 15:59:12,395 INFO org.apache.hadoop.mapred.TaskTracker: JVM with ID: jvm_201304081536_0016_m_-47194006 given task: attempt_201304081536_0016_m_000006_0

便無記錄了


有查詢到大陸網站寫如下:

Job日誌有緩存,刷入日誌文件不急時,這個可能導致的問題:
(1) jobtracker restart 之後job恢復運行的時候會出現task失去連接:
2012-02-16 17:11:49,224 INFO org.apache.hadoop.mapred.JobTracker: attempt_201202161703_0002_m_000039_0 is 200024 ms debug.
attempt_201202161703_0002_m_000039_0 is 400036 ms debug.
attempt_201202161703_0002_m_000039_0 is 600047 ms debug.
Launching task attempt_201202161703_0002_m_000039_0 timed out.
這樣需要等9分鐘之後確定該task timeout之後才會重新再運行該task
原因:由於日誌刷入日誌文件不夠及時,日誌文件中記錄有一個task的attempt task啟動時的信息,而沒記錄他運行結束時的信息(其實已經運行成功),job恢復的時候,Jt誤認為該task還在運行,然後一直等TT向它匯報該task的信息,直到該task timeout。 (實際該task在JT重啟前已經完成了,所有JT重啟之後,TT不會再匯報該task的狀態)

解決方案:
(1)為了解決日誌刷新不及時問題可以對log4j新增一個appender支持週期性地刷新log到磁盤。



不太了解與我的問題是否相符
想請問換Linux環境或更新Hadoop版本可以改善此狀況嗎?


附加檔案:
Log.zip [83.79 KiB]
被下載 461 次
回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-04-09, 12:05 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
x123zx 寫:
安裝 hadoop 的電腦記憶體為 16G
想請問關於記憶體部分需調整 mapred-site.xml 的 mapred.child.java.opts 參數
或 hadoop-env.sh 的 export HADOOP_HEAPSIZE 還是其他檔案參數調整呢?
程式也無跳出記憶體不足的 error 顯示
我是照 Hadoop4Win 安裝,Cygwin 部分有限制記憶體的部分需調整嗎?


突然想到,當初 Hadoop4Win 為了在課堂上使用,所以把 HADOOP_HEAPSIZE 將低到 256MB 了。
您的記憶體夠大,理論上應該可以把 HADOOP_HEAPSIZE 加大。

x123zx 寫:
觀察離線的 TaskTracker , Child Java process 還是在執行,但由windows 工作管理員觀看CPU使用率近 0% 與記憶體量也很低


本來是有在懷疑是否因為 HEAP 太小,TaskTracker 因此被 Win7 核心強制砍掉,但您有說還有.....真怪 XD

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-04-09, 12:28 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
x123zx 寫:
最近觀察JobTracker Log 查詢卡住的 task 編號
代碼:
2013-04-08 15:59:10,267 INFO org.apache.hadoop.mapred.JobTracker: Adding task 'attempt_201304081536_0016_m_000006_0' to tip task_201304081536_0016_m_000006, for tracker 'tracker_7900-PUB16.kyec.com.tw:127.0.0.1/127.0.0.1:56135'

因 Task time out 導致與此 TaskTracker 斷線
想請問換Linux環境或更新Hadoop版本可以改善此狀況嗎?


1. 我觀察到一個不太好的現象:主機名稱都對應到 127.0.0.1 .... 這在叢集環境裏面很不好.
Hadoop4Win 目前沒有處理 /etc/hosts,建議您把三台的 IP 跟 hostname 寫在 /etc/hosts
我在懷疑很可能是這個原因造成 JobTracker 連不到 TaskTracker ... 因為它嘗試要連 127.0.0.1 就是自己,而且三台都是想連自己 :(

2. 初步我在懷疑是 Hadoop4Win 三台 Hadoop 叢集設定的問題,目前商業公司有 HortonWorks 也有出 Windows 版
一般商業運轉環境,我當然還是比較建議用 Linux,如果您有特殊需求,非得跑 Windows 的話,可否私下與我連繫一下?
我在 hadoop.nchc.org.tw 的 Linux 環境上測試,似乎還好。如果公司有擋 22 port 的話,可以改連 https://hadoop.nchc.org.tw

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-04-09, 13:52 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
剛剛突然想通了,您遇到了幾個問題:

1. 資料太多,卻一直沒有送出 Mapper 資料,造成每個 Mapper Task 執行時間超過 600 秒(十分鐘,mapred.task.timeout 預設值 600000 milliseconds)沒有回報 Counter,
所以被 JobTracker 視為無窮迴圈,不正常的 Task 而標記為 Failed Task Attempt。
2. JobTracker 與 TaskTracker 很認份幫你重新分配新的 Task Attempt,然後持續不斷地被標記為 Failed Task Attempt
3. 當失敗非常多次以後,該 TaskTracker 被 JobTracker 標記為黑名單(black list),所以看到 TaskTracker 一個節點接著另一個節點從 JobTracker 消失
(最早到達失敗黑名單上限的先不見,少掉一台以後,另外兩台就會更快到達失敗黑名單上限)。

真是個連環反應。也真是一個驗證 mapred.task.timeout 的好方法 XD

解法:在 src/Map/Maper_one.java 加入 context.getCounter("MY_GROUP","MY_COUNTER").increment(1)
代碼:
public class Maper_one extends Mapper<Text, Text, NullWritable, NullWritable>{
           boolean flag=true;
             public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
                 context.getCounter("MY_GROUP","MY_COUNTER").increment(1);
                 if(flag){
                    System.out.println(key.toString());
                    flag=false;
                 }
             }
        }


- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 關於連續執行 Hadoop Map 運算時,遇到的問題
文章發表於 : 2013-04-09, 16:15 
離線

註冊時間: 2013-04-09, 16:11
文章: 2
你前面說的我還能了解不好意思,但不太了解把Counter做increment~就能解決此情況的原因是?


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 15 篇文章 ]  前往頁數 12  下一頁

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


誰在線上

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


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

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