轉:集羣提交MapReduce作業執行卡住問題解決方案

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/WYpersist/article/details/80202055
關於MapReduce,Map能完全執行,Reduce執行到一半卡住不執行

住了幾個小時,死活停滯不前,發現後根據提示開始排錯,進入50030,進入作業發現

這說明作業在map之完後的shuffle階段中,reduce無法從map處拷貝數據,是因爲客戶端與數據節點通訊失敗造成的。客戶端程序應該能夠和所有的節點通訊才能保證數據的傳輸正常,然後開始各種檢查:所有節點hosts中寫的完全相通,不是節點名稱不同或者節點沒有完全加上造成的,排除;找到slaves發現寫的也完全相同,不是節點缺失有誤,最後查看了防火牆的狀態,發現其中一個節點的防火牆沒有關閉,找到原因,service iptables stop,然後重新提交作業,成功運行

MapReduce map100% Reduce 66% 卡死
如果你碰到map100%,reduce 66% 然後程序就貌似停止在這裏了,可能是由於在Reduce類裏使用了String造成的

根據一位外國友人的說明,在reduce階段 ,0-33%階段是 shuffle 階段,就是根據鍵值 來講本條記錄發送到指定的reduce,這個階段應該是在map還沒有完全完成的時候就已經開始了,因爲我們會看到map在執行到一個百分比後reduce也啓動了,這樣做也提高了程序的執行效率。

            34%-65%階段是sort階段,就是reduce根據收到的鍵值進行排序。map階段也會發生排序,map的輸出結果是以鍵值爲順序排序後輸出,可以通過只有map階段處理的輸出來驗證。

              66%-100%階段是處理階段,這個階段纔是真正的處理階段,如果程序卡在這裏,估計就是你的reduce程序有問題了。比如如下代碼:  

 String reducevalue=new String();  
 
 int i=0;  
 
 while (values.hasNext() && i<1000) {                                                    
 
   if(reducevalue.length()>0){                                                           
 
        reducevalue+="," }   
 
reducevalue+=values.next().toString()); i++; }   
 
