flinkx 1.11 中使用远程 jar 遇到的问题与处理
记录 flinkx 1.11 验证使用远程 jar 启动任务过程中遇到的问题和处理。
背景
随着任务不断迁移,datahub api 需要提交的任务也越来越多,带来的问题包括但不限于如下
- 客户端压力大,导致作业提交失败,之前发生过提交子进程内存耗尽
- 大量任务同时上传文件到 HDFS,导致上传变慢,失败后重试,甚至上传失败
之前优化了 jar 重复上传的问题,上周例会上龙哥也做了一件类似的事,将 flink lib 的目录下的 jar 上传到 hdfs,任务使用远程 jar ,这样可以省去本地上传的过程。由于 flinkx 作业几乎不会改动到 flink 的 jar 包,使用远程 jar 可以节省至少一半上传数据量。
接下来记录下验证过程中碰到的一个问题
问题
虽然配置了远程的 jar 但是要把本地的 lib 目录清空了才不会上传。但是清空之后有个问题,任务启动失败报错有个类找不到。挨个尝试,最终发现要在本地 lib 目录中,保留以 Hadoop shaded jar 才行。
之所以会上传是因为 flinkx 在创建 yarndescriptor 时候,将 flink lib 目录中的 jar 添加到 ship files 中了,在执行 start app master 这个方法的时候 会把 ship files 中的文件上传。
后面发现添加配置项 yarn.per-job-cluster.include-user-jar : FIRST
后任务可以执行了,带来的变化是
但是这里有个问题,按类路径里的顺序 往后不是也能从 flinkx-release_1.11.0.jar 这个包里找到需要的类么?第二天过来,按照类加载的顺序,看了这两个 jar :flinkx-hdfs-writer-release_1.11.0.jar
和 flinkx-release_1.11.0.jar
,发现问题了
- 不设置 FIRST ,会从
flinkx-hdfs-writer-release_1.11.0.jar
这个 jar 中加载到类,org.apache.commons.cli.Option
。 这个类是 commons-cli 1.2 版本的,它的实现中没有 builder 这个方法。 - 设置了 FIRST,会从
flinkx-release_1.11.0.jar
这个 jar 中加载 Option 类。这个 jar 中的 commons-cli 是 1.3.1 版本的,是有这个方法的。
之前为什么会 “挨个尝试,最终发现要在本地 lib 目录中,保留 flink-shaded-hadoop-2-uber-2.6.5-10.0.jar 这个 jar” 也是这个原因,这个 jar 里面的 Option 类是对的。本地 lib 中 jar 会出现在 classpath 的前面,如下,所以会加载到正确的类。