Hive jar包冲突问题排查解决

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,要保证这个测试程序执行的classpath和hiveserver2的完全一样

还好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-hbase-distributed-runtime-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,可以正常启动了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『Charles数据抓包功攻略』| 如何使用Charles进行数据抓包与分析?

『Charles数据抓包功攻略』| 如何使用Charles进行数据抓包与分析&#xff1f; 1 Charles简介2 Charles主要功能3 Charles下载4 Charles安装5 Charles界面介绍6 不能抓取localhost数据的解决方法7 http抓包8 https抓包8.1 SSL证书导入8.2 SSL Proxying Setting设置 9 APP抓包9.1…

头歌—Hive的安装与配置

第1关&#xff1a;Hive的安装与配置 在修改 conf 下面的hive-site.xml文件这里&#xff0c;题目给的信息是错误的&#xff0c;正确的内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"no"?> <?xml-stylesheet…

三星note3_lineageOS16刷SuperSu开启root权限

前面一篇文章写了note3刷lineageOS16,此处记录一下root过程。 Lineage OS rom在开发者选项中内置了root访问设置&#xff0c;您只需为adb和应用程序启用它&#xff0c;这非常简单。要启用root或root Lineage OS&#xff0c;请遵循以下步骤。 一、如何root 1.手机已刷入TWRP …

Redis高可用之Sentinel哨兵模式

一、背景与简介 Redis关于高可用与分布式有三个与之相关的运维部署模式。分别是主从复制master-slave模式、哨兵Sentinel模式以及集群Cluster模式。 这三者都有各自的优缺点以及所应对的场景、对应的业务使用量与公司体量。 1、主从master-slave模式 【介绍】 这种模式可以采用…

ssm土家风景文化管理平台源码和论文答辩PPT

摘要 土家风景文化管理平台是土家风景文化管理必不可少的一个部分。在风景文化管理的整个过程中&#xff0c;平台担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类土家风景文化管理平台也在不断改进。本课题所设计的土家风景文化管理平台&#xff0c;使用jav…

设计模式(2)

目录 一、工厂模式 1.1 工厂模式的定义 1.2 工厂模式的设计意图 1.3 工厂模式主要解决的问题 1.4 工厂模式的缺点 1.5 实际的应用案例 1. 数据库连接池 2. 图形用户界面&#xff08;GUI&#xff09;组件 3. 文件操作 二、各种工厂模式的变形 1.1 简单工厂模式&#…

FacetWP Relevanssi Integration相关性集成插件

点击阅读FacetWP Relevanssi Integration相关性集成插件原文 FacetWP Relevanssi Integration相关性集成插件是FacetWP与用于高级搜索的 Relevanssi 插件的集成显着增强了您网站的搜索功能。这个强大的工具使您的用户能够轻松找到他们寻求的特定内容&#xff0c;无论他们的查询…

MySQL:找回root密码

一、情景描述 我们在日常学习中&#xff0c;经常会忘记自己的虚拟机中MySQL的root密码。 这个时候&#xff0c;我们要想办法重置root密码&#xff0c;从而&#xff0c;解决root登陆问题。 二、解决办法 1、修改my.cnf配置文件并重启MySQL 通过修改配置文件&#xff0c;来跳…

Course2-Week2-神经网络的训练方法

Course2-Week2-神经网络的训练方法 文章目录 Course2-Week2-神经网络的训练方法1. 神经网络的编译和训练1.1 TensorFlow实现1.2 损失函数和代价函数的数学公式 2. 其他的激活函数2.1 Sigmoid激活函数的替代方案2.2 如何选择激活函数2.3 为什么需要激活函数 3. 多分类问题和Soft…

CSS实现小球边界碰撞回弹

如何通过CSS实现一个物体在屏幕中无限的边界碰撞回弹呢&#xff1f;我们可以使用动画效果实现 代码 我们只做一个小球&#xff0c;通过定位属性叠加动画的方式&#xff0c; 让小球在屏幕中进行运动&#xff0c;通过设置animation的alternate属性来设置回弹。最后&#xff0c;只…

智能优化算法应用:基于人工电场算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工电场算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工电场算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工电场算法4.实验参数设定5.算法结果6.参考…

golang实现函数yamlToStruct(infile,outFile)

问&#xff1a; golang实现函数yamlToStruct(infile,outFile),将yaml文件格式化成golang的结构体 gpt: 要实现一个将YAML文件格式化成Golang结构体的函数&#xff0c;你可以使用 yaml 和 reflect 包来处理。首先&#xff0c;你需要使用 yaml.Unmarshal 函数将YAML文件解析为一…

运维03:LAMP

黄金架构LAMP 什么是LAMP LAMP是公认的最常见&#xff0c;最古老的黄金web技术栈 快速部署LAMP架构 #停止nginx&#xff0c;并且把nginx应用卸载了 systemctl stop nginx yum remove nginx -y#关闭防火墙 iptables -F #清空防火墙规则&#xff0c;比如哪些请求允许进入服…

06 数仓平台MaxWell

Maxwell简介 Maxwell是由Zendesk公司开源&#xff0c;用 Java 编写的MySQL变更数据抓取软件&#xff0c;能实时监控 MySQL数据库的CRUD操作将变更数据以 json 格式发送给 Kafka等平台。 Maxwell输出数据格式 Maxwell 原理 Maxwell工作原理是实时读取MySQL数据库的二进制日志…

angular新版本未生成app.module.ts

https://angular.cn/tutorial/tour-of-heroes https://angular.cn/tutorial/tour-of-heroes/toh-pt0 ng new angular-tour-of-heroes cd angular-tour-of-heroes ng serve --open 查看目录&#xff0c;未生成app.module.ts 网上搜了一下 https://github.com/angular/angul…

【算法】蓝桥杯2013国C 横向打印二叉树 题解

文章目录 题目链接题目描述输入格式输出格式样例自己的样例输入自己的样例输出 思路整体思路存储二叉搜索树中序遍历并存储计算目标数的行号dfs遍历并写入数组初始化和处理输入输出初始化处理输入处理输出 完整的代码如下 结束语更新初始化的修改存储二叉搜索树的修改中序遍历和…

C语言实现梁友栋-Barsky算法

前言&#xff1a; &#xff08;引用梁友栋-Barsky裁剪算法_梁友栋 barsky算法-CSDN博客&#xff09; Cyrus和Beck用参数化方法提出了比Cohen-Sutherland更有效的算法。后来梁友栋和Barsky独立地提出了更快的参数化线段裁剪算法&#xff0c;也称为Liany-Barsky&#xff08;LB&…

oops-framework框架 之 音频管理(六)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 注&#xff1a; 作者dgflash的oops-framework框架QQ群&#xff1a; 628575875 简介 在CocosCreator中&#xff0c;音频的播放主要通过组件: AudioSource 来管理音乐、音效的播放、暂停和停止…

【尚硅谷】第07章:随堂复习与企业真题(面向对象-进阶)

来源&#xff1a;尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备) 基本都是宋老师发的资料里面的内容&#xff0c;只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第07章&#xff1a;随堂复习…

k8s的部署管理以及prometheus相关监控

安装运行prometheus和grafana编辑prometheus配置文件&#xff0c;增加采集prometheus自身数据的采集规则grafana上导入prometheus相关图表的dashboard 前面三步主要根据https://blog.csdn.net/shnu_cdk/article/details/132182858?spm1001.2014.3001.5506 用Go编写一个prome…