更新时间:2024-08-05 GMT+08:00

常见jar包冲突处理方式

问题现象

Spark能对接很多的第三方工具,因此在使用过程中经常会依赖一堆的三方包。而有一些包MRS已经自带,这样就有可能造成代码使用的jar包版本和集群自带的jar包版本不一致,在使用过程中就有可能出现jar包冲突的情况。

常见的jar包冲突报错有:

1、报错类找不到:java.lang.NoClassDefFoundError

2、报错方法找不到:java.lang.NoSuchMethodError

原因分析

以自定义UDF为例:

报错信息显示是找不到类。

  1. 首先需要确认的是这个类属于的jar包是否在jvm的classpath里面, spark自带的jar都在“spark客户端目录/jars/”。
  2. 确认是否存在多个jar包拥有这个类。
  3. 如果是其他依赖包,可能是没有使用--jars添加到任务里面。
  4. 如果是已经添加到任务里面,但是依旧没有取到,可能是因为配置文件的driver或者executor的classpath配置不正确,可以查看日志确认是否加载到环境。
  5. 另外可能报错是类初始化失败导致后面使用这个类的时候出现上述报错,需要确认是否在之前就有初始化失败或者其他报错的情况发生。

报错信息显示找不到方法。

  1. 确认这个方法对应的类所在的jar包是否加载到jvm的classpath里面,spark自带的类都在“spark客户端目录/jars/”。
  2. 确认是否有多个jar包包含这个类(尤其注意相同工具的不同版本)。
  3. 如果报错是Hadoop相关的包,有可能是因为使用的Hadoop版本不一致导致部分方法已经更改。
  4. 如果报错的是三方包里面的类,可能是因为Spark已经自带了相关的jar包,但是和代码中使用的版本不一致。

操作步骤

方案一:

针对jar包冲突的问题,可以确认是否不需使用三方工具的包,如果可以更改为集群相同版本的包,则修改引入的依赖版本。

建议用户尽量使用MRS集群自带的依赖包。

方案二:

jar包版本修改演示

以MRS_2.1版本为例:

  1. 在pom.xml文件中添加“<properties>”参数,填写变量,方便后面统一修改版本。

  2. 在“dependencies”参数中设置各个jar包的版本的时候可以直接使用上述定义的参数传递。

    如果遇到其他三方包冲突,可以通过查找依赖关系确认是否存在相同包不同版本的情况,尽量修改成集群自带的jar包版本。

    可以参考MRS样例工程自带的pom.xml文件:获取MRS应用开发样例工程

  3. 打印依赖树方式:

    在pom.xml文件同目录下执行命令:mvn dependency:tree