组件版本 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 |
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 > > |
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 >> >> |
感谢回答
后来我查了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 >> >> |
也是一种 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 > >> > >> > > |
Free forum by Nabble | Edit this page |