用application mode部署应用,classloader.resolve-order参数是否必须要改为parent-first?

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

用application mode部署应用,classloader.resolve-order参数是否必须要改为parent-first?

lp
我写了一个 process
function的demo,自定义source产生数据sink到kafka,然后发布到yarn集群运行,flink版本是1.11.2,采用application
Mode 部署,然后发现jobmanager-log报错: Failed to construct kafka producer;Caused by:
org.apache.kafka.common.KafkaException: class
org.apache.kafka.common.serialization.ByteArraySerializer is not an instance
of org.apache.kafka.common.serialization.Serializer。
换了flink版本为1.12.1发现还是报这个错,后尝试采用per-job
Mode部署发现是OK的。查资料发现是跟flink的类加载方式有关,即flink-conf.yml中的classloader.resolve-order参数,要将默认的
child-first改成parent-first,修改后确实ok了,但是有个疑惑,为啥要改这个参数呢,看了官方文档,一般不建议改这个参数的,他避免了使用flink内置的类加载器,而是使用APP自己的。



--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: 用application mode部署应用,classloader.resolve-order参数是否必须要改为parent-first?

tison
你是打包的时候自己打了 kafka 的依赖进去吗?看起来是应用里有一个 kafka 版本 A,接口
org.apache.kafka.common.serialization.Serializer 用应用 classloader 加载,然后
flink kafka connector 用集群 classloader 加载,继承自集群 classloader 里的
org.apache.kafka.common.serialization.Serializer 导致这个问题。

Best,
tison.


lp <[hidden email]> 于2021年1月27日周三 下午12:39写道:

> 我写了一个 process
>
> function的demo,自定义source产生数据sink到kafka,然后发布到yarn集群运行,flink版本是1.11.2,采用application
> Mode 部署,然后发现jobmanager-log报错: Failed to construct kafka producer;Caused by:
> org.apache.kafka.common.KafkaException: class
> org.apache.kafka.common.serialization.ByteArraySerializer is not an
> instance
> of org.apache.kafka.common.serialization.Serializer。
> 换了flink版本为1.12.1发现还是报这个错,后尝试采用per-job
>
> Mode部署发现是OK的。查资料发现是跟flink的类加载方式有关,即flink-conf.yml中的classloader.resolve-order参数,要将默认的
>
> child-first改成parent-first,修改后确实ok了,但是有个疑惑,为啥要改这个参数呢,看了官方文档,一般不建议改这个参数的,他避免了使用flink内置的类加载器,而是使用APP自己的。
>
>
>
> --
> Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: 用application mode部署应用,classloader.resolve-order参数是否必须要改为parent-first?

tison
又或者是反过来。

你可以尝试把 kafka connector 放到 /libs 里,自己应用打包里不带 kafka jar 也不带 kafka connector
jar,应该就可以不改配置。

Best,
tison.


tison <[hidden email]> 于2021年1月27日周三 下午2:47写道:

> 你是打包的时候自己打了 kafka 的依赖进去吗?看起来是应用里有一个 kafka 版本 A,接口
> org.apache.kafka.common.serialization.Serializer 用应用 classloader 加载,然后
> flink kafka connector 用集群 classloader 加载,继承自集群 classloader 里的
> org.apache.kafka.common.serialization.Serializer 导致这个问题。
>
> Best,
> tison.
>
>
> lp <[hidden email]> 于2021年1月27日周三 下午12:39写道:
>
>> 我写了一个 process
>>
>> function的demo,自定义source产生数据sink到kafka,然后发布到yarn集群运行,flink版本是1.11.2,采用application
>> Mode 部署,然后发现jobmanager-log报错: Failed to construct kafka producer;Caused
>> by:
>> org.apache.kafka.common.KafkaException: class
>> org.apache.kafka.common.serialization.ByteArraySerializer is not an
>> instance
>> of org.apache.kafka.common.serialization.Serializer。
>> 换了flink版本为1.12.1发现还是报这个错,后尝试采用per-job
>>
>> Mode部署发现是OK的。查资料发现是跟flink的类加载方式有关,即flink-conf.yml中的classloader.resolve-order参数,要将默认的
>>
>> child-first改成parent-first,修改后确实ok了,但是有个疑惑,为啥要改这个参数呢,看了官方文档,一般不建议改这个参数的,他避免了使用flink内置的类加载器,而是使用APP自己的。
>>
>>
>>
>> --
>> Sent from: http://apache-flink.147419.n8.nabble.com/
>
>
lp
Reply | Threaded
Open this post in threaded view
|

Re: 用application mode部署应用,classloader.resolve-order参数是否必须要改为parent-first?

lp
In reply to this post by tison
谢答。查看我的pom.xml文件,和打包后的压缩包,确实包含kafka(org.apache.kafka.common)的相关依赖;所以我将相关的pom中的依赖都设置为provide,然后重新打包,并确认了我打好的jar包中不包含了任何kafka的依赖,发布运行,这次jobmanager直接报错:Caused
by: java.lang.ClassNotFoundException:
org.apache.flink.streaming.connectors.kafka.KafkaSerializationSchema
---------------------------------------
我怀疑是否是我的集群部署有问题,我是这样做的:
安装了3节点的hadoop(和yarn)集群【master(NameNode、SecondaryNameNode、ResourceManager),slave01(DataNode、NodeManager),slave02(DataNode、NodeManager)】,在master节点上解压缩了flink-1.12.1.tar.gz包,并且在他的lib目录下放置了hadoop的依赖jar包:flink-shaded-hadoop-2-uber-2.8.3-8.0.jar,然后直接上传我的jar包到该节点的/opt下,在flink目录下采用了如下命令发布到yarn集群以applicationMode运行:bin/flink
run-application -t yarn-application
/opt/quickstart-0.1.jar;发现在slave02上分配了jobmanager的container,里面的jobmanager.log报如上错误。
------------------
我之前从spark转过来的,spark on yarn 并不需要在每个节点部署,不是flink on yarn
是否也是这样的,如果不多,请教下应该是怎样的?



--
Sent from: http://apache-flink.147419.n8.nabble.com/