開門見山。
最近在搭建基于 Hadoop 3.3.6 的高可用集群時,遇到了雖然守護(hù)進(jìn)程能正常啟動,但是提交 WordCount 示例程序后作業(yè)沒有辦法啟動執(zhí)行的情況(剛開始就掛了),查看日志發(fā)現(xiàn)主要是以下兩種情況:
-
提示
/bin/java
文件不存在。bash: /bin/java: No such file or directory
-
啟動
MRAppMaster
失敗,原因是其拋出了java.lang.reflect.InaccessibleObjectException
異常。java.lang.reflect.InaccessibleObjectException: Unable to make ... accessible: module java.base does not "opens java.lang" to unnamed module @...
這里簡單寫一下二者的解決方法。
1. /bin/java 不存在
字面上看是 Bash 找不到可執(zhí)行文件 /bin/java
,但細(xì)想一下,無論是在 hadoop-env.sh
還是 yarn-env.sh
亦或者 yarn-site.xml
的 yarn.nodemanager.env-whitelist
配置中,我全都加上了 JAVA_HOME
的相關(guān)環(huán)境變量配置,我在任何地方都沒有寫過 /bin/java
這個路徑,就有點令人匪夷所思了。
但在看了 NodeManager 執(zhí)行作業(yè)時生成的默認(rèn)容器啟動腳本 launch_container.sh
后就能發(fā)現(xiàn)其末尾寫著這樣的語句(這個腳本的位置可以參考下方):
echo "Launching container"
exec /bin/bash -c "$JAVA_HOME/bin/java ... -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster ...
顯而易見,這里因為 $JAVA_HOME
環(huán)境變量沒有傳遞進(jìn)腳本,導(dǎo)致 bash
實際執(zhí)行的是 /bin/java
。
怎么解決這個問題?最粗暴的方式是直接給 Java 創(chuàng)建一個軟鏈 /bin/java
(網(wǎng)上很多復(fù)制粘貼的帖子給出的方法),這樣做雖然能跑,但其實沒觸及根本的問題。
還有一種方法是直接在 Hadoop安裝目錄/libexec/hadoop-config.sh
中導(dǎo)出一個 JAVA_HOME
環(huán)境變量。(網(wǎng)上的帖子里還有修改這里某個條件判斷語句的解決方案,但是在 Hadoop 新版中這部分代碼已經(jīng)重構(gòu)了)
我真的好想找出問題的根源哇!(╯▔皿▔)╯ 回去檢查配置文件,我也沒看出什么問題,該配置的都配置了。
到底還是偶然看到的 StackOverflow 的一位老哥點明了我(鏈接):
“不要在屬性值中換行”
回去檢查了一下我的 yarn-site.xml
配置,發(fā)現(xiàn) VSCode 格式化工具幫我格式化成了這個樣子:
去掉開頭的換行符,改成 <value>JAVA_HOME, ...</value>
就能把這個問題給解決了...原來是值中出現(xiàn)額外字符而導(dǎo)致的,哭笑不得。
2. java.lang.reflect.InaccessibleObjectException
這個異常貼到網(wǎng)上倒是能找到很多類似的解決方案,即加上 Java 選項 --add-opens java.base/java.lang=ALL-UNNAMED
,但大多是圍繞 ResourceManager, NodeManager 啟動時的情況。
問題就在于這里 MRAppMaster
的啟動參數(shù)位于 launch_container.sh
中,因而我需要找到辦法在腳本的這一句中加入 Java 選項:
exec /bin/bash -c "$JAVA_HOME/bin/java ... -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster ...
在官方文檔里按 java opts
這種關(guān)鍵詞查了半天沒找著,轉(zhuǎn)變思路用 MRAppMaster
搜索,還真就給我找著了。在 mapred-site.xml
配置中有這樣一個屬性(文檔鏈接):
屬性名 | 默認(rèn)值 | 說明 |
---|---|---|
yarn.app.mapreduce.am.command-opts | -Xmx1024m | Java opts for the MR App Master processes.... |
正好就是 MRAppMaster 進(jìn)程啟動時的 Java 選項,在 mapred-site.xml
中加入如下屬性配置即可:
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<!--保留了 -Xmx1024 -->
<value>--add-opens java.base/java.lang=ALL-UNNAMED -Xmx1024m</value>
<description>MR App Master 進(jìn)程的 Java 參數(shù)</description>
</property>
附: 找到 Job 執(zhí)行對應(yīng)容器 (Container) 的執(zhí)行日志
首先執(zhí)行一個作業(yè)(Job),然后在集群某臺機器中找到其對應(yīng)的 Application:
# 找到 Job 對應(yīng)的 Application
yarn application -list -appStates=ALL
返回內(nèi)容大概是這樣:
Total number of applications (application-types: [], states: [NEW, NEW_SAVING, SUBMITTED, ACCEPTED, RUNNING, FINISHED, FAILED, KILLED] and tags: []):2
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
application_1707118501768_0002 word count MAPREDUCE root default FINISHED SUCCEEDED 100% http://shworker1:19888/jobhistory/job/job_1707118501768_0002
找到 applicationId 后,查詢這個應(yīng)用在哪臺機器上執(zhí)行:
yarn application -status application_1707118501768_0002
返回內(nèi)容大概是這樣:
Application Report :
Application-Id : application_1707118501768_0002
Application-Name : word count
Application-Type : MAPREDUCE
User : root
Queue : default
Application Priority : 0
Start-Time : 1707120843501
Finish-Time : 1707120865825
Progress : 100%
State : FINISHED
Final-State : SUCCEEDED
Tracking-URL : http://shworker1:19888/jobhistory/job/job_1707118501768_0002
RPC Port : 42097
AM Host : shworker1
Aggregate Resource Allocation : 52071 MB-seconds, 35 vcore-seconds
Aggregate Resource Preempted : 0 MB-seconds, 0 vcore-seconds
Log Aggregation Status : DISABLED
Diagnostics :
Unmanaged Application : false
Application Node Label Expression : <Not set>
AM container Node Label Expression : <DEFAULT_PARTITION>
TimeoutType : LIFETIME ExpiryTime : UNLIMITED RemainingTime : -1seconds
其中 AM Host
即為應(yīng)用執(zhí)行所在主機,這里是 shworker1
。文章來源:http://www.zghlxwxcb.cn/news/detail-825428.html
在主機 shworker1
上進(jìn)入Hadoop的日志目錄,這個日志目錄默認(rèn)是 ${HADOOP_HOME}/logs
。其中會有一個子目錄 userlogs
,在這個目錄內(nèi)你就能找到 application_1707118501768_0002
的 Container 日志了:文章來源地址http://www.zghlxwxcb.cn/news/detail-825428.html
到了這里,關(guān)于【斬蟲】Hadoop中作業(yè)執(zhí)行剛開始就掛掉的兩種情況的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!