output.collect(key, new Text(reducevalue.toString())); }  
由於使用了String對象,造成性能下降,每傳過來一個values對象,就會在while循環中創建幾個String對象(也許還有StringBuilder對象,“+”會被編譯成StringBuilder對象請參考:

http://developer.51cto.com/art/200906/132698.htm

,如果將String對象換成StringBuilder對象,程序就能順利的執行

 

關於mapreduce 提交作業卡住不運行
在一次hadoo提交作業遇到卡住不允許的情況,如下圖所示

然後打開yarn查看狀態,可以看到有一條作業在等待執行

由於看不到進度條,我決定點擊進去查看詳情,結果看到了

1. ACCEPTED: waiting for AM container to be allocated, launched and register with RM.

也就是上面這句話,說等待AM被分配,這就奇怪了,爲什麼會出現這樣的錯誤呢?是不是有什麼沒有啓動成功呢?還是什麼啓動失敗了,我馬上通過jps查看

果然發現NodeManager沒有啓動我們一起來看看日誌找找錯誤,看日誌絕對是一件特別費勁的事情,雖然費勁但是卻能很好的幫我們解決問題,入下圖紅色圈起來部分

1. Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ResourceManager: NodeManager from  localhost doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager.

這句錯誤可以看出是內存不足導致的,找到原因就好辦了,那麼我們修改一下yarn的配置文件,我的文件存在/usr/local/hadoop/etc/hadoop/yarn-site.xml,把裏面的內容添加兩段配置

 <property>
   <name>yarn.nodemanager.resource.memory-mb</name>
    <value>4096</value>
 </property>
<property>
   <name>yarn.nodemanager.resource.cpu-vcores</name>
  <value>4</value>
 </property>

執行一下啓動命令然後再通過jps查看

看到NodeManager已經啓動起來了,這個問題我們已經解決了

在執行wordcount時,job卡住不繼續執行
開發環境是redhat版本的linux,hadoop2.7.1我在運行wordcount時遇到了一個問題,一直卡在 “ INFO mapreduce.Job: Running job: job_1442558810788_0002 ” 而不能繼續,我看了詳細的打印信息,是一直在做這個請求

hadoop2.7.x運行wordcount程序卡住在INFO mapreduce.Job: Running job:job _1469603958907_0002
一、拋出問題  

Hadoop集羣(全分佈式)配置好後,運行wordcount程序測試,發現每次運行都會卡住在Running job處,然後程序就呈現出卡死的狀態。

wordcount運行命令:[hadoop@master hadoop-2.7.2]$ /opt/module/hadoop-2.7.2/bin/hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar  wordcount  /wc/mytemp/123 /wc/mytemp/output

現象截圖如下:卡死在紅線部分:

 

二、解決方法

1、到網上找了很多教程,集中說法如下:

    (1)有的說,是防火牆或者selinux沒關閉,然後,就去一一查看,發現全部關閉

    (2)有的說,是因爲/etc/hosts文件中的127.0.0.1等多餘的ip地址沒刪除或者沒註釋調

    (3)有的人說,查看日誌(what?小白哪知道哪個日誌),然後不了了之。

2、解決辦法:  

  小白解決問題總是會花費很多時間的,因此半天就這樣沒了,很對不起公司的工資啊,現將解決辦法一一列出。

  (1)第一步:因爲Running job發生的問題,在hadoop 中我們要想到mapreduce發生的問題,在Hadoop2.x系列中MapReduce是通過yarn進行管理的,因此我們查看yarn-hadoop-nodemanager-slave01.log 日誌,該日誌在slave節點的¥{HADOOP_HOME}/logs下面

終端執行shell指令:yarn-hadoop-nodemanager-slave01.log

查看到日誌截圖如下:

2016-07-27 03:30:51,041 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 4 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:52,043 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 5 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:53,046 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 6 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:54,047 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 7 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:55,048 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 8 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:56,050 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 9 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:31:27,053 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

(2)大概的解釋一下意思

就是說每次Client試圖連接0.0.0.0/0.0.0.0:8031失敗,那麼導致這個原因,應該能想到是配置問題,然後複製這段信息進行百度,嘗試了幾個,終於參考了此博客:

解決Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is..

https://blog.csdn.net/panguoyuan/article/details/38727113

(解決Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is... )解決了本文的問題,將下述代碼添加到yare-site.xml中:

解決辦法:在yare-site.xml裏添加如下信息之後問題得到解決

<property>  
 
    <name>yarn.resourcemanager.address</name>  
 
    <value>master:8032</value>  
 
  </property>  
 
  <property>  
 
    <name>yarn.resourcemanager.scheduler.address</name>  
 
    <value>master:8030</value>  
 
  </property>  
 
  <property>  
 
    <name>yarn.resourcemanager.resource-tracker.address</name>  
 
    <value>master:8031</value>  
 
  </property>  
(注意我將master、slave01、slave02這個文件都修改了,是不是隻修改master就可以,不清楚,但是初步判斷應該全部修改)

hadoop 程序在運行時 reduce過程卡在某個進度不動的問題
駛入數據爲一個hive表的文件,location到了一個hdfs目錄下,然後跑hadoop的過程中,map階段沒有出現問題,但是每次到了reduce階段,進度都卡在33%不動了,剛開始以爲是集羣問題,後來重新啓動了幾次任務,都是這種情況。

可能的情況1:

後來在stackoverflow上找到了答案,這是hadoop上數據傾斜造成的問題(我的hive表使用了orde by,所以是按照字段排序,如果將字段作爲marpeduce的key,那麼某一臺機器上的reduce大部分都是同一個key,這違背了mapreduce併發的思想,造成其他reduce一直等的情況),所以卡死。具體數據傾斜解釋請看~(數據傾斜解釋),解決辦法:在生成hive表的時候取消order by命令。但是並沒有用,照樣在33%卡死。

可能的情況2:

我增加了redece的個數,job.setNumReduceTasks(1000);跑通了。

某些任務執行時間過長,且失敗率過高
檢查日誌後發現沒有執行完就失敗,原因出在hadoop 的 job 的 timeout 過短(相對於集羣的能力來說),設置長一點即可

 

(1) 環境:Centos6.4、JDK1.7、hadoop-2.5.0-cdh5.3.3

(2) 問題:之前使用Apache的hadoop跑各種MR應用均沒出現問題,然而使用CDH版的hadoop運行到running job卻卡住了。

配置好僞分佈式的hadoop集羣,啓動集羣后,使用自帶的pi實例測試集羣是否配置成功,使用命令:

$bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar pi 1 1

可是任務運行到running job就卡住了

INFO mapreduce.Job: Running job: job_1403905542893_0004

ResourcesManager瀏覽器界面顯示UNASSIGNED


Tracking UI - UNASSIGNED
Apps Submitted - 1
Apps Pending - 1
Apps Running - 0

Jps輸出:

4764 Jps
2148 DataNode
3280 ResourceManager
2053 NameNode
3378 NodeManager
2318 SecondaryNameNode

(3) 解決方法:

從網上查了好多資料,主要有兩種方法:一是hosts配置了不相關的主機,修改/etc/hosts文件,刪除不相關的主機;二是集羣的資源不足,無法分配給新任務的資源,需要調節yarn-site.xml的調度器獲得資源的參數。

對於方法一,我的配置文件只配置了本地主機,因此不是hosts文件問題。對於方法二,以前使用Apache的hadoop僞分佈式集羣時,運行到map 0% reduce 0%卡住,調節下yarn-site.xml參數,可以完美運行了,原yarn-site.xml配置:

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>

調節後的配置:

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>3072</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>

Yarn配置詳細參數可見:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-configurations-resourcemanager-nodemanager/

可是這些配置同樣在CDH的hadoop上卻出現在running job卡住的問題。

(4) 最終解決方案:

把yarn-site.xml中關於資源調節的配置刪除即可。

原yarn-site.xml配置:

<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2560</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
</configuration>

修改後yarn-site.xml文件:

<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>

重啓resourcemanager和nodemanager守護進程,再次運行pi實例,會發現作業成功運行!

    https://blog.csdn.net/aspkhdp/article/details/49996689

參考資料:http://stackoverflow.com/questions/24481439/cant-run-a-mapreduce-job-on-hadoop-2-4-0
————————————————
版權聲明:本文爲CSDN博主「菜鳥級的IT之路」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/WYpersist/article/details/80202055

發佈了12 篇原創文章 · 獲贊 121 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章