本文为您介绍实时计算Flink版的操作指导方面的常见问题,包括控制台操作、网络连通性和JAB包等问题。

如何在OSS控制台上传JAR包?

  1. 在Flink全托管控制台上查看当前集群的OSS Bucket。OSS Bucket
    OSS Bucket信息如下图所示。Bucket详情
  2. 登录OSS管理控制台,上传JAR包至目标Bucket的/artifats/namespaces目录下。jar目录
  3. 在Flink全托管控制台左侧导航栏,单击资源上传,查看通过OSS控制台上传的JAR包。查看jar包

如何设置Checkpoint和State相关参数?

在目标作业详情页面右上角,单击编辑后,在页面右侧高级配置面板的更多Flink配置中,添加代码后保存生效,代码示例如下。详情Flink全托管在开源Flink的基础上,还可以设置如下表所示参数。
参数 说明 备注
state.backend 流状态存储系统。 取值如下:
  • GeminiStateBackend(默认值):阿里自研的流状态存储系统。
  • RocksDB:开源Flink流状态存储系统。
table.exec.state.ttl SQL作业的State TTL(Time To Live)。
说明 推荐State TTL设置为129600000毫秒(1.5天)。
  • VVR 4.0以下版本,State TTL默认值为空,即代表State不过期。
  • VVR 4.0及以上版本,State TTL默认值为129600000毫秒(1.5天)。
state.backend.gemini.ttl.ms Datestream和Python作业的State TTL(Time To Live)。
state.backend.gemini.savepoint.external-sort.local-storage.enabled Savepoint过程中产生的临时数据是否储存在本地磁盘。 取值如下:
  • false(默认值):临时数据储存在DFS上。
  • true:临时数据储存在本地磁盘,从而减少与DFS的交互,加快Savepoint速度。

    如果您的本地磁盘空间足够存放临时数据,即本地磁盘空间使用率在30%以下,建议设置该参数为true。

说明 仅VVR 4.0及以上版本支持该参数。
开源Flink中的Checkpoint和State更多参数详情,请参见Checkpoints and State Backends

如何查找引发告警的作业?

告警事件中包含JobID和Deployment ID信息,但是由于作业Failover后导致JobID发生变化,因此您需要通过Deployment ID查找是哪个作业报错。目前,Flink全托管控制台上暂无Deployment ID信息,您需要在作业的URL中获取Deployment ID信息。Deployment ID

如何查看工作空间ID等信息?

在管理控制台目标工作空间名称右侧,选择其他 > 工作空间详情工作空间详情

如何查看当前作业的Flink版本?

您可以通过以下方式查看:
  • 在作业开发页面右侧,单击高级配置,选择常规配置 > 引擎版本,即可查看。Flink版本
  • 在作业运维页面,单击目标作业名称,在作业总览页签下,单击当前实例右侧的详情,即可在实例信息中看到版本信息。运维界面

对于系统自动开通的Prometheus监控服务,是否可以直接关闭?

不支持直接关闭。但是您可以卸载Prometheus监控插件,详情请参见卸载Prometheus监控插件。如果卸载还有问题,请提交工单处理。

注意 该监控插件一旦被卸载,VVP将不再显示数据曲线。如果作业出现异常现象,将无法定位初始异常时间,并且无法上报监控告警,请谨慎操作。

Flink全托管集群如何访问公网?

  • 背景说明
    Flink全托管集群默认不具备访问公网的能力,但阿里云提供的NAT网关可以实现VPC网络与公网网络互通,以满足部分Flink全托管集群用户通过UDX或Datastream代码访问公网的需求。背景说明
  • 解决方案
    通过在VPC中创建NAT网关,并创建SNAT条目,将Flink全托管集群所在的交换机绑定至弹性公网IP(EIP),即可通过EIP访问公网。具体配置方法请参见:
    1. 创建NAT网关,详情请参见创建NAT网关
    2. 创建SNAT条目,详情请参见创建SNAT条目
    3. 将Flink全托管集群所在的交换机绑定至弹性公网IP(EIP),详情请参见绑定EIP

如何访问跨VPC里的存储资源?

您可以通过以下几种方式跨VPC访问存储资源:
  • 提交工单,产品名称选择VPC,要求通过高速通道或其它产品建立网络连接,但是此种方式需要付费。
  • 使用VPN网关建立VPC到VPC的VPN连接,详情请参见建立VPC到VPC的连接
  • 退掉和Flink全托管不同VPC的存储服务后,重新购买一个与Flink全托管相同VPC的存储服务。
  • 释放Flink全托管服务后,重新购买一个和存储服务相同VPC的Flink全托管服务。
  • 开通Flink全托管的公网访问能力,通过公网访问存储服务。Flink全托管集群默认不具备访问公网的能力,如有需求,详情请参见Flink全托管集群如何访问公网?
    说明 因为在延迟性方面,公网不如内网,如果您对性能有要求,建议不要使用此方式。

