【斩虫】Hadoop中作业执行刚开始就挂掉的两种情况

这篇具有很好参考价值的文章主要介绍了【斩虫】Hadoop中作业执行刚开始就挂掉的两种情况。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开门见山。

最近在搭建基于 Hadoop 3.3.6 的高可用集群时,遇到了虽然守护进程能正常启动,但是提交 WordCount 示例程序后作业没有办法启动执行的情况(刚开始就挂了),查看日志发现主要是以下两种情况:

  1. 提示 /bin/java 文件不存在。

    bash: /bin/java: No such file or directory  
    
  2. 启动 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.xmlyarn.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 日志了:文章来源地址https://www.toymoban.com/news/detail-825428.html

到了这里,关于【斩虫】Hadoop中作业执行刚开始就挂掉的两种情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决jupyter notebook使用matplotlib画图时内核挂掉的问题

    在笔记本开头添加下列代码:  os.environ[“kmp_duplicate_lib_ok”]=“true\\\"是Python中设置环境变量的一种方式。该语句将\\\"kmp_duplicate_lib_ok\\\"这个环境变量的值设置为\\\"true”。 在Python中,os.environ是一个字典对象,用于访问和修改当前进程的环境变量。通过设置环境变量,我们可以在程序

    2024年02月21日
    浏览(47)
  • MAC M1:解决在jupyter中引入tensorflow内核似乎挂掉的问题

    我的设备:Macbook air M1; macOS 12.3 考虑到大家遇到这个问题,通常是已经安装好anaconda与jupyter了。因此直接讲我的操作 一.打开终端,重新创建一个tensorflow环境: 二.由于新创建的虚拟环境没有jupyter,需要重新安装。 这里有两种方法: 1.使用pip安装 2.直接使用anaconda安装,

    2023年04月20日
    浏览(41)
  • flink执行任务运行10h以后挂掉并且报错

    问题描述 flink运行jar包任务,运行几个小时或者1天以后,任务就会挂掉!!! 第一个错误是 2023-02-01 23:43:08,083 INFO org.apache.flink.runtime.executiongraph.ExecutionGraph [] - Window(TumblingEventTimeWindows(60000), EventTimeTrigger, getHvcDownLine) - Sink: Unnamed (1/1) (8672ad64cfc4ddce37756e60242432be) switched from RUN

    2024年02月10日
    浏览(45)
  • Hadoop作业篇(一)

    一、选择题 1. 以下哪一项不属于Hadoop可以运行的模式__C____。 A. 单机(本地)模式 B. 伪分布式模式 C. 互联模式 D. 分布式模式 C. 互联模式 不属于Hadoop可以运行的模式。 Hadoop主要有四种运行模式: A. 单机(本地)模式:在单个计算机上运行,适用于开发和测试。 B. 伪分布式

    2024年02月06日
    浏览(39)
  • UE5.1.1 C++从0开始(15.作业4个人作业分享)

    教程链接:https://www.bilibili.com/video/BV1nU4y1X7iQ 好吧这个作业应该是之前写的,但是我发现我没写,后面我又回去自己写了一遍再看代码,感觉上大差不差,各位可以看着我的和老师的还有自己的对比下。 SBTService_CheckHealth.h SBTService_CheckHealth.cpp SBTTask_HealSelf.h SBTTask_HealSelf.cpp 行

    2024年02月11日
    浏览(39)
  • Spark 作业执行流程

    Spark的基本组件,包括负责集群运行的Master和Worker,负责作业运行的Client和Driver,以及负责集群资源管理器(如YARN)和执行单元Executor等。 从架构层面上来说,每一个Spark Application都由控制集群的主控节点Master、负责集群资源管理的Cluster Manager、执行具体任务的Worker节点和执

    2024年02月09日
    浏览(34)
  • 【数据库】执行计划中的两趟算法机制原理,基于排序算法来分析,算法的限制,执行代价以及优化

    ​ 专栏内容 : 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学

    2024年02月05日
    浏览(43)
  • 搭建hadoop集群,从安装虚拟机开始直到hadoop成功搭建

    搭建Hadoop集群   一、实验目的与要求 学习和掌握Hadoop的相关应用,首先必须得学会搭建Hadoop集群。本次实验将针对Hadoop集群的搭建内容进行演练。学会虚拟机的安装和克隆,Linux系统的网络配置和SSH配置,Hadoop集群的搭建和配置,Hadoop集群测试,熟悉Hadoop集群基本的操作。

    2023年04月08日
    浏览(42)
  • 头歌大数据作业二:搭建Hadoop环境及HDFS

    课外作业二:搭建Hadoop环境及HDFS 作业详情 内容 阿里云-云起实验室-《搭建Hadoop环境》-Hadoop-2.10.1伪分布式: 1.截图本实验ECS的公网IP地址,并添加彩色框标注,如下图所示: 2.步骤6.启动Hadoop成功之后,截图并添加彩色框标注,如下图所示 3.hdfs 根目录创建文件夹(文件夹命

    2024年02月08日
    浏览(55)
  • 从零开始画自己的DAG作业依赖图(一)--前期准备

    背景: 由于业务场景需要展示作业之间的依赖关系,由于一些开源的插件和当前的业务逻辑有一些冲突,个人打算尝试从零开始,一点点实现自己的DAG图。同时用博客记录自己实现过程和总结,不正确的地方,欢迎指正提升。 场景分析: 数据开发中常常有作业之间的依赖,

    2024年02月05日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包