Cuando ejecuto hive
, muestra el siguiente error
[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)
Qué significa eso? ¿Es posible mostrar más detalles?
com.google.common.
sugiere que tenga una versión que no coincida con JAR "guava" o "protobuf". Posiblemente, un JAR anterior obtuvo el primer lugar en CLASSPATH, con una versión anterior en la que la clasePreconditions
no tiene ningún métodocheckArgument(String,Object)
.com.google.common.base.Preconditions
en un JAR presente en su CLASSPATH (suponiendo que Hive no use un ClassLoader personalizado que anule el CLASSPATH) pero esa clase no tiene el método exacto que tenía en el momento de la compilación.hive
cliente gordo heredado , por ejemplo, siga la cadena de scripts de shell que llama a scripts de shell que llama a scripts de shell, hasta que encuentre el comando realjava -cp <CLASSPATH> etc etc
Respuestas:
Este error aparece cuando un programa se compila usando una versión de Jar y se ejecuta en otra versión (típicamente antigua) del mismo Jar. En este escenario, principalmente podría haber un conflicto en la versión del archivo Jar de guayaba entre Hadoop y Hive.
Paso 1 : vaya a HADOOP_INSTALLATION_DIR / share / hadoop / common / lib y verifique la versión guava.jar
Paso 2 : Ahora ve a HIVE_INSTALLATION_DIR / lib y compara la versión del archivo de guayaba de la colmena con hadoop. Si no son iguales, elimine la versión anterior entre ellas y copie la versión más nueva en ambas.
fuente
Resumiendo mi respuesta de una pregunta similar sobre Super Usuario: https://superuser.com/a/1501841/115371
Hadoop core actualizó su versión de Guava en HADOOP-15960 , que salió en Hadoop 3.0.4, 3.1.3 y 3.2.1.
Hive 3.1.2 incluye su propia versión incompatible de Guava, no solo en
lib/guava-*.jar
, sino tambiénhive-exec-*.jar
, un "JAR gordo" que reempaqueta varias bibliotecas externas. Los servicios de Hive / CLI no se ejecutan sin élhive-exec-*.jar
, lo que significa que no podemos simplemente eliminarlosguava-*.jar
para solucionar el problema de compatibilidad.Por el momento, las únicas opciones son:
hive-exec-*.jar
solucionar el problema, ofuente