より詳細なエラーを提供するようにハイブに依頼するにはどうすればよいですか?


9

を実行するhiveと、次のエラーが表示されます

[hadoop@a74f90aecdad tmp]$ hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
    at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)
    at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
    at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536)
    at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554)
    at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:448)
    at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)
    at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5099)
    at org.apache.hadoop.hive.common.LogUtils.initHiveLog4jCommon(LogUtils.java:97)
    at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:81)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:699)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

どういう意味ですか?詳細を表示することは可能ですか?


com.google.common.「guava」または「protobuf」のいずれかのJARとバージョンの不一致があることを示唆しています。古いJARがCLASSPATHで最初に取得された可能性があり、古いバージョンではクラスPreconditionsにメソッドがありませんcheckArgument(String,Object)
Samson Scharfrichter

Edit> Hiveはそのことを制御できません。これは、JVM動的リンカー内の低レベルのエラーです。JVMは、それ以上の「詳細」を提供することはできません。com.google.common.base.PreconditionsCLASSPATHに存在するJAR内のクラスを検出した(HiveがCLASSPATHをオーバーライドするカスタムClassLoaderを使用しないと想定)ことを単に示しているだけですが、そのクラスにはコンパイル時の正確なメソッドがありません。
Samson Scharfrichter

レガシーhiveファットクライアント用にCLASSPATHがどのように自動生成されるかを理解してみてください。たとえば、実際のコマンドが見つかるまで、シェルスクリプトを呼び出すシェルスクリプトのチェーンに従ってくださいjava -cp <CLASSPATH> etc etc
Samson Scharfrichter

回答:


18

このエラーは、Jarの1つのバージョンを使用してプログラムをコンパイルし、同じJarの別の(通常は古い)バージョンで実行すると発生します。このシナリオでは、ほとんどの場合、HadoopとHiveの間のguava Jarファイルバージョンに競合がある可能性があります。

ステップ1HADOOP_INSTALLATION_DIR / share / hadoop / common / libに移動し、guava.jarのバージョンを確認します

ステップ2HIVE_INSTALLATION_DIR / libに移動して、hiveのguavaファイルバージョンをhadoopと比較します。同じでない場合は、古いバージョンを削除して、新しいバージョンを両方にコピーします。


1
hadoopインストールディレクトリ内のライブラリの正しいパスはHADOOP_INSTALLATION_DIR / share / hadoop / common / libです
Shubhashish Mishra

1
@ShubhashishMishraうん、訂正してくれてありがとう。編集します。
アブシップ

3
私はhadoop 3.2.1(guava-27.0-jre.jar listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jarを使用)およびhive 3.1.2(guava-19.0.jarを使用)を使用しています。 guava-19.0.jarをguava-27.0-jre.jarに置き換えますが、それでも機能しません。スレッド "main"の例外java.lang.RuntimeException:com.ctc.wstx.exc.WstxParsingException:不正な文字エンティティ:拡張文字(コード0x8 at [row、col、system-id]:[3215,96、 "file:/usr/src/hive/conf/hive-site.xml"]
Edye Chan

1
@EdyeChan私はあなたとほぼ同じバージョンを持っていました-hadoop 3.2.1(with guava-27.0-jre.jar)-hive 2.3.6(with guava-14.0.1.jar)私はguava-27.0-jre.jarをからコピーしましたHADOOP_INSTALLATION_DIR / share / hadoop / common / libをHIVE_INSTALLATION_DIR / libに変更すると、問題が解決しました。
Scirocco

Hadoopが使用しているものをグアババージョンでハイブソースコードpom.xmlに変更し、同じものを再構築しました。それは私のために働いた。<guava.version> 27.0-jre </guava.version>
ASe

10

スーパーユーザーに関する同様の質問からの私の回答の要約:https : //superuser.com/a/1501841/115371

Hadoopコアは、HADOOP-15960の Guavaバージョンを更新しました。これは、Hadoop 3.0.4、3.1.3、および3.2.1でリリースされました。

ハイブ3.1.2船グアバの独自の互換性のないバージョン、ではないだけlib/guava-*.jarでなく、hive-exec-*.jarいくつかの外部ライブラリを再パッケージ「脂肪JAR」。Hiveサービス/ CLIはなしでは実行hive-exec-*.jarできませんguava-*.jar。つまり、互換性の問題を回避するために単に削除することはできません。

現時点では、オプションは次のいずれかです。

  • 問題を回避するためにHIVE-22126を含む最新のソースからHiveをビルドするhive-exec-*.jar、または
  • HADOOP-15960より前の最後のリリースであるHadoop 3.0.3、3.2.0、または3.1.2を使用します。ただし、これらのHadoopバージョンに同梱されているGuava JARには、既知の脆弱性CVE-2018-10237)があることに注意してください

実際、HIVE-22126のパッチは正しくありません。さらに修正する必要があります。
Eugene Chung
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.