Wie kann ich hive bitten, detailliertere Fehler anzugeben?

8

Wenn ich starte hive, wird der folgende Fehler angezeigt

[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)

Was bedeutet das? Ist es möglich, mehr Details anzuzeigen?

Gänseblümchen
quelle
com.google.common.schlägt vor, dass Sie eine Versionsinkongruenz mit "Guave" oder "Protobuf" JAR haben. Möglicherweise hat eine ältere JAR den ersten Platz im CLASSPATH belegt, mit einer älteren Version, in der die Klasse Preconditionskeine Methode hat checkArgument(String,Object).
Samson Scharfrichter
Bearbeiten> Hive hat keine Kontrolle über dieses Ding, es ist ein Fehler auf niedriger Ebene innerhalb des dynamischen JVM-Linkers - und die JVM kann Ihnen unmöglich mehr "Details" geben. Es wird lediglich angegeben, dass eine Klasse com.google.common.base.Preconditionsin einer JAR in ihrem CLASSPATH gefunden wurde (vorausgesetzt, Hive verwendet keinen benutzerdefinierten ClassLoader, der den CLASSPATH überschreibt), aber diese Klasse verfügt nicht über die genaue Methode, die sie zur Kompilierungszeit hatte.
Samson Scharfrichter
Versuchen Sie zu verstehen, wie der CLASSPATH automatisch für den alten hiveFat Client generiert wird - folgen Sie beispielsweise der Kette von Shell-Skripten, die Shell-Skripte aufrufen, die Shell-Skripte aufrufen, bis Sie den eigentlichen Befehl findenjava -cp <CLASSPATH> etc etc
Samson Scharfrichter

Antworten:

17

Dieser Fehler tritt auf, wenn ein Programm mit einer Jar-Version kompiliert und auf einer anderen (normalerweise alten) Version desselben Jar ausgeführt wird. In diesem Szenario besteht möglicherweise ein Konflikt in der Guaven-Jar-Dateiversion zwischen Hadoop und Hive.

Schritt 1 : Gehen Sie zu HADOOP_INSTALLATION_DIR / share / hadoop / common / lib und überprüfen Sie die Version guava.jar

Schritt 2 : Gehen Sie nun zu HIVE_INSTALLATION_DIR / lib und vergleichen Sie die Guavendateiversion von hive mit hadoop. Wenn sie nicht identisch sind, löschen Sie die ältere Version unter ihnen und kopieren Sie die neuere Version in beide.

Abhiped
quelle
1
Der richtige Pfad für die Bibliothek im Hadoop-Installationsverzeichnis ist HADOOP_INSTALLATION_DIR / share / hadoop / common / lib
Shubhashish Mishra
1
@ ShubhashishMishra Ja, danke, dass du mich korrigiert hast. Ich werde es bearbeiten.
Abhiped
3
Ich verwende Hadoop 3.2.1 (mit guava-27.0-jre.jar listenablefuture-9999.0-leer, um Konflikte mit guava.jar zu vermeiden) und Hive 3.1.2 (mit guava-19.0.jar) Ersetzen Sie guava-19.0.jar durch guava-27.0-jre.jar, aber es funktioniert immer noch nicht. Ausnahme im Thread "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Unzulässige Zeichenentität: Erweiterungszeichen ( Code 0x8 bei [Zeile, Spalte, System-ID]: [3215,96, "Datei: /usr/src/hive/conf/hive-site.xml"]
Edye Chan
1
@EdyeChan Ich hatte fast die gleichen Versionen wie Sie - hadoop 3.2.1 (mit guava-27.0-jre.jar) - hive 2.3.6 (mit guava-14.0.1.jar) Ich habe guava-27.0-jre.jar von kopiert HADOOP_INSTALLATION_DIR / share / hadoop / common / lib an HIVE_INSTALLATION_DIR / lib und es löste das Problem.
Scirocco
Ich habe den Hive-Quellcode pom.xml mit der Guava-Version geändert, die hadoop verwendet, und das gleiche neu erstellt. es hat bei mir funktioniert. <guava.version> 27.0-jre </guava.version>
ASe
10

Zusammenfassend meine Antwort aus einer ähnlichen Frage zu Super User: https://superuser.com/a/1501841/115371

Hadoop Core hat seine Guava-Version in HADOOP-15960 aktualisiert , die in Hadoop 3.0.4, 3.1.3 und 3.2.1 veröffentlicht wurde.

Hive 3.1.2 Schiffe ihre eigene inkompatible Version von Guava, nicht nur in lib/guava-*.jar, sondern auch hive-exec-*.jarein „Fett JAR“ , die mehr externen Bibliotheken neu verpackt. Die Hive-Dienste / CLI werden nicht ohne ausgeführt hive-exec-*.jar, was bedeutet, dass wir nicht einfach löschen können guava-*.jar, um das Kompatibilitätsproblem zu umgehen.

Im Moment sind die einzigen Optionen entweder:

  • Erstellen Sie Hive aus der neuesten Quelle, die HIVE-22126 enthalten sollte , um das hive-exec-*.jarProblem zu umgehen , oder
  • Verwenden Sie Hadoop 3.0.3, 3.2.0 oder 3.1.2, die letzten Versionen vor HADOOP-15960. Beachten Sie jedoch, dass die in diesen Hadoop-Versionen gelieferte Guava-JAR eine bekannte Sicherheitsanfälligkeit aufweist : CVE-2018-10237 .
Tim Yates
quelle
Tatsächlich ist der Patch von HIVE-22126 falsch. Muss mehr repariert werden.
Eugene Chung