Como posso solicitar à seção para fornecer um erro mais detalhado?

9

Quando executo hive, ele mostra o seguinte erro

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

O que isso significa? É possível mostrar mais detalhes?

margarida
fonte
com.google.common.sugere que você tenha uma incompatibilidade de versão com o JAR "goiaba" ou "protobuf". Possivelmente, um JAR mais antigo foi o primeiro no CLASSPATH, com uma versão mais antiga em que a classe Preconditionsnão tem método checkArgument(String,Object).
Samson Scharfrichter 1/10/19
Editar> Hive não tem controle sobre isso, é um erro de baixo nível dentro do vinculador dinâmico da JVM - e a JVM não pode fornecer mais "detalhes" do que isso. Ele simplesmente declara que encontrou uma classe com.google.common.base.Preconditionsem um JAR presente em seu CLASSPATH (assumindo que o Hive não use um ClassLoader personalizado que substitui o CLASSPATH), mas essa classe não possui o método exato que possuía no momento da compilação.
Samson Scharfrichter 1/10/19
Tentar entender como o CLASSPATH é auto-gerado para o legado hivefat client - por exemplo, seguir a cadeia de shell scripts chamando scripts shell chamando scripts shell, até encontrar o comando realjava -cp <CLASSPATH> etc etc
Samson Scharfrichter

Respostas:

18

Este erro aparece quando um programa é compilado usando uma versão do Jar e executado em outra versão (normalmente antiga) do mesmo Jar. Nesse cenário, pode haver um conflito na versão do arquivo Jar da goiaba entre o Hadoop e o Hive.

etapa 1 : Vá para HADOOP_INSTALLATION_DIR / share / hadoop / common / lib e verifique a versão guava.jar

etapa 2 : Agora vá para HIVE_INSTALLATION_DIR / lib e compare a versão do hava do hive com o hadoop. Se não forem iguais, exclua a versão mais antiga entre eles e copie a versão mais recente em ambos.

Abortado
fonte
1
O caminho correto para a biblioteca no diretório de instalação do Hadoop é HADOOP_INSTALLATION_DIR / share / hadoop / common / lib
Shubhashish Mishra
1
@ShubhashishMishra Sim, obrigado por me corrigir. Eu vou editá-lo.
Cancelado
3
Estou usando o hadoop 3.2.1 (com guava-27.0-jre.jar listenablefuture-9999.0-vazio-para-evitar-conflito-com-guava.jar) e o hive 3.1.2 (com guava-19.0.jar), I substitua guava-19.0.jar por guava-27.0-jre.jar, mas ainda não está funcionando. Exceção no encadeamento "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: entidade de caractere ilegal: caractere de expansão ( código 0x8 em [linha, col, identificação do sistema]: [3215,96, "arquivo: /usr/src/hive/conf/hive-site.xml"]
Edye Chan 24/10/19
1
@EdyeChan Eu tinha quase as mesmas versões que você - hadoop 3.2.1 (com guava-27.0-jre.jar) - hive 2.3.6 (com guava-14.0.1.jar) Copiei o guava-27.0-jre.jar de HADOOP_INSTALLATION_DIR / share / hadoop / common / lib para HIVE_INSTALLATION_DIR / lib e resolveu o problema.
Scirocco
Alterei o código-fonte da seção hive pom.xml com a versão goiaba que o hadoop está usando e reconstruiu o mesmo. funcionou para mim. <guava.version> 27.0-jre </guava.version>
ASe 22/01
10

Resumindo minha resposta de uma pergunta semelhante sobre Superusuário: https://superuser.com/a/1501841/115371

O núcleo do Hadoop atualizou sua versão do Guava no HADOOP-15960 , lançada no Hadoop 3.0.4, 3.1.3 e 3.2.1.

O Hive 3.1.2 envia sua própria versão incompatível do Guava, não apenas em lib/guava-*.jar, mas também em hive-exec-*.jarum "JAR gordo" que reembala várias bibliotecas externas. Os serviços Hive / CLI não são executados sem hive-exec-*.jar, o que significa que não podemos simplesmente excluir guava-*.jarpara solucionar o problema de compatibilidade.

No momento, as únicas opções são:

  • Crie o Hive a partir da fonte mais recente, que deve incluir o HIVE-22126 para solucionar o hive-exec-*.jarproblema ou
  • Use o Hadoop 3.0.3, 3.2.0 ou 3.1.2, as últimas versões anteriores ao HADOOP-15960. Mas observe que o JAR do Guava enviado nessas versões do Hadoop tem uma vulnerabilidade conhecida : CVE-2018-10237 .
Tim Yates
fonte
Na verdade, o patch do HIVE-22126 está incorreto. Precisa ser corrigido mais.
Eugene Chung