CliFrontend 未优先加载用户jar包中的class

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

CliFrontend 未优先加载用户jar包中的class

aven.wu
组件版本 Hadoop 2.7.3,flink 1.9.1 ,elasticsearch6.5。
该问题的起源是因为程序我的用户程序用Jackson,并依赖了Elasticsearch rest client ,在Yarn集群上提交任务的时候出现了如下异常:
java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
        at org.elasticsearch.common.xcontent.json.JsonXContent.<clinit>(JsonXContent.java:57)
后上网查询后推论有可能是jackson版本问题,于是打印了类加载路径:
--------------------------main class jackson class load before run------------------------------
file:/usr/**/hadoop/lib/jackson-databind-2.2.3.jar
果然是从hadoop的classpath下加载了2.2.3版本

之后查看flink run命令入口程序
CliFrontend#bulidProgram line 799
PackagedProgram#PackagedProgram line 221
JobWithJars#BuildUserCodeClassLoad line 142
return FlinkUserCodeClassLoaders.parentFirst(urls, parent);
默认使用parentFirst,根据官方文档里面描述的反向类加载,应该是首先从classpath下加载Class,而不是从user jar包中加载类。
请问如何修改此处的类加载顺序,优先从user jar 中加载class

Best
Aven

Reply | Threaded
Open this post in threaded view
|

Re: CliFrontend 未优先加载用户jar包中的class

tison
1.9.2 和 1.10 上已经修复此问题,修改可参考

https://issues.apache.org/jira/browse/FLINK-13749

Best,
tison.


aven.wu <[hidden email]> 于2020年3月3日周二 下午2:04写道:

> 组件版本 Hadoop 2.7.3,flink 1.9.1 ,elasticsearch6.5。
> 该问题的起源是因为程序我的用户程序用Jackson,并依赖了Elasticsearch rest client
> ,在Yarn集群上提交任务的时候出现了如下异常:
> java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
>         at
> org.elasticsearch.common.xcontent.json.JsonXContent.<clinit>(JsonXContent.java:57)
> 后上网查询后推论有可能是jackson版本问题,于是打印了类加载路径:
> --------------------------main class jackson class load before
> run------------------------------
> file:/usr/**/hadoop/lib/jackson-databind-2.2.3.jar
> 果然是从hadoop的classpath下加载了2.2.3版本
>
> 之后查看flink run命令入口程序
> CliFrontend#bulidProgram line 799
> PackagedProgram#PackagedProgram line 221
> JobWithJars#BuildUserCodeClassLoad line 142
> return FlinkUserCodeClassLoaders.parentFirst(urls, parent);
> 默认使用parentFirst,根据官方文档里面描述的反向类加载,应该是首先从classpath下加载Class,而不是从user jar包中加载类。
> 请问如何修改此处的类加载顺序,优先从user jar 中加载class
>
> Best
> Aven
>
>
Reply | Threaded
Open this post in threaded view
|

Re: CliFrontend 未优先加载用户jar包中的class

tison
https://github.com/apache/flink/commit/0f30c263eebd2fc3ecbeae69a4ce9477e1d5d774

Best,
tison.


tison <[hidden email]> 于2020年3月3日周二 下午2:13写道:

> 1.9.2 和 1.10 上已经修复此问题,修改可参考
>
> https://issues.apache.org/jira/browse/FLINK-13749
>
> Best,
> tison.
>
>
> aven.wu <[hidden email]> 于2020年3月3日周二 下午2:04写道:
>
>> 组件版本 Hadoop 2.7.3,flink 1.9.1 ,elasticsearch6.5。
>> 该问题的起源是因为程序我的用户程序用Jackson,并依赖了Elasticsearch rest client
>> ,在Yarn集群上提交任务的时候出现了如下异常:
>> java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
>>         at
>> org.elasticsearch.common.xcontent.json.JsonXContent.<clinit>(JsonXContent.java:57)
>> 后上网查询后推论有可能是jackson版本问题,于是打印了类加载路径:
>> --------------------------main class jackson class load before
>> run------------------------------
>> file:/usr/**/hadoop/lib/jackson-databind-2.2.3.jar
>> 果然是从hadoop的classpath下加载了2.2.3版本
>>
>> 之后查看flink run命令入口程序
>> CliFrontend#bulidProgram line 799
>> PackagedProgram#PackagedProgram line 221
>> JobWithJars#BuildUserCodeClassLoad line 142
>> return FlinkUserCodeClassLoaders.parentFirst(urls, parent);
>> 默认使用parentFirst,根据官方文档里面描述的反向类加载,应该是首先从classpath下加载Class,而不是从user
>> jar包中加载类。
>> 请问如何修改此处的类加载顺序,优先从user jar 中加载class
>>
>> Best
>> Aven
>>
>>
Reply | Threaded
Open this post in threaded view
|

