¿Cómo puedo pedirle a Hive que proporcione un error más detallado?

9

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?

margarita
fuente
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 clase Preconditionsno tiene ningún método checkArgument(String,Object).
Samson Scharfrichter
Editar> Hive no tiene control sobre eso, es un error de bajo nivel dentro del enlazador dinámico JVM, y la JVM no puede darle más "detalles" que eso. Simplemente afirma que ha encontrado una clase com.google.common.base.Preconditionsen 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.
Samson Scharfrichter
Intente comprender cómo CLASSPATH se genera automáticamente para el hivecliente 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
Samson Scharfrichter

Respuestas:

18

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.

Abhiped
fuente
1
La ruta correcta para la biblioteca en el directorio de instalación de hadoop es HADOOP_INSTALLATION_DIR / share / hadoop / common / lib
Shubhashish Mishra
1
@ShubhashishMishra Sí, gracias por corregirme. Lo editaré
Abhiped
3
Estoy usando hadoop 3.2.1 (con guava-27.0-jre.jar listenablefuture-9999.0-empty-to-evitar-conflict-with-guava.jar) y la colmena 3.1.2 (con guava-19.0.jar), yo reemplace guava-19.0.jar con guava-27.0-jre.jar, pero aún no funciona, Excepción en el hilo "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: entidad de carácter ilegal: carácter de expansión ( código 0x8 en [row, col, system-id]: [3215,96, "file: /usr/src/hive/conf/hive-site.xml"]
Edye Chan el
1
@EdyeChan Tenía casi las mismas versiones que usted - hadoop 3.2.1 (con guava-27.0-jre.jar) - colmena 2.3.6 (con guava-14.0.1.jar) Copié guava-27.0-jre.jar de HADOOP_INSTALLATION_DIR / share / hadoop / common / lib to HIVE_INSTALLATION_DIR / lib y RESUELVE EL PROBLEMA.
Scirocco
Cambié el código fuente de la colmena pom.xml con la versión de guayaba que hadoop está usando y reconstruí el mismo. Funcionó para mí. <guava.version> 27.0-jre </guava.version>
ASe
10

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én hive-exec-*.jar, un "JAR gordo" que reempaqueta varias bibliotecas externas. Los servicios de Hive / CLI no se ejecutan sin él hive-exec-*.jar, lo que significa que no podemos simplemente eliminarlos guava-*.jarpara solucionar el problema de compatibilidad.

Por el momento, las únicas opciones son:

  • Build Hive de la última fuente, que debe incluir HIVE-22126 para hive-exec-*.jarsolucionar el problema, o
  • Utilice Hadoop 3.0.3, 3.2.0 o 3.1.2, las últimas versiones anteriores a HADOOP-15960. Pero tenga en cuenta que el JAR de guayaba incluido en estas versiones de Hadoop tiene una vulnerabilidad conocida : CVE-2018-10237 .
Tim Yates
fuente
En realidad, el parche de HIVE-22126 es incorrecto. Necesita ser reparado más.
Eugene Chung