Flink OSS FsStatebackend NoClassDefFoundError

335 阅读1分钟

jdk版本为11,使用 OSS 作为持久化状态后端,多个作业使用同一个 bucket,有时候其中几个作业(不同的 Flink 版本)会同时抛出以下异常:

java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
        at org.apache.flink.fs.osshadoop.shaded.com.aliyun.oss.internal.OSSErrorResponseHandler.handle(OSSErrorResponseHandler.java:69) ~[?:?]

这是因为首先 OSS 抛出了一个异常,但是由于 Response 格式为 xml,jdk 11 中去掉了解析 xml 相关的库,导致解析失败,job 挂掉。解决这个问题的方式是加上相关库,参考:

  1. github.com/aliyun/aliy…
  2. help.aliyun.com/document_de…

pom.xml中加上依赖可以解决 taskmanager 上的问题,为了解决 jobmanager 上的问题,从 Flink 仓库拉下对应版本的代码,修改 flink-filesystems → flink-oss-fs-hadoop 下的 pom.xml(jaxb-api 对应的<scope>provided</scope>需要删掉),加入依赖重新打包 flink-oss-fs-hadoop-1.16.0.jar(flink-oss-fs-hadoop下执行 mvn clean install -DskipTests)。解析得到报错内容如下:

[ErrorCode]: InvalidResponse
[RequestId]: some-request-id
[HostId]: null
[ResponseError]:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>QpsLimitExceeded</Code>
  <Message>Please reduce your request rate.</Message>
  <RequestId>some-request-id</RequestId>
  <HostId>aliyun.com/HostId>
</Error>

OSS 单个 bucket QPS 限制为 10k :help.aliyun.com/document_de… , 超过限制首先是因为有些] job ck 频率比较高,其次是因为使用文件系统有很多的 HEAD 请求检查文件是否存在:stackoverflow.com/questions/7…

解决方式:调大 ck interval,调为一分钟后 qps 明显降低。没有调更大是因为很多作业 sink kafka,client 缓存 buffer,ck 的时候 flush,避免占用更多内存。