hive启动debug问题

最近在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" ]; then
   if [ "$HELP" ]; then
     debug_help
     exit 0
   else
     get_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_defaults
  parse_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 use
  if does_jvm_support_ti; then
    export 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"
  else
    export 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.jar
 org.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" ]; then
   else
     get_debug_params "$DEBUG"
     export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS $HIVE_MAIN_CLIENT_DEBUG_OPTS"
-    export HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
   fi
 fi
经过测试,这个path并没有生效。
时间: 2024-10-24 23:48:13

hive启动debug问题的相关文章

Hive启动报找不到hadoop版本问题

bin/hive 提示"xxx Illegal Hadoop Version: Unknown (expected A.B.* format)"类似这样的问题, 经过查看代码 public static String getMajorVersion() { String vers = VersionInfo.getVersion(); String[] parts = vers.split("\\."); if (parts.length < 2) { thr

hive启动问题 Unable to start Hive Cli

hive启动问题 Unable to start Hive Cli [[email protected] lib]$ hiveLogging initialized using configuration in file:/opt/hadoop/apache-hive-0.14.0-bin/conf/hive-log4j.properties SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [

Flask 1.0.2 启动debug模式

$ export FLASK_ENV=development # Windows将export 换成 set # $ export FLASK_DEBUG = 1 # 这样也可以 $ flask run Flask 1.0之后不再支持通过如下方式启动Debug app.debug = True app.run(debug=True) 更多可参考官方文档 中文版 原文地址:https://www.cnblogs.com/josephchuh/p/9295128.html

hive启动报错(整合spark)

spark整合hive后,hive启动报错: ls: cannot access /export/servers/spark/lib/spark-assembly-*.jar: No such file or directory 原因:spark版本升级到2.x以后,原有lib目录下的大JAR包被分散成多个小JAR包,原来的spark-assembly-*.jar已经不存在,所以hive没有办法找到这个JAR包. 解决方法:打开hive下面的bin目录,找到hive文件,编辑hive文件,找到如

tomcat启动debug模式,使用eclipse远程调试

生产环境和测试环境可以将tomcat启动设置为debug模式,开始远程监听端口,然后在本地的eclipse中对项目远程调试,即可对指定的服务器中的tomcat进行远程调试. 一.打开tomcat/bin/Catalina.bat文件,在下面位置输入:SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=800

hive启动一些错误记录

java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMeta 原因:因为没有正常启动Hive 的 Metastore Server服务进程. 解决方法:启动Hive 的 Metastore Server服务进程,执行如下命令: hive --service metastore & [1] 52460 Starting Hive Metastore Serve

hive启动报错 java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7B

启动hive报错: [[email protected] conf]# hive Logging initialized using configuration in file:/usr/local/hive/conf/hive-log4j.properties SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/local/hadoop2/share/hadoop/

Python 异常后,启动启动debug调试

这里需要修改python在异常发生后的处理流程 sys.excepthook 是python系统的异常处理器,重写一个自定义处理器,并在打印异常信息后,启动pdb. import sys def info(type, value, tb): # 异常类型 # 异常值 # 调用栈 if hasattr(sys, 'ps1') or not sys.stderr.isatty(): # we are in interactive mode or we don't have a tty-like #

Hive启动报错: Found class jline.Terminal, but interface was expected

报错: 1 [ERROR] Terminal initialization failed; falling back to unsupported 2 java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected 3 at jline.TerminalFactory.create(TerminalFactory.java:101) 4 at jline.Terminal