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?
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 KlassePreconditions
keine Methode hatcheckArgument(String,Object)
.com.google.common.base.Preconditions
in 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.hive
Fat 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
Antworten:
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.
quelle
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 auchhive-exec-*.jar
ein „Fett JAR“ , die mehr externen Bibliotheken neu verpackt. Die Hive-Dienste / CLI werden nicht ohne ausgeführthive-exec-*.jar
, was bedeutet, dass wir nicht einfach löschen könnenguava-*.jar
, um das Kompatibilitätsproblem zu umgehen.Im Moment sind die einzigen Optionen entweder:
hive-exec-*.jar
Problem zu umgehen , oderquelle