如何解决Flink依赖冲突问题?

  • 问题现象
    • 有明显报错,且引发错误的为Flink或Hadoop相关类。
      java.lang.AbstractMethodError
      java.lang.ClassNotFoundException
      java.lang.IllegalAccessError
      java.lang.IllegalAccessException
      java.lang.InstantiationError
      java.lang.InstantiationException
      java.lang.InvocationTargetException
      java.lang.NoClassDefFoundError
      java.lang.NoSuchFieldError
      java.lang.NoSuchFieldException
      java.lang.NoSuchMethodError
      java.lang.NoSuchMethodException
    • 无明显报错,但会引起一些不符合预期的现象,例如:
      • 日志不输出或log4j配置不生效。
        该类问题通常是由于依赖中携带了log4j相关配置导致的。需要排查作业JAR包中是否引入了log4j配置的依赖,可以通过在dependency中配置exclusions的方式去掉log4j配置。
        说明 如果必须要使用不同版本的log4j,需要使用maven-shade-plugin将log4j相关的class relocation掉。
      • RPC调用异常。

        Flink的Akka RPC调用出现依赖冲突可能导致的异常,默认不会显示在日志中,需要开启Debug日志进行确认。

        例如,Debug日志中出现Cannot allocate the requested resources. Trying to allocate ResourceProfile{xxx},但是JM日志在Registering TaskManager with ResourceID xxx后,没有下文,直到资源请求超时报错NoResourceAvailableException。此外TM持续报错Cannot allocate the requested resources. Trying to allocate ResourceProfile{xxx}

        原因:开启Debug日志后,发现RPC调用报错InvocationTargetException,该报错导致TM Slot分配到一半失败出现状态不一致,RM持续尝试分配Slot失败无法恢复。

  • 问题原因
    • 作业JAR包中包含了不必要的依赖(例如基本配置、Flink、Hadoop和log4j依赖),造成依赖冲突从而引发各种问题。
    • 作业需要的Connector对应的依赖未被打入JAR包中。
  • 排查方法
    • 查看作业pom.xml文件,判断是否存在不必要的依赖。
    • 通过jar tf foo.jar命令查看作业JAR包内容,判断是否存在引发依赖冲突的内容。
    • 通过mvn dependency:tree命令查看作业的依赖关系,判断是否存在冲突的依赖。
  • 解决方案
    • 基本配置建议将scope全部设置为provided,即不打入作业JAR包。
      • DataStream Java
        <dependency>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-streaming-java_2.11</artifactId>
          <version>${flink.version}</version>
          <scope>provided</scope>
        </dependency>
      • DataStream Scala
        <dependency>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-streaming-scala_2.11</artifactId>
          <version>${flink.version}</version>
          <scope>provided</scope>
        </dependency>
      • DataSet Java
        <dependency>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-java</artifactId>
          <version>${flink.version}</version>
          <scope>provided</scope>
        </dependency>
      • DataSet Scala
        <dependency>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-scala_2.11</artifactId>
          <version>${flink.version}</version>
          <scope>provided</scope>
        </dependency>
    • 添加作业需要的Connector对应的依赖,并将scope全部设置为compile(默认的scope是compile),即打入作业JAR包中,以Kafka Connector为例,代码如下。
      <dependency>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-connector-kafka_2.11</artifactId>
          <version>${flink.version}</version>
      </dependency>
    • 其他Flink、Hadoop和log4j依赖不建议添加。但是:
      • 如果作业本身存在基本配置或Connector相关的直接依赖,建议将scope设置为provided,示例如下。
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <scope>provided</scope>
        </dependency>
      • 如果作业存在基本配置或Connector相关的间接依赖,建议通过exclusion将依赖去掉,示例如下。
        <dependency>
            <groupId>foo</groupId>
              <artifactId>bar</artifactId>
              <exclusions>
                <exclusion>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
               </exclusion>
            </exclusions>
        </dependency>

如何解析Flink作业所依赖服务的域名?

如果您自建的Flink作业中所依赖的服务填写的是域名,则迁移上云至Flink全托管服务时,可能会报无法解析域名的问题。此时,您可以按照以下方案解析Flink作业所依赖服务的域名:
  • 您已有自建的DNS,并且Flink VPC能够连通该自建DNS服务,且该自建DNS能够正常解析域名。
    此时,您可以基于Flink全托管作业模板进行域名解析。假如您的自建DNS IP为192.168.0.1,操作步骤如下:
    1. 登录实时计算管理控制台
    2. Flink全托管页签,单击目标工作空间操作列下的控制台
    3. 在左侧导航栏,选择系统管理 > 作业模板
    4. Flink配置文本框,添加如下代码。
      env.java.opts: >-
        -Dsun.net.spi.nameservice.provider.1=default
        -Dsun.net.spi.nameservice.provider.2=dns,sun
        -Dsun.net.spi.nameservice.nameservers=192.168.0.1
      说明 如果您的自建DNS有多个IP,建议IP之间使用英文逗号(,)分隔。
    5. 在Flink全托管控制台新建作业并运行。

      如果还报UnknownHostException的错误,则意味着无法解析域名,请您提交工单进行咨询。

  • 您没有自建的DNS或者Flink VPC无法与自建的DNS连通。
    此时,您需要基于阿里云云解析PrivateZone进行域名解析。假如您的Flink VPC为vpc-flinkxxxxxxx,Flink作业需要访问的服务的域名分别为aaa.test.com 127.0.0.1、bbb.test.com 127.0.0.2和ccc.test.com 127.0.0.3,操作步骤如下:
    1. 开通云解析PrivateZone。详情请参见开通PrivateZone
    2. 添加Zone,以Flink作业需要访问服务的公共后缀作为Zone名称。详情请参见添加Zone
    3. 关联Flink全托管的VPC。详情请参见关联/解关联VPC
    4. 添加解析记录至Zone。详情请参见添加PrivateZone解析记录结果
    5. 在Flink全托管控制台新建作业并运行或者停止后再启动历史作业 。

      如果还报unknowhost错误,则意味着无法解析域名,请您提交工单进行咨询。