1、集群版本

Hadoop 3.1.1.3.1.4.0-315

Hive (version 3.1.0.3.1.4.0-315)

Spark 2.3.2.3.1.4.0-315

Scala version 2.11.12 (Java HotSpot 64-Bit Server VM, Java 1.8.0_144)

guava是guava-28.0-jre.jar

2、Exchange强依赖

指定依赖guava-14版本

3、提交任务报错

命令

spark-submit \
--conf spark.app.name="g1" \
--master "local" \
--class com.vesoft.nebula.exchange.Exchange /data/nebula-spark-utils210/nebula-exchange-2.1.0.jar -c /data/nebula/exchange/configs/imp_test1.conf -h

报错信息

21/08/11 23:18:20 INFO HiveMetaStoreClient: Opened a connection to metastore, current connections: 1
21/08/11 23:18:20 INFO HiveMetaStoreClient: Connected to metastore.
21/08/11 23:18:20 INFO RetryingMetaStoreClient: RetryingMetaStoreClient proxy=class org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient ugi=xxx (auth:SIMPLE) retries=1 delay=5 lifetime=0
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.net.HostAndPort.getHostText()Ljava/lang/String;
at com.vesoft.nebula.exchange.MetaProvider$$anonfun$1.apply(MetaProvider.scala:30)
at com.vesoft.nebula.exchange.MetaProvider$$anonfun$1.apply(MetaProvider.scala:29)
at scala.collection.immutable.List.foreach(List.scala:392)
at com.vesoft.nebula.exchange.MetaProvider.<init>(MetaProvider.scala:29)
at com.vesoft.nebula.exchange.processor.VerticesProcessor.process(VerticesProcessor.scala:109)
at com.vesoft.nebula.exchange.Exchange$$anonfun$main$2.apply(Exchange.scala:152)
at com.vesoft.nebula.exchange.Exchange$$anonfun$main$2.apply(Exchange.scala:129)
at scala.collection.immutable.List.foreach(List.scala:392)
at com.vesoft.nebula.exchange.Exchange$.main(Exchange.scala:129)
at com.vesoft.nebula.exchange.Exchange.main(Exchange.scala)
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.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:904)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
21/08/11 23:18:22 INFO SparkContext: Invoking stop() from shutdown hook

4、原因分析

exchange对guava14强依赖,集群使用的是guava28,guava16以后不再向下兼容,

提交exchange导数任务到spark集群时,依赖包时直接用了集群的28,自己提交运行时包则造成spark依赖14后不能运行,

5、解决方案

如果可以的话,在接口机上安装个版本适配的spark客户端就行了,spark客户端是允许多版本共存的,

A 通过spark-submit参数提交指定运行包

通过

--jars或运行参数提交

spark-submit \
--conf spark.app.name="g1" \
--master "local" \
--files /data/nebula/exchange/configs/i1.conf \
--driver-class-path /data/nebula/tools/guava-14.0.jar \
--driver-library-path /data/nebula/tools/guava-14.0.jar \
--conf spark.executor.extraClassPath=/data/nebula/tools/guava-14.0.jar \
--conf spark.executor.extraLibraryPath=/data/nebula/tools/guava-14.0.jar \
--total-executor-cores 15 \
--class com.vesoft.nebula.exchange.Exchange /data/disk01/nebula/exchange/Exchange/nebula-spark-utilsv2/nebula-exchange-2.0.0.jar -c /data/disk01/nebula/exchange/configs/i1.conf -h

导致集群spark不能执行,

B 重新编译exchange,直接把运行包打包进应用

此处使用maven-shade-plugin改造源代码,重新定义guava14然后打进nebula-java包

注意,exchange直接依赖nebula-java的包,需要先解决nebula-java的依赖问题

① 对guava14重新打包为myguava

1、guava单独打成jar包的pom文件
<?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.data.guava</groupId>
<artifactId>my-guava</artifactId>
<version>1.0</version> <dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.guava</pattern>
<shadedPattern>my.guava</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>my.guava.common</shadedPattern>
</relocation>
</relocations>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" />
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

② 编译安装myguava

mvn install:install-file -Dfile=target/guava-1.0.jar -DgroupId=com.data.guava -DartifactId=my-guava  -Dversion=1.0 -Dpackaging=jar

