记一次Flink自带jar包与第三方jar包依赖冲突解决

flink版本1.14.5
hadoop 2.6.0
为了实现flink读取hive数据写入第三方的数据库,写入数据库需要调用数据库的SDK,当前SDK依赖的protobuf-java-3.11.0.jar,guava-29.0-android.jar 与flink中lib下的部分jar包冲突,flink与hadoop、hive编译的jar中使用的guava,protobuf都要低于第三方sdk,因此会遇到下列问题:

Caused by: java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessageV3
Caused by: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava/lang/Object;)V

遇到这个问题时首先要定位到具体jar包,可通过下面这个脚本来找到具体哪个jar包冲突

#!/bin/sh

find_dir=$1
find_key=$2

jars=`find $find_dir -name '*.jar'`
for jar in $jars
do
    ret=`jar tvf $jar | grep $find_key`
    if [ "$?" = "0" ]; then
        echo -e "\e[1;34m${jar}\e[0m: \n\e[2;34m${ret}\e[0m"
    fi
done

wars=`find $find_dir -name '*.war'`
for war in $wars
do
    ret=`jar tvf $war | grep $find_key`
    if [ "$?" = "0" ]; then
        echo -e "\e[1;34m${war}\e[0m: \n\e[2;34m${ret}\e[0m"
    fi
done

flink lib下jar包的加载是按照默认查看顺序(ls -l 查看的结果)加载的,自带的jar包这些类涉及的jar包里面依赖的jar版本很低,但是sdk所依赖的只能是高版本的,所以只需要让高版本的jar包先加载,后面低版本的就不会再加载了,flink中的类会直接引用高版本的jar包,所以只需要将原先的jar包重命名,使其排序靠前(在包含低版本的jar包之前)
比如这样:
记一次Flink自带jar包与第三方jar包依赖冲突解决_第1张图片

例如这样,将guava-29.0-android.jar与protobuf-java-3.11.0.jar排在flink的包之前,具体哪些包有冲突的类可以用我提供的脚本查看。

你可能感兴趣的:(flink,flink,jar,hadoop)