1、报错情况

hiveserver2启动失败查看日志报错

2022-07-04T20:14:53,315 WARN  [main]: server.HiveServer2 (HiveServer2.java:startHiveServer2(1100)) - Error starting HiveServer2 on attempt 1, will retry in 60000ms
java.lang.NoSuchMethodError: org.apache.curator.shaded.com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lorg/apache/curator/shaded/com/google/common/util/concurrent/ListeningExecutorService;
    at org.apache.curator.framework.listen.ListenerContainer.addListener(ListenerContainer.java:41) ~[curator-framework-2.12.0.jar:?]
    at org.apache.curator.framework.imps.CuratorFrameworkImpl.start(CuratorFrameworkImpl.java:257) ~[curator-framework-2.12.0.jar:?]
    at org.apache.hive.service.server.HiveServer2.startZookeeperClient(HiveServer2.java:484) ~[hive-service-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
    at org.apache.hive.service.server.HiveServer2.addServerInstanceToZooKeeper(HiveServer2.java:508) ~[hive-service-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
    at org.apache.hive.service.server.HiveServer2.start(HiveServer2.java:720) ~[hive-service-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
    at org.apache.hive.service.server.HiveServer2.startHiveServer2(HiveServer2.java:1073) [hive-service-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
    at org.apache.hive.service.server.HiveServer2.access$1700(HiveServer2.java:135) [hive-service-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
    at org.apache.hive.service.server.HiveServer2$StartOptionExecutor.execute(HiveServer2.java:1341) [hive-service-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
    at org.apache.hive.service.server.HiveServer2.main(HiveServer2.java:1185) [hive-service-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_181]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_181]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_181]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_181]
    at org.apache.hadoop.util.RunJar.run(RunJar.java:318) [hadoop-common-3.1.1.3.0.1.0-187.jar:?]
    at org.apache.hadoop.util.RunJar.main(RunJar.java:232) [hadoop-common-3.1.1.3.0.1.0-187.jar:?]

2、问题分析

一般NoSuchMethodError错误都是jar包版本冲突导致

正常来说,org.apache.curator.shaded.com.google.common.util.concurrent.MoreExecutors这个应该curator-client-2.12.0.jar中

推测可能存在其他版本curator-client.jar,且MoreExecutors类中没有sameThreadExecutor方法

3、问题排查

hive的启动日志中会打印classpath

这里截图只能截取到一部分,实际classpath内容非常多,路径分散于多个目录中,难于查看

针对classpath进行搜索,并没有发现其他版本curator-client.jar

直接使用find命令服务器搜寻,倒是发现多个不同版本的jar包,逐个下载本地反编译查看,没有发现有问题的jar

花费了大量时间人肉搜索却得不到答案,一度开始怀疑自己

按照经验来说,肯定是加载不同版本的jar包,但是却怎么也找不到

陷入困境的时候突然想到,既然class是由JVM加载的,那JVM自己肯定知道这个class在哪个jar包中,最好就是让JVM来告诉我们答案,印象中JDK有提供的相应的API的

网上搜了下很快就得到答案https://www.cnblogs.com/kingzzm/p/3325370.html

自己新建一个maven工程验证一下

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.tianzy.test</groupId>
    <artifactId>hive_test</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>false</addClasspath>
<!--                            <classpathPrefix>lib/</classpathPrefix>-->
                            <mainClass>com.tianzy.test.Test</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
 
</project>

Test.java:


package com.tianzy.test;
 
public class Test {
    public static void main(String[] args) {
            String filePath = org.apache.curator.shaded.com.google.common.util.concurrent.MoreExecutors.class.getProtectionDomain().getCodeSource().getLocation().getFile();
            System.out.println(filePath);
    }
}

本地运行Test.java,输出:/D:/data/soft/apache-maven-3.6.1/repository/org/apache/curator/curator-client/2.12.0/curator-client-2.12.0.jar

符合预期

通过mvn package命令打包成hive_test-1.0-SNAPSHOT.jar,上传服务器上,放到/tmp/test/目录下

然后还要设置classpath,要保证这个测试程序执行classpathhiveserver2的完全一样

还好hiveserver2的启动日志中有打印classpath直接copy出来即可

由于这里的classpath非常长,手动选择copy不可行的,不过可以通过vim命令操作

        先vim /var/log/hive/hiveserver2.log /tmp/test/classpath.txt

        然后定位到classpath一行日志后,按yy复制

        然后:n跳转到下一个文件,按p进行粘贴

        再去掉前面那些无用字符,只保留等号后面的部分

这样/tmp/test/classpath.txt文件里面就有和hiveserver2完全相同的classpath了

(后面发现其实用jinfo pid | grep java.class.path 可以更方便拿到)

执行命令

cd /tmp/test
CLASSPATH=`cat classpath.txt`
export CLASSPATH=$CLASSPATH:/tmp/test/hive_hook_test-1.0-SNAPSHOT.jar
java com.tianzy.test.Test

输出:/data/hdp/3.0.1.0-187/hbase/lib/geomesa-hbasedistributedruntime-hbase2_2.11-3.4.0.jar
 

下载下来反编译查看

可以看到这个jar包里面确实是有org.apache.curator.shaded.com.google.common.util.concurrent.MoreExecutors这个类,但是类里面没有sameThreadExecutor方法

比较过分的是,这是一个fat jar,把它所依赖的一些jar包全打在了这个jar包里面

一般来说fat jar是用来作为独立jar包运行,而不应该作为依赖包被引入

这个jar包是开发之前做测试时候弄的,现在已经不用了

直接删掉这个jar包,然后启动hiveserver2,可以正常启动

原文地址:https://blog.csdn.net/li281037846/article/details/134726876

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_44216.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注