此时java工程已经可以引用

//maven
// <dependency>
// <groupId>com.data.guava</groupId>
// <artifactId>my-guava</artifactId>
// <version>1.0</version>
// </dependency> import my.guava.common.collect.Lists;

③ 编译安装nebula-java

1、拉取代码nebula-java
git clone -b v2.0.0-ga https://github.com/vesoft-inc/nebula-java.git
2、 在pom.xml中注释掉对guava14的引用,引用新的包
<!--        <dependency>-->
<!-- <groupId>com.google.guava</groupId>-->
<!-- <artifactId>guava</artifactId>-->
<!-- <version>${guava.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.data.guava</groupId>
<artifactId>my-guava</artifactId>
<version>1.0</version>
</dependency>
3、修改程序中所有对import com.google.common.的引用

注释掉原导包语句,

在代码报错处,引入import my.guava.common.collect.Maps;

注意,此处import引入时需要注意import my.guava.common.collect.Maps;这行的位置,需要按照字典序排序,否则编译无法通过style检验

4、编译&安装

此时下载某些包可能需要**上网

mvn clean install -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true

④ 编译安装nebula-exchange

1、拉取最新代码

git clone -b v2.1.0 https://github.com/vesoft-inc/nebula-spark-utils.git

cd nebula-spark-utils/nebula-exchange

2、修改pom.xml引入新的包
<!--        引入guava特殊版本-->        <dependency>            <groupId>com.data.guava</groupId>            <artifactId>my-guava</artifactId>            <version>1.0</version>        </dependency>
3、修改程序中所有对import com.google.common.的引用

注释掉原导包语句,

在代码报错处,引入import my.guava.common.collect.Maps;

注意,

1、此处import引入时需要注意import my.guava.common.collect.Maps;这行的位置,需要按照字典序排序,否则编译无法通过style检验

2、包import com.google.common.geometry.{S2CellId, S2LatLng}不需要替换,虽然引用路径相同但这是独立工程,不依赖guava

4、编译&安装

此时下载某些包可能需要**上网

mvn clean package -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true

⑤ 测试运行

--入库测试数据-groupspark-submit \--conf spark.app.name="g1" \--master "local" \--class com.vesoft.nebula.exchange.Exchange /data/nebula/exchange/Exchange/nebula-spark-utils210new/nebula-exchange-2.1.0.jar -c /data/nebula/exchange/configs/i1.conf -h

可能存在隐患

log4j的版本可能不兼容

参考文献

大数据 Guava冲突问题

https://blog.csdn.net/bigdataf/article/details/108991920

Phoenix/HBase/Hadoop Guava依赖冲突解决办法(guava conflicts in project)

https://www.jianshu.com/p/f73bb7776a3e

HBase/Spark Guava依赖冲突解决方案

https://www.jianshu.com/p/8422ba13f096

解决Hive与Elasticsearch共有库 guava 冲突 NoSuchMethodError

利用maven-shade-plugin解决不兼容依赖冲突

https://www.jianshu.com/p/4e5b0c04fe60

施用 maven shade plugin 解决 jar 或类的多版本冲突

通过maven-shade-plugin 解决Elasticsearch与hbase的jar包冲突问题

https://blog.csdn.net/sunshine920103/article/details/51659936

巧用maven-shade-plugin解决依赖冲突

https://www.jianshu.com/p/ac959f5deac5

使用maven-shade-plugin插件解决Phoenix依赖中的Guava版本冲突问题

https://blog.csdn.net/wwyzxb/article/details/87905952

java 依赖包冲突,使用maven的Shade方式解决

https://www.jianshu.com/p/d9fb7afa634d

Nebula Exchange与集群guava版本不一致问题的更多相关文章

  1. Kubernetes 部署 Nebula 图数据库集群

    Kubernetes 是什么 Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应 ...

  2. MySQL 集群历史版本信息

    MySQL 集群有两种命名方式,在Mysql5.1版本之前,MySQL 集群是以MySQL版本号命名:MySQL5.1(包括)之后开始以 mysql-mysql_server_version-ndb- ...

  3. Mysql Cluster 集群 windows版本

    VM1:192.168.220.102 管理节点(MGM) VM2:192.168.220.103 数据节点(NDBD1),SQL节点(SQL1) VM3:192.168.220.104 数据节点(N ...

  4. Hadoop 新生报道(二) hadoop2.6.0 集群系统版本安装和启动配置

    本次基于Hadoop2.6版本进行分布式配置,Linux系统是基于CentOS6.5 64位的版本.在此设置一个主节点和两个从节点. 准备3台虚拟机,分别为: 主机名 IP地址 master 192. ...

  5. 采用二进制方式安装K8S集群,版本etcd-v3.3.10,flannel-v0.11.0,kubernetes-server-linux-amd64

    官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...

  6. 搭建MySQL集群-注意版本

    系统环境采样(来自其他机器,直接copy过来的,在安装的机器上,按照步骤查看即可,当然这些还不够实际,后续补充) 检查系统内是否有其他mysql rpm -qa | grep mysql 是否存在my ...

  7. redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题

    先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...

  8. ceph集群jewel版本 rbd 块map 报错-故障排查

    测试信息如下: [root@ceph_1 ~]# ceph osd pool lsrbdchy_123swimmingpool #新建rbd 块: rbd create swimmingpool/ba ...

  9. hadoop中集群节点ID不一致( java.io.IOException: Incompatible clusterIDs )

  10. consul集群docker版本脚本

    https://blog.csdn.net/fenglailea/article/details/79098246 docker run -d --name node1 -e 'CONSUL_LOCA ...

随机推荐

  1. xpath、css元素定位

    xpath 1.利用元素唯一属性 //*[@id='xxx'] 2.属性与逻辑结合 解决元素之间多个相同属性重名问题 //*[@id='xxx' and @class='xxx'] 3..//*[te ...

  2. didi-笔试

    import java.util.*; /** * 正整数,没有前导0 * 相邻的数字不能相同 * 可以被3整除 * 输入:?12?0?9?? * 输出:212101902 */ public cla ...

  3. mysql转国产数据库达梦随记

    记录一下转换的一些小坑. window环境 项目是springboot+ activiti6 + vue 第一步转移数据: mysql5.7  ---> 达梦7 这里使用dm的工具进行转换.发现 ...

  4. PADS生成CAM文档(Gerber)

    CAM   一个正常的CAM文档应包括n+8层,n指的是层数,8指的是: 顶层丝印层,Silkscreen TOP 底层丝印层,Silkscreen BOTTOM 顶层组焊层,Solder Mask ...

  5. 路飞项目day01 软件开发流程、PIP永久换源、虚拟环境、路飞项目开始

    一.软件开发流程(重要) ​ 我们作为一个后端,虽然一般情况下只专注自己的那一部分事情,但是有时候小公司,人员架构没那么细化,或者老板就是想省钱少招点人,我们就得大致熟悉软件开发流程,知道上司.其他同 ...

  6. SQL Server 2012主从数据库的订阅和发布,实现数据库读写分离(主从备份)

    学习:https://www.bilibili.com/video/BV13B4y1h7Wu?p=12&spm_id_from=pageDriver&vd_source=3f21d2e ...

  7. ES实战-桶查询

    目的 研究聚合查询的BUCKETS桶·到底是如何计算? PS:es版本为7.8.1 Bucket概念 关于es聚合查询,官方介绍,可以参考 es聚合查询-bucket. 有道翻译: 桶聚合不像指标聚合 ...

  8. Postman中添加多个Cookie

    在接口测试中,很多接口都是需要登录后才能获取到数据的.如何标识登录状态呢?有些app用token,有些app用Cookie.通过Fiddler抓包看到,我涯使用的是Cookie的方式,而且是有多个Co ...

  9. 掌控安全学院SQL注入靶场

    注入的本质:用户输入的字符被带入数据库中并且执行了 靶场地址:http://inject2.lab.aqlab.cn/ 第六关:http://inject2.lab.aqlab.cn/Pass-06/ ...

  10. OpenJ_Bailian - 1088

    OpenJ_Bailian - 1088 题解:DFS记忆化搜索 记忆化搜索也可以说是动态规划,最后的答案也是从一个个子问题推导而来 #include <bits/stdc++.h> #d ...