最近在debug hive的一个bug,之前都是使用打印日志来跟踪源码,这种方式效率比较低(每次更改了源码都要重新编译并替换线上的jar包),java的应用可以支持remote debug的,hive也不例外,主要是通过hive --debug来实现.

在运行hive --debug时遇到如下问题:

ERROR: Cannot load this JVM TI agent twice, check your java command line for duplicate jdwp options.
Error occurred during initialization of VM
agent library failed to init: jdwp

根据错误信息,可以看到是由于重复的jdwp参数导致。hive其实是一个shell脚本,追踪其运行情况:

cd ${HIVE_HOME}/bin;sh -x ./hive --debug

查看hive --debug的调用情况:

 if [ "$DEBUG" ]; thenif [ "$HELP" ]; thendebug_helpexit 0elseget_debug_params "$DEBUG"export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS $HIVE_MAIN_CLIENT_DEBUG_OPTS"fi
fi

这里是:

HIVE_MAIN_CLIENT_DEBUG_OPTS=' -XX:+UseParallelGC
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=y'

HIVE_MAIN_CLIENT_DEBUG_OPTS 变量是在${HIVE_HOME}/bin/ext/debug.sh 中,这个脚本控制了debug的参数,比如说端口

get_debug_params(){set_debug_defaultsparse_debug $1# For Debug -XX:+UseParallelGC is needed, as it is a (unfortunately not perfect)# workaround for JVM 6862295 bug, that affects some JVMs still in useif does_jvm_support_ti; thenexport HIVE_MAIN_CLIENT_DEBUG_OPTS=" -XX:+UseParallelGC -agentlib:jdwp=transport=dt_socket,server=y,$port,$main_suspend"export HIVE_CHILD_CLIENT_DEBUG_OPTS=" -XX:+UseParallelGC -agentlib:jdwp=transport=dt_socket,server=y,$child_suspend"elseexport HIVE_MAIN_CLIENT_DEBUG_OPTS=" -XX:+UseParallelGC -Xdebug -Xrunjdwp:transport=dt_socket,server=y,$port,$main_suspend"export HIVE_CHILD_CLIENT_DEBUG_OPTS=" -XX:+UseParallelGC-Xdebug -Xrunjdwp:transport=dt_socket,server=y,$child_suspend"fi

最终hive运行的命令为:

exec ${HADOOP_HOME}/bin/hadoop jar hive-cli-0.13.1.jarorg.apache.hadoop.hive.cli.CliDriver --hiveconf hive.aux.jars.path=xxxxx

而在${HADOOP_HOME}/bin/hadoop中,设置HADOOP_OPTS时,又引用了HADOOP_CLIENT_OPTS这个变量,就导致jdwp 的参数重复了

只需要注释下面一行即可以:

HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"

这其实是一个bug:

相关的bug id

https://issues.apache.org/jira/browse/HADOOP-9455

https://issues.apache.org/jira/browse/HIVE-3936

bug描述:

HADOOP_CLIENT_OPTS appended twice causes JVM failures

在官方提供的bug id中可以看到hive0.13是fix这个bug的,具体的patch如下:

diff --git bin/hive bin/hive
index 40e2c75..434ea6c 100755
--- bin/hive
+++ bin/hive
@@ -251,7 +251,6 @@ if [ "$DEBUG" ]; thenelseget_debug_params "$DEBUG"export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS $HIVE_MAIN_CLIENT_DEBUG_OPTS"
-    export HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"fifi
经过测试,这个path并没有生效。

转载于:https://blog.51cto.com/caiguangguang/1564148

hive启动debug问题相关推荐

  1. 【整理】ABAP快捷启动Debug三种方式

    ABAP快捷启动Debug三种方式 1./H :Start Debugger 正常的Debug模式,会从头开始执行: 2./HS :Start System Debugging 区别于"/H ...

  2. hadoop hive 2.1.1 将Hive启动为服务

    我们之前使用的Shell方式与Hive交互只是Hive交互方式中的一种,还有一种就是将Hive启动为服务,然后运行在一个节点上,那么剩下的节点就可以使用客户端来连接它,从而也可以使用Hive的数据分析 ...

  3. 详解:hive启动hiveserver2连JDBC报错:Could not open client transport with JDBC Uri 解决方案

    hive启动hiveserver2连JDBC报错:Could not open client transport with JDBC Uri 解决方案 [hadoop@hadoop001 bin]$ ...

  4. hive启动报错:Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D

    hive启动时遇到以下错误: Exception in thread "main"java.lang.RuntimeException: java.lang.IllegalArgu ...

  5. Hive启动报错:java.lang.ClassNotFoundException: org.apache.tez.dag.api.TezConfiguration

    <!--Hive启动报错:Caused by: java.lang.ClassNotFoundException: org.apache.tez.dag.api.TezConfiguration ...

  6. Hive启动报错 java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang

    Hive启动报错 [lili@hadoop102 hive]$ bin/hive which: no hbase in (/usr/lib64/qt-3.3/bin:/usr/local/bin:/b ...

  7. Hive 启动报错java.net.URISyntaxException: Relative path in absolute URI 解决方法

    linux安装hive 遇到问题:Hive 启动报错java.net.URISyntaxException: Relative path in absolute URI 解决方法 方法记录 提示:这里 ...

  8. Hive启动和简单指令总结

    Hive 启动总结 1. 背景 作为传统的服务器端程序,hive具备多种启动方式 java api(jdbc).shell客户端.web页面 jdbc https://mvnrepository.co ...

  9. centos7 hive启动报错 没有到主机的路由,防火墙已关闭

    问题 hive启动报错,防火墙已关闭 at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at org.datanucl ...

  10. VSCode启动Debug模式调试Python文件

    VSCode启动Debug模式调试Python文件 一.调试一般的Python文件 1.点击Extensions安装扩展插件 2.在输入框中输入Python,点击安装 3.点击界面中的"Ru ...

最新文章

  1. SAP S/4HANA BP功能
  2. Node 深入Stream(2)
  3. 每日一皮:强大的sudo ...
  4. SSIS的文件系统任务实例(zz)
  5. maven各个属性参数详解
  6. python字典排序及字典集合去重高阶教程
  7. linux脚本expect分区,linux – 从不同位置执行Expect脚本
  8. J2EEd 13个规范
  9. Markdown效率参考手册
  10. 初级程序员面试不靠谱指南(四)
  11. Windows程序设计(5):移动窗口、调整窗口大小
  12. r语言 python 股票_如何用R语言下载到国内股票数据?
  13. TOGAF ADM指导
  14. oracle alert下的文件,Oracle 11g alert文件的变化 --
  15. cimiss java,cimis
  16. js使用双层for循环实现倒三角形、正三角形
  17. 基于Keilv5新建STM32F030工程
  18. 数据可视化 | Tableau从入门到高手 入门联接关系数据预处理
  19. uni-app 即时聊天:朋友圈
  20. 邮件 黑名单 白名单 灰名单

热门文章

  1. qt mdi 子窗口关闭再打开_QT 信号的使用方法
  2. 【机器学习系列】变分推断第二讲:基于Mean Field的变分推断解法
  3. 估计理论(5):BLUE的定义(6.3)
  4. 关于Activity的四种启动模式详解
  5. 【PRML 学习笔记】第一章 - 介绍 (Introduction)
  6. 241.为运算表达式设计优先级(力扣leetcode) 博主可答疑该问题
  7. 68.x的平方根(力扣leetcode) 博主可答疑该问题
  8. kuka机器人齿轮箱油_库卡KUKA机器人保养润滑油00-144-898
  9. mysql表格字放大_删除MySQL表中内容,表大小反而变大了
  10. Linux源码包和脚本安装包的安装方法