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

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

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

如何开启GC日志?

在作业运维页面,单击目标作业名称后,单击返回开发后,在页面右侧高级配置面板的更多Flink配置中,添加代码后保存生效,代码示例如下。
env.java.opts: >-  -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/flink/log/gc.log  -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=2 -XX:GCLogFileSize=50M
GC日志

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

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

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

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

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

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

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

不支持直接关闭。但是您可以卸载Prometheus监控插件,详情请参见卸载Prometheus监控插件

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

如何设置白名单?

通常,Flink全托管上下游存储设备默认拒绝外部设备的访问。因此,您需要在目标存储设备白名单中添加Flink全托管虚拟交换机的网段。操作步骤详情如下:
  1. 登录实时计算控制台
  2. 在目标工作空间右侧操作列,选择更多 > 工作空间详情
  3. 工作空间详情对话框,查看Flink全托管虚拟交换机的网段信息。网段
  4. 在您的目标存储设备白名单中,添加Flink全托管虚拟交换机的网段
    例如,您要为云数据库RDS MySQL版数据库设置白名单,您可以参见设置IP白名单
    说明
    • 如果您后续新增了虚拟交换机,也需要将新增虚拟交换机的网段添加至目标存储设备的白名单中。
    • 如果您的虚拟交换机和上下游存储不在同一可用区,添加虚拟交换机网段至白名单后,网络可以连通。

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错误,则意味着无法解析域名,请您提交工单进行咨询。