一. 问题描述
启动hive任务会偶发性的出现,如下截图报错:
描述比较清楚:
ERROR: transport error 202: bind failed: Address already in use
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750]
因为端口被占用,导致JDWP初始化失败。
二. 问题分析
1. 根本原因
什么是JDWP,JDWP 是 Java Debug Wire Protocol(Java调试线协议)的缩写。它是一种用于远程调试 Java 程序的协议,允许开发人员连接调试器与正在运行的 Java 虚拟机(JVM)进行通信和交互。
对于hadoop中,yarn-site.xml 中配置了:
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value> -Xdebug -Xrunjdwp:transport=dt_socket,address=5001,server=y,suspend=n</value>
</property>
yarn.app.mapreduce.am.command-opts
:表示MR AppMaster的启动参数,其中-Xdebug -Xrunjdwp:transport=dt_socket,address=5001,server=y,suspend=n
表示:
启用 JVM 的调试支持,并通过套接字传输方式,在指定的端口(5001)上作为调试服务器等待调试器的连接。JVM 在启动时不会暂停,而是立即开始执行。
也就是说启动AppMaster时,会找一个指定端口(这里是5001)作为调试服务器,用于等待调试器的连接。
而上面的报错是因为调试器端口被占用导致 JDWP初始化失败,进而使整个hive任务还没运行就挂掉。
这就是任务挂掉的根本原因
2. 偶发性的原因
我们搭建3个运行节点的hadoop高可用集群,当任务较少时,提到集群上的任务不会报错,当同时提几个任务时会出现某些任务,debug端口被占用的情况。
这个情况很好分析,因为是hive on yarn,每提交一个hive任务都会启动一个appMaster,而每个appMaster都会开启一个debug端口,当多个hive任务都提交到同一个节点时,就会出现同一个运行节点启动了多个相同的debug接口,导致端口冲突,任务挂掉。
三. 问题解决
解决方式比较明确,就是去掉appMaster的debug功能,这个是在hadoop的yarn-site.xml以及hive引用的hadoop配置(yarn-site.xml)。
- 注释掉hadoop集群中yarn-site.xml上述配置,并重启集群,或动态刷新集群配置
- 注释掉hive中引用的hadoop配置(yarn-site.xml),因为是hive on yarn所以不需重启,配置将在下一次提交任务生效。
hadoop动态刷新配置(未生效)ing:
1、动态刷新hdfs配置
如果是HA集群则在两个namenode节点上执行
hdfs dfsadmin hdfs://nn1:9000 -refreshSuperUserGroupsConfiguration
hdfs dfsadmin hdfs://nn2:9000 -refreshSuperUserGroupsConfiguration
2、动态刷新yarn配置
如果是HA集群则在两个namenode节点上执行
yarn rmadmin hdfs://nn1:9000 -refreshSuperUserGroupsConfiguration
yarn rmadmin hdfs://nn2:9000 -refreshSuperUserGroupsConfiguration