最近在debug hive的一個bug,之前都是使用列印日志來跟蹤源碼,這種方式效率比較低(每次更改了源碼都要重新編譯并替換線上的jar包),java的應用可以支援remote debug的,hive也不例外,主要是通過hive --debug來實作.
在運作hive --debug時遇到如下問題:
1
2
3
<code>ERROR: Cannot load </code><code>this</code> <code>JVM TI agent twice, check your java command line </code><code>for</code> <code>duplicate jdwp options.</code>
<code>Error occurred during initialization of VM</code>
<code>agent library failed to init: jdwp</code>
根據錯誤資訊,可以看到是由于重複的jdwp參數導緻。hive其實是一個shell腳本,追蹤其運作情況:
<code>cd</code> <code>${HIVE_HOME}</code><code>/bin</code><code>;sh -x .</code><code>/hive</code> <code>--debug</code>
檢視hive --debug的調用情況:
4
5
6
7
8
9
<code> </code><code>if</code> <code>[ </code><code>"$DEBUG"</code> <code>]; </code><code>then</code>
<code> </code><code>if</code> <code>[ </code><code>"$HELP"</code> <code>]; </code><code>then</code>
<code> </code><code>debug_help</code>
<code> </code><code>exit</code> <code>0</code>
<code> </code><code>else</code>
<code> </code><code>get_debug_params </code><code>"$DEBUG"</code>
<code> </code><code>export</code> <code>HADOOP_CLIENT_OPTS=</code><code>"$HADOOP_CLIENT_OPTS $HIVE_MAIN_CLIENT_DEBUG_OPTS"</code>
<code> </code><code>fi</code>
<code>fi</code>
這裡是:
<code>HIVE_MAIN_CLIENT_DEBUG_OPTS=' -XX:+UseParallelGC </code>
<code>-agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=y'</code>
HIVE_MAIN_CLIENT_DEBUG_OPTS 變量是在${HIVE_HOME}/bin/ext/debug.sh 中,這個腳本控制了debug的參數,比如說端口
10
11
12
13
14
15
16
<code>get_debug_params(){</code>
<code> </code><code>set_debug_defaults</code>
<code> </code><code>parse_debug $1</code>
<code> </code><code># For Debug -XX:+UseParallelGC is needed, as it is a (unfortunately not perfect)</code>
<code> </code><code># workaround for JVM 6862295 bug, that affects some JVMs still in use</code>
<code> </code><code>if</code> <code>does_jvm_support_ti; </code><code>then</code>
<code> </code><code>export</code> <code>HIVE_MAIN_CLIENT_DEBUG_OPTS=" -XX:+UseParallelGC </code>
<code> </code><code>-agentlib:jdwp=transport=dt_socket,server=y,$port,$main_suspend"</code>
<code> </code><code>export</code> <code>HIVE_CHILD_CLIENT_DEBUG_OPTS=" -XX:+UseParallelGC </code>
<code> </code><code>-agentlib:jdwp=transport=dt_socket,server=y,$child_suspend"</code>
<code> </code><code>else</code>
<code> </code><code>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,$port,$main_suspend"</code>
<code> </code><code>export</code> <code>HIVE_CHILD_CLIENT_DEBUG_OPTS=" -XX:+UseParallelGC</code>
<code> </code><code>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,$child_suspend"</code>
<code> </code><code>fi</code>
最終hive運作的指令為:
<code>exec</code> <code>${HADOOP_HOME}</code><code>/bin/hadoop</code> <code>jar hive-cli-0.13.1.jar</code>
<code> </code><code>org.apache.hadoop.hive.cli.CliDriver --hiveconf hive.aux.jars.path=xxxxx</code>
而在${HADOOP_HOME}/bin/hadoop中,設定HADOOP_OPTS時,又引用了HADOOP_CLIENT_OPTS這個變量,就導緻jdwp 的參數重複了
隻需要注釋下面一行即可以:
<code>HADOOP_OPTS=</code><code>"$HADOOP_OPTS $HADOOP_CLIENT_OPTS"</code>
這其實是一個bug:
相關的bug id
<a href="https://issues.apache.org/jira/browse/HIVE-3936" target="_blank">https://issues.apache.org/jira/browse/HIVE-3936</a>
bug描述:
<code>HADOOP_CLIENT_OPTS appended twice causes JVM failures</code>
在官方提供的bug id中可以看到hive0.13是fix這個bug的,具體的patch如下:
<code>diff</code> <code>--git bin</code><code>/hive</code> <code>bin</code><code>/hive</code>
<code>index 40e2c75..434ea6c 100755</code>
<code>--- bin</code><code>/hive</code>
<code>+++ bin</code><code>/hive</code>
<code>@@ -251,7 +251,6 @@ </code><code>if</code> <code>[ </code><code>"$DEBUG"</code> <code>]; </code><code>then</code>
<code>- </code><code>export</code> <code>HADOOP_OPTS=</code><code>"$HADOOP_OPTS $HADOOP_CLIENT_OPTS"</code>
<code> </code><code>fi</code>
經過測試,這個path并沒有生效。
本文轉自菜菜光 51CTO部落格,原文連結:http://blog.51cto.com/caiguangguang/1564148,如需轉載請自行聯系原作者