さかもとのブログ

つらつらと

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
  • インタープリタ、ファイル引数実行関係ない

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`