hive cliに'WARN: The method class org.apache.commons.logging.impl.SLF4JLogFactory#release() was invoked.'とかのWARNが出た時の対応
もはやhive cliは
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
となっていますが、CDH5系にアップグレードしたところ、hiveを起動すると
WARN: The method class org.apache.commons.logging.impl.SLF4JLogFactory#release() was invoked. WARN: Please see http://www.slf4j.org/codes.html#release for an explanation.
がSTDOUTに出力されるようになったので、それの対応。このメッセージはCDH5.5.2, CHD5.7で確認済み(hive のバージョンは1.1.0)。この記事では5.5.2での対応をつらつらと書いていますが、適宜読み替えてください。
このWARNはどうして出るのか(根本的なところではなく)
このWARNが出力される条件は:
- 何かしらのjarをaddする
- UDFでも、junitでもなんでもOK
- add後、何かしらのhqlを実行する
- show databasesでもなんでもOK
- インタープリタ、ファイル引数実行関係ない
- インタープリタ実行の場合は、exit後に出力される
sparkにバグがあるらしく、それに引きずられるらしい。
で、これは、既知の問題で、
に報告されている。このドキュメントの中では
~> export SPARK_HOME= ~> hive
で、OKになっているが、これは間違い。というのも、hiveの起動スクリプトで、SPARK_HOMEが自動で設定されるようになっているため。
で、SPARK_HOMEを探して、設定するようになった。
さらに、下記のチケットで、classpathにspark-assemblyが追加されるようになってしまった。
これは、CDH5.5.2に取り込まれている。
このバグへの対応(ワークアラウンド)
HIVE-9861はそもそも不要だったようで、下記のチケットで、この(HIVE-9861)対応は削除された。
が、この対応バージョンは、HIVE 2.1.0からで、CDHに取り込まれるのは先になる。
ということで、下記のようにHIVE-9608のpatchを-Rする。この対応により、上記のWARNは出なくなった。
$ pwd /opt/cloudera/parcels/CDH/lib/hive $ patch -p1 -R < HIVE-9861.1-spark.patch patching file bin/hive
$ diff -u bin/hive.org2016-03-07 bin/hive --- bin/hive.org2016-03-07 2016-03-07 14:11:09.035023930 +0900 +++ bin/hive 2016-03-07 14:53:44.747434717 +0900 @@ -108,13 +108,6 @@ CLASSPATH=${CLASSPATH}:$f; done -# add Spark assembly jar to the classpath -if [[ -n "$SPARK_HOME" ]] -then - sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar` - CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}" -fi - # add the auxillary jars such as serdes if [ -d "${HIVE_AUX_JARS_PATH}" ]; then hive_aux_jars_abspath=`cd ${HIVE_AUX_JARS_PATH} && pwd`