近日新寫完的spark任務放到yarn上面執行時,在yarn的slave節點中一直看到報錯日誌:鏈接不到0.0.0.0:8030 。apache
1 The logs are as below: 2 2014-08-11 20:10:59,795 INFO [main] org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8030 3 2014-08-11 20:11:01,838 INFO [main] org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8030. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
這就很奇怪了,由於slave執行任務時應該連接的是master節點的8030端口,正常狀況下應該爲 masterIP:8030.框架
按照常規思路,首先檢查配置文件:yarn-site.xml 。查看裏面配置的yarn.resourcemanager.scheduler.address 是否爲master。oop
<property> <name>yarn.resourcemanager.hostname</name> <value>master1</value> </property>
<property> <name>yarn.resourcemanager.scheduler.address</name> <value>master1:8030</value> </property>
這一項排查事後,重啓cluser,故障依舊。spa
繼續排查,查看環境變量,看是否slave啓動時是否沒有加載yarn-site.xml。env|grep YARN 直接查看全部YARN的環境變量,其中能夠看到YARN_CONF_DIR = HADOOP_CONF_DIR ,而且指向了正確的目錄路徑。日誌
那麼就很奇怪了,繼續排查。若是環境方面都沒有問題,寫一下 hard coding.在代碼裏面直接寫死:code
1 Configuration conf = new Configuration(); 2 conf.set("fs.default.name",hdfsUri); 3 conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); 4 conf.set("mapreduce.framework.name", "yarn"); 5 conf.set("fs.AbstractFileSystem.hdfs.impl", "org.apache.hadoop.fs.Hdfs"); 6 conf.set("yarn.resourcemanager.address", yarnip+":"+8030); //設置RM 訪問位置
從新執行job,仍然報錯。這下就有點暈菜了,冷靜一下,目前已經排查的有:server
一、配置文件:master、slave的yarn-site.xml 都正常無問題。xml
二、環境變量:master、slave的環境變量都正常無問題。blog
三、hard-coding,也無效果。ip
難道是框架本省的問題?
在spark根目錄檢索0.0.0.0,發如今spark依賴的一個包裏面還真有一個匹配的:
spark-core-assembly-0.4-SNAPSHOT.jar
打開這個jar包,裏面有一個yarn-default.xml 。這裏面配置的是0.0.0.0. 按道理來講配置文件優先級應該是大於jar的。
改了試一下!
把0.0.0.0改爲master的IP,從新打包上傳,執行job。
Oh my god!
成功了!
看看時間,爲了這個問題已經搞了大半個夜了。算了,先睡覺。具體問題留待週一檢查。
但初步認爲:應該是yarn的client再執行job時,會取一個masterIP 值,若是取不到,則默認取yarn-defalut中的值。因此關鍵就是找到從哪裏取值。這個問題看看源碼應該不是大問題。
OK,睡覺去!