【斩虫】Hadoop中作业执行刚开始就挂掉的两种情况
开门见山。
最近在搭建基于 Hadoop 3.3.6 的高可用集群时,遇到了虽然守护进程能正常启动,但是提交 WordCount 示例程序后作业没有办法启动执行的情况(刚开始就挂了),查看日志发现主要是以下两种情况:
提示
/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 找不到可执行文件 /bin/java ,但细想一下,无论是在 hadoop-env.sh 还是 yarn-env.sh 亦或者 yarn-site.xml 的 yarn.nodemanager.env-whitelist 配置中,我全都加上了 JAVA_HOME 的相关环境变量配置,我在任何地方都没有写过 /bin/java 这个路径,就有点令人匪夷所思了。
但在看了 NodeManager 执行作业时生成的默认容器启动脚本 launch_container.sh 后就能发现其末尾写着这样的语句(这个脚本的位置可以参考下方):
echo "Launching container"
exec /bin/bash -c "$JAVA_HOME/bin/java ... -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster ...
显而易见,这里因为 $JAVA_HOME 环境变量没有传递进脚本,导致 bash 实际执行的是 /bin/java。
怎么解决这个问题?最粗暴的方式是直接给 Java 创建一个软链 /bin/java (网上很多复制粘贴的帖子给出的方法),这样做虽然能跑,但其实没触及根本的问题。
还有一种方法是直接在 Hadoop安装目录/libexec/hadoop-config.sh 中导出一个 JAVA_HOME 环境变量。(网上的帖子里还有修改这里某个条件判断语句的解决方案,但是在 Hadoop 新版中这部分代码已经重构了)
我真的好想找出问题的根源哇!(╯▔皿▔)╯ 回去检查配置文件,我也没看出什么问题,该配置的都配置了。
到底还是偶然看到的 StackOverflow 的一位老哥点明了我(链接):

“不要在属性值中换行”
回去检查了一下我的 yarn-site.xml 配置,发现 VSCode 格式化工具帮我格式化成了这个样子:

去掉开头的换行符,改成 <value>JAVA_HOME, ...</value> 就能把这个问题给解决了...原来是值中出现额外字符而导致的,哭笑不得。
2. java.lang.reflect.InaccessibleObjectException


这个异常贴到网上倒是能找到很多类似的解决方案,即加上 Java 选项 --add-opens java.base/java.lang=ALL-UNNAMED ,但大多是围绕 ResourceManager, NodeManager 启动时的情况。
问题就在于这里 MRAppMaster 的启动参数位于 launch_container.sh 中,因而我需要找到办法在脚本的这一句中加入 Java 选项:
exec /bin/bash -c "$JAVA_HOME/bin/java ... -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster ...
在官方文档里按 java opts 这种关键词查了半天没找着,转变思路用 MRAppMaster 搜索,还真就给我找着了。在 mapred-site.xml 配置中有这样一个属性(文档链接):
| 属性名 | 默认值 | 说明 |
|---|---|---|
| yarn.app.mapreduce.am.command-opts | -Xmx1024m | Java opts for the MR App Master processes.... |
正好就是 MRAppMaster 进程启动时的 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 进程的 Java 参数</description>
</property>
附: 找到 Job 执行对应容器 (Container) 的执行日志
首先执行一个作业(Job),然后在集群某台机器中找到其对应的 Application:
# 找到 Job 对应的 Application
yarn application -list -appStates=ALL
返回内容大概是这样:
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 后,查询这个应用在哪台机器上执行:
yarn application -status application_1707118501768_0002
返回内容大概是这样:
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 即为应用执行所在主机,这里是 shworker1。
在主机 shworker1 上进入Hadoop的日志目录,这个日志目录默认是 ${HADOOP_HOME}/logs 。其中会有一个子目录 userlogs,在这个目录内你就能找到 application_1707118501768_0002 的 Container 日志了:

【斩虫】Hadoop中作业执行刚开始就挂掉的两种情况的更多相关文章
- vue中下载excel的使用,后端链接两种情况,一个是链接,一个是文件流
vue中下载excel使用 一.这是第一种情况,后台链接地址返回的是一个url,这个时候我只要在导出按钮上绑定exportData()这个事件方法就好了 exportData() { this ...
- Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法
Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. fs.listFiles方法,返回Loc ...
- Java执行shell脚本并返回结果两种方法的完整代码
Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...
- shell中调用R语言并传入参数的两种步骤
shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...
- 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用
当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直 ...
- sql中索引不会被用到的几种情况
1.查询谓词没有使用索引的主要边界,换句话说就是select *,可能会导致不走索引. 比如,你查询的是SELECT * FROM T WHERE Y=XXX;假如你的T表上有一个包含Y值的组合索引, ...
- Android中手机录屏并转换GIF的两种方式
之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
- Android中实现全屏、无标题栏的两种办法
在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...
- jsp中使用动态数据进行mySQL数据库的两种操作方法
使用动态数据进行数据库内容的增删改查操作有两种方法: 在此定义数据库连接为conn 假设有表单进行数据输入并提交到处理页面一种是使用预编译格式: 其格式如下: String name = reques ...
随机推荐
- 关于EF延时加载的面试题
public async Task<ActionResult> GetData() { var data = (from leftdata in GetLeft() join rightd ...
- 初三年后集训测试---T1排序
初三年后集训测试 $T 1 $ 排序 $$HZOI$$ ·题意: 给定 \(4n\) 个整数,求 : \[\max\{\sum_{i=1}^{4n}(A_{i,1} \times A_{i,2} - ...
- windows权限维持汇总
Windows 权限维持 一.文件层面 1)attrib 使用 Attrib +s +a +h +r 命令 s:设置系统属性(System) a:设置存档属性(Archive) h:设置隐藏属性(Hi ...
- LOTO示波器统计曲线和故障分析pass/fail测试
LOTO示波器统计曲线和故障分析pass/fail测试 虚拟示波器可以应用在工业自动化检测中,除了常规的检测波形和测量值参数以外,由多个行业客户定制和验证的统计曲线和故障分析(pass/fail)功能 ...
- 这应该是全网最详细的Vue3.5版本解读
前言 Vue3.5正式版在这两天发布了,网上已经有了不少关于Vue3.5版本的解读文章.但是欧阳发现这些文章对3.5中新增的功能介绍都不是很全,所以导致不少同学有个错觉,觉得Vue3.5版本不过如此, ...
- 为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义?
为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义? 类的静态成员变量需要在源文件中进行定义,以便在链接阶段能够正确地分配内存并为其分配地址. 当你在类的头文件中声明一个静态成员变量时,这只 ...
- libtool版本错配(libtool version mismatch)
当使用configure和makefile编译项目时,出现如下报错: libtool: Version mismatch error. This is libtool 2.4.6, but the`` ...
- 【笔记】node常用方法(持续更新)
1.path.basename(path[, ext]) path <string> ext <string> 可选的文件扩展名. 返回: <string> pat ...
- PyCharm 的一些基本设置&&常用插件&&快捷键
PyCharm一些基本设置 1.主题色彩 2.添加设置:Ctrl+鼠标滚轮上下调节字体大小 3. 中文语言包 4.翻译插件 5.快捷键
- 编写自己的简易版网络协议栈(1)--arp协议,使用wireshark抓包分析
实验环境: 略. 实验背景:已编写好基于以太网接口的输入处理,能够解析到以太网数据包内的帧类型. 1. 协议栈底层采用轮询方式,即轮询以太网数据包. 2. 若收到数据,则交由以太网输入处理模块进行解析 ...