回复: CliFrontend 未优先加载用户jar包中的class

aven.wu
感谢回答
后来我查了Flink run脚本的classpath设置,我修改了脚本将我的jar包指定在flink classpath的最前面得以解决问题

Best
Aven

发件人: tison
发送时间: 2020年3月3日 14:16
收件人: user-zh
主题: Re: CliFrontend 未优先加载用户jar包中的class

https://github.com/apache/flink/commit/0f30c263eebd2fc3ecbeae69a4ce9477e1d5d774

Best,
tison.


tison <[hidden email]> 于2020年3月3日周二 下午2:13写道:

> 1.9.2 和 1.10 上已经修复此问题,修改可参考
>
> https://issues.apache.org/jira/browse/FLINK-13749
>
> Best,
> tison.
>
>
> aven.wu <[hidden email]> 于2020年3月3日周二 下午2:04写道:
>
>> 组件版本 Hadoop 2.7.3,flink 1.9.1 ,elasticsearch6.5。
>> 该问题的起源是因为程序我的用户程序用Jackson,并依赖了Elasticsearch rest client
>> ,在Yarn集群上提交任务的时候出现了如下异常:
>> java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
>>         at
>> org.elasticsearch.common.xcontent.json.JsonXContent.<clinit>(JsonXContent.java:57)
>> 后上网查询后推论有可能是jackson版本问题,于是打印了类加载路径:
>> --------------------------main class jackson class load before
>> run------------------------------
>> file:/usr/**/hadoop/lib/jackson-databind-2.2.3.jar
>> 果然是从hadoop的classpath下加载了2.2.3版本
>>
>> 之后查看flink run命令入口程序
>> CliFrontend#bulidProgram line 799
>> PackagedProgram#PackagedProgram line 221
>> JobWithJars#BuildUserCodeClassLoad line 142
>> return FlinkUserCodeClassLoaders.parentFirst(urls, parent);
>> 默认使用parentFirst,根据官方文档里面描述的反向类加载,应该是首先从classpath下加载Class,而不是从user
>> jar包中加载类。
>> 请问如何修改此处的类加载顺序,优先从user jar 中加载class
>>
>> Best
>> Aven
>>
>>

Reply | Threaded
Open this post in threaded view
|

Re: CliFrontend 未优先加载用户jar包中的class

tison
也是一种 hack 的方法,不过社区肯定不能在 master 上这么搞就是了(x

Best,
tison.


aven.wu <[hidden email]> 于2020年3月3日周二 下午4:44写道:

> 感谢回答
> 后来我查了Flink run脚本的classpath设置,我修改了脚本将我的jar包指定在flink classpath的最前面得以解决问题
>
> Best
> Aven
>
> 发件人: tison
> 发送时间: 2020年3月3日 14:16
> 收件人: user-zh
> 主题: Re: CliFrontend 未优先加载用户jar包中的class
>
>
> https://github.com/apache/flink/commit/0f30c263eebd2fc3ecbeae69a4ce9477e1d5d774
>
> Best,
> tison.
>
>
> tison <[hidden email]> 于2020年3月3日周二 下午2:13写道:
>
> > 1.9.2 和 1.10 上已经修复此问题,修改可参考
> >
> > https://issues.apache.org/jira/browse/FLINK-13749
> >
> > Best,
> > tison.
> >
> >
> > aven.wu <[hidden email]> 于2020年3月3日周二 下午2:04写道:
> >
> >> 组件版本 Hadoop 2.7.3,flink 1.9.1 ,elasticsearch6.5。
> >> 该问题的起源是因为程序我的用户程序用Jackson,并依赖了Elasticsearch rest client
> >> ,在Yarn集群上提交任务的时候出现了如下异常:
> >> java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
> >>         at
> >>
> org.elasticsearch.common.xcontent.json.JsonXContent.<clinit>(JsonXContent.java:57)
> >> 后上网查询后推论有可能是jackson版本问题,于是打印了类加载路径:
> >> --------------------------main class jackson class load before
> >> run------------------------------
> >> file:/usr/**/hadoop/lib/jackson-databind-2.2.3.jar
> >> 果然是从hadoop的classpath下加载了2.2.3版本
> >>
> >> 之后查看flink run命令入口程序
> >> CliFrontend#bulidProgram line 799
> >> PackagedProgram#PackagedProgram line 221
> >> JobWithJars#BuildUserCodeClassLoad line 142
> >> return FlinkUserCodeClassLoaders.parentFirst(urls, parent);
> >> 默认使用parentFirst,根据官方文档里面描述的反向类加载,应该是首先从classpath下加载Class,而不是从user
> >> jar包中加载类。
> >> 请问如何修改此处的类加载顺序,优先从user jar 中加载class
> >>
> >> Best
> >> Aven
> >>
> >>
>
>