本文汇总了实时计算Flink版服务和作业上线、启动、输出、延时等的常见问题。

购买实时计算Flink版服务时,遇到Inventory check failed报错,应该如何处理?

  • 问题场景
    在购买实时计算Flink版服务时,遇到Inventory check failed报错。Inventory check failed2
  • 问题原因
    • 您不小心删除了阿里云实时计算Flink版在RAM的角色AliyunStreamDefaultRole
    • 您不小心修改了AliyunStreamDefaultRole的授权策略且无法恢复。
  • 解决方案
    请您参见共享模式角色授权恢复AliyunStreamDefaultRole角色。
    注意
    • 删除AliyunStreamDefaultRole角色后,导致实时计算Flink版正在运行的作业瞬间无法读写上下游外部存储,直到后续重新初始化AliyunStreamDefaultRole角色后才可恢复正常。请务必确认这项操作对于线上实时计算Flink版业务是否会造成影响。
    • RAM删除角色和实时计算Flink版重新初始化操作,均需要您的主账号或者经主账号授权的RAM账号来完成。

控制台提示项目参数错误,项目不存在,应该如何处理?

  • 问题描述
    在阿里云实时计算Flink版控制台出现错误提示窗口。1
  • 原因分析

    系统下线了已经到期但是没有续费的项目。

  • 解决方案

    您需要对项目进行续费,详情请参见手动续费

作业无法启动,应该如何处理?

您在完成作业开发上线以后,在运维页面无法启动作业。​原因有以下几点:
  • 作业中存在Failover
    • 排错指引
      查看Failover报错信息,分析Job运行异常原因,通常Failover有以下报错。
      Slot allocation request timed out
    • 解决方案

      这个问题通常是由资源不足引起的,请先检查资源是否充足,不足请先扩容。

  • 资源​不​足
    • 排错指引
      在运行信息中,查看是否有如下的报错提示。
      Submit blink job failed, name: test_copy, errcode:30011, errmsg:code:[30011], brief info:[error occur while run app], context info:[details:[资源不足,请手动停止任务提交,并联系管理员扩容.(yarn resource not available, so here try to kill it to avoid long time waiting)java.lang.Exception: shell cmd execute failed
    • 解决方案

      在已使用CU接近已购买CU的时,如果您的作业所需CU较大,会导致作业无法启动,需要您重新购买资源

  • 获取资源配置失败
    • 排错指引
      在运行信息中,查看是否有如下的报错提示。
      errcode:30011, errmsg:code:[30011], brief info:[error occur while run app], context info:[details:[任务提交失败,请检查详细日志输出.(submit app failed)java.lang.UnsupportedOperationException: Cannot set chaining strategy on Union Transformation.
      报错
    • 解决方案

      重新获取资源配置。BlinkSQL任务开发完成后,需要单击资源配置,通过获取自动生成JSON配置来生成一份默认的配置文件。

  • 无作业指标
    • 问题现象

      作业运维曲线上没有任何指标,作业一直处于Created状态,也没有Failover报错。

    • 原因分析

      JM没运行起来。

    • 解决方案

      先检查资源是否足够,如果资源足够,请您手动指增加CU后,重启作业。

作业上线后,作业的运维页面看不到拓扑图、瞬时值的指标或曲线指标,应该如何处理?

  1. 查看是否有Failover错误信息

    解决方案:如果有Failover错误信息,请参见运行Failover

  2. 运维页面没有拓扑图和瞬时值的数据
    解决方案:请您提交工单进行咨询。工单格式如下:
    • 项目名
    • 作业名称
    • 什么时间提交的作业
    • 公司名称
    • 报错信息截图
  3. 运维页面的曲线指标,全部指标或者是部分指标都没有信息
    解决方案:
    1. 首先确认是否使用了自定义的Source,如果是自定义的Source,Source的输入曲线为空是正常的,因为实时计算Flink版无法监控到自定义的Source。
    2. 如果没有使用自定义的插件,但曲线指标不存在,请您提交工单进行咨询,工单格式如下:
      • 项目名
      • 作业名称
      • 什么时间提交的作业
      • 公司名称
      • 报错信息截图

新作业提交后,项目中现存作业出现异常的原因是什么?

独享模式采用的是CGroup(Control Group)非严格资源隔离模式,在集群资存在空闲时,单个作业(作业A)资源可以超用(即实际使用资源可超过申请资源,运维界面对应显示资源健康分小于等于20分)。如果新提交作业(作业B)申请的资源大于实际剩余资源,将要求超用资源的作业A退还部分资源。现存作业(作业A)的资源减少后可能会出现业务延迟增大等异常。
说明
  • 仅独享模式存在此问题。
  • 新作业提交运行后,项目使用率过高(超过95%以上)可能会出现以上问题。

例如,1个项目的总资源为10CU,已经启动了两个作业,分别申请了2.5CU。由于资源有超用,其中一个作业A实际使用了3CU。总项目上来看,已使用CU(即实际申请CU)=5CU,但实际使用的资源为5.5CU。如果此时再提交运行1个申请5CU的作业,由于总资源为10CU,此时资源超用的作业A需要退还超用的0.5CU。因此,作业A实际使用的资源为2.5CU(与实际申请的一致),相比之前的实际使用的资源3CU有所减少,其处理能力也有所下降,可能会出现业务延迟增大的现象。

为什么作业没有输出?

  • 场景描述

    上线运行作业后,下游结果表中没有数据。

  • 排错流程图作业排错流程图
    1. 检查作业中是否存在Failover
      • 排错指引

        查看Failover报错信息,分析作业运行异常原因。

      • 解决方案

        解决Failover问题,使作业正常运行。

    2. 检查源表数据是否进入实时计算Flink版
      • 排错指引

        这种情况下没有Failover,但数据延时会很大,请查看数据曲线,检查各Source输入是否有数据。

      • 解决方案

        检查源表,保证上游有数据进入实时计算Flink版。

    3. 检查数据是否被某个节点过滤
      • 排错指引
        • 运行信息页面,查看每个节点的IN_Q(输入)OUT_Q(输出)。如果输入有数据,输出为0,说明数据被这个节点过滤了。单击对应节点顶部深蓝色区域后,再单击Metrics,查看数据输入数据输出指标的详细信息。
        • 数据曲线页面,查看数据流入流出情况。
          1. 有数据流入:检查是否使用了数据存储的方式引入。
          2. 没有数据流出:可能是启动位点设置的有误。
      • 解决方案
        请参见Vertex排查数据量问题
        • Join过滤了数据。
        • Window过滤了数据(检查Watermark的字段是否有效)。
        • Where条件过滤了数据。
    4. 检查下游是否由于默认缓存机制缓存了数据
      解决方案:排除JOB的业务逻辑异常后,调整下游存储的batchsize的大小,设置为1
      说明 该参数可能会造成下游数据库I/O压力过大、存在性能瓶颈的风险。
      with(
      
      type ='DATAHUB',
      
      endpoint = 'XXXX',
      
      batchsize = '1'
      
      )
    5. 检查下游RDS,是否存在死锁

      解决方案:请参见写MySQL(TDDL/RDS)时,出现死锁(DeadLock)

另外,您可以使用调试模式(Debug),将计算结果打印到日志中,对日志进行分析,判断无输出结果的原因。详情请参见如何通过调试模式(Debug)查看作业的输出信息?

为什么使用滑动窗口没有数据输出?

  • 问题描述:

    使用滑动窗口没有数据输出。

  • 解决方案
    • 检查源表Watermark的时间字段是不是TIMESTAMP类型,如果不是,请您使用计算列进行转换。
      说明
      1. 请参见概述的时间类型中关于Watermark的说明了解更多。
      2. 请参见数据源表概述数据列章节了解如何进行转换。
    • 检查数据源表的并发是不是都有数据,只要有一个并发没有数据都不会触发Watermark形成窗口输出。如下图所示 。检查数据源表

作业延时增加,应该如何处理?

  • 排查指引
    • 数据间隔时间较大
      数据间隔时间:no_data_delay = 当前系统时间 - 最后一条数据到达实时计算Flink版的时间,即数据源中的数据到达实时计算Flink版的时间间隔。数据间隔时间
      数据间隔延时过大表明上游可能没有数据进入实时计算Flink版系统。实时计算Flink版数据间隔时间等于所有并发中的最大的延迟。您可以参见运维页面数据曲线 > Delay中的Source SubTask 最大延迟 Top 15曲线分析源表各并发的延迟。 曲线分析源表各并发的延迟
    • 作业性能不佳

      SQL语法或者资源配置的不合理可能导致作业性能不佳,从而造成数据处理的滞后和作业延时的增加。

  • 处理方法
    • 检查作业链路,确保上游所有Shard(Queue)都有最新的数据流入实时计算Flink版。
    • 如果在数据间隔时间较小的情况下,仍然存在作业延时增加的现象,则可能是作业性能不佳所导致。处理方法参见高性能Flink SQL优化技巧。SQL优化后,建议您先进行3~5次自动配置调优,如果调优效果不明显,再进行手动配置调优
      说明
      • 第一次进行自动配置调优时,请不要指定CU数。
      • 建议您先优化SQL,再进行资源配置,优化效率会更高。

作业延迟过大,应该如何处理?

线上作业延迟过大,表现为曲线图中业务延迟呈水平趋势,或逐步呈上升趋势,或在追历史数据(启动位点调整到当前时间之前)的过程中,曲线图中业务延迟下降非常缓慢。常见的原因有以下几种:
  • 源数据中存在脏数据
    • 排错指引
      • 在曲线图中,查看各Source的脏数据,脏数据会在相应时间节点上显示数据量,没有则显示为0。
      • 查看FailoverTaskmanager.log日志中的报错信息,脏数据会在错误信息中标明。
    • 解决方案

      更改SQL,过滤脏数据后,重新上线作业。

  • 没有源表数据进入实时计算Flink版
    • 排错指引

      这种情况下没有Failover,请查看数据曲线,检查各Source输入是否有数据。

    • 解决方案

      检查源表,确保上游有数据进入实时计算Flink版。详情请参见数据曲线业务延迟3条曲线。

  • RDS写入瓶颈
    • 排错指引

      在RDS写入过慢时,建议您调大并发或增加资源,观察输出是否仍然为0或RPS极小。

    • 解决方案

      新建一个Schema相同的结果表,重新注册存储引入。

  • 源数据存在问题
    • 排错指引
      请确认是否存在以下情况:
      • 是否存在历史数据。
      • 数据周期性输入为0。
      • 输入数据不稳定,表现为输入曲线有抖动。
    • 解决方案
      • 历史数据处理完成后(例如,追历史数据完成后),延迟会下降。
      • 确认数据生产机制是否异常。
      • 数据输入波动大,检查Source源。
  • 部分节点存在反压

业务延迟显示作业无效,应该如何处理?

业务延迟显示无效的原因包括如下几种,您可以根据不同的原因进行对应的处理:
  • 作业运行失败,无法获取稳定的埋点信息。

    根据Failover报错信息提示修复问题,使作业正常运行。

  • 您没有对自定义源表或Datastream作业进行埋点,或者埋点方式和实时计算Flink版数据存储不兼容。

    请参见Metric文档编写埋点代码,确保和实时计算Flink版数据存储相互兼容。

  • 用户数据的延迟和实时计算Flink版获取埋点数据的延迟重合。

    请您提交工单进行咨询。

  • 多个作业显示无效。

    可能是集群出现问题,请您提交工单进行咨询。

如何对实时计算Flink版3.0以上版本的作业进行反压检测?

反压检测是指当下游处理能力不足时,通知上游停止发送数据,从而避免数据丢失。实时计算Flink版3.0以上版本作业的反压检测步骤如下:
  1. 查看Vertex拓扑中的IN_QOUT_Q的参数值是否到达100%。out_Q
    • IN_Q与OUT_Q值间歇性到达100%:作业不存在反压。
    • IN_Q与OUT_Q值长时间维持在100%:进行下一步检测。
  2. 查看数据曲线 > Queue中的Input Queue UsageOutput Queue Usage是否达到100%。Queue
    • 未达到100%:作业不存在反压。
    • 达到100%:进行下一步检测。
  3. 查看BackPressure的状态是否为high
    1. 运维 > 运行信息 > Vertex拓扑中,单击Task节点边框。单击Task节点边框
    2. 在右侧Task信息区域,查看BackPressure参数。查看BackPressure参数
      • 红色high:该节点存在反压。
      • 绿色ok:该节点不存在反压。

如何通过调试模式(Debug)查看作业的输出信息?

当结果表没有输出时,建议您使用调试模式(Debug),将计算结果打印到日志中,对日志进行分析,判断无输出结果的原因。例如存在脏数据等。根据作业是否包含UDX,日志查看的方法分为以下两种:
  • 无UDX
    1. 将结果表中的WITH参数改为type='print'
      CREATE table result_infor(
      
      id bigint,
      
      phoneNumber bigint,
      
      name VARCHAR
      
      )with(
      
      type='print'
      
      );
    2. 重新上线并且启动作业。
    3. 单击作业名称,进入运行信息页面。
    4. 单击Expand all
    5. 按住CTRL+F,输入print,找到Print节点所在的Vertex。Vertex
    6. 单击目标Vertex顶部深蓝色区域。结果表节点
    7. SubTasks页签,单击LOG0,跳转至Container Log页面。taskmanager.out中查看日志信息1
    8. 单击logList,返回日志列表。taskmanager.out中查看日志信息2
    9. 单击taskmanager.out查看日志结果。taskmanager.out
      日志结果如下图所示。查看日志结果
  • 存在UDX
    如果您使用UDX,在Java代码中又可以分为如下两种Debug方法:
    • system out/err方法
      在Java代码中使用system.outsystem.err方法,把调试的日志打印到taskmanager.outtaskmanager.errsystem方法
    • SLF4J的Logger方法
      在Java代码中使用SLF4J的Logger功能,把调试的日志打印到taskmanager.logSLF4J的Logger方法

如何处理调试过程、窗口或计算过程中的脏数据?

实际操作中您可能会遇到脏数据中断业务开展的情况,本文为您介绍在不同的场景中如何处理脏数据。
  • 调试过程中的脏数据
    • 错误详情

      作业调试过程中出现报错信息:操作错误,所有的数据均被跳过,请检查DDL中的LENGTHCHECK项。

    • 错误原因

      单行字段条数检查策略LENGTHCHECK的默认值为NONE,即解析出的字段数小于定义字段数时,跳过这行数据。如果您的数据源存在脏数据,不符合单行字段条数检查的默认策略,则调试线上抽取数据时会报错,导致无法抽取到线上数据。

    • 解决方案

      建议在源表的WIHT参数中增加lengthcheck='PAD'参数,即当解析出的字段数小于定义字段数时,系统会使用null在行尾填充缺少的字段。

  • 窗口中的脏数据
    • 错误详情
      报错信息:Caused by: java.lang.NullPointerExceptionjava.lang.NullPointerException
    • 报错原因

      WaterMark中存在NULL值导致NullPointerException报错。

    • 解决方案
      如果您使用Window函数,Event time的时间字段中存在NULL值,需要使用计算列进行过滤,示例如下。
      ts as case when `datetime` is null 
                 then to_timestamp('1970-01-01 00:00:00')
                 else `datetime`end
  • 计算过程中的脏数据
    • 错误详情
      • java.lang.NumberFormatException:For input string:"null"计算过程中
      • java.lang.NumberFormatException:For input string:""计算过程中2
    • 报错原因

      输入值是NULL字符串或空字符串,不能作为数字类型进行计算。

    • 解决方案
      确定脏数据后,通过WHERE或者CASE WHEN的方法对脏数据进行过滤。
      说明 实时计算Flink版2.2及以上版本支持在日志中查看脏数据,具体步骤请参见如何从taskmanager.log中查找脏数据等报错信息?
      • 使用WHERE对脏数据进行过滤,示例如下。
        select avg(test_id) from input
        where test_id IS NOT NULL;
      • 使用CASE WHEN对脏数据进行过滤,示例如下。
        select avg(case when test_id IS Null 
                        then 0
                        else test_id 
                   end as test_id)
        from input;

如何利用报错信息快速定位作业问题?

当作业状态运行前的标点显示为红色或者黄色时,表明作业的运行状态不正常。
  • 黄色:作业正在调度。(可能因为资源不足导致作业运行失败。)运行黄色
  • 红色:作业存在错误。 运行红色
通过以下两种方法快速定位作业问题:
  • 查看Attempt为0的Failover历史信息。
    1. Failover > Failover History页面,查看Attempt为0的Failover历史信息。 Failover历史信息
    2. 查看Failover当前页面最后一个Caused by信息。找到最开始的Failover,并将页面拉至最下端,由下至上,找到Cause by信息。 Cause by信息
      说明 第1个Failover中的Cause by信息,往往是导致作业异常的根因,根据该根因的提示信息,可以快速定位作业异常的原因。
  • 无法查看Attempt为0的Failover信息:
    1. 数据曲线页面,通过最近6小时最近1天最近1周维度,查看Failover曲线中第一次Failover的时间点。Failover
    2. taskmanager.log日志中查看报错的原因。报错原因查询方法参见如何从taskmanager.log中查找脏数据等报错信息?

如何从taskmanager.log中查找脏数据等报错信息?

作业运行所产生的信息会记录到taskmanager.log日志文件中,如果您的作业出现运行失败的状态,您可以在taskmanager.log日志文件中查看可能的报错原因,例如脏数据。在taskmanager.log日志文件中查看报错信息的步骤如下:
  1. 单击StatusFAILED的节点或者Source节点。error1
  2. 运行信息 > SubTask List中,单击StatusFAILED的Subtask操作列下的查看日志error2
  3. 单击taskmanager.log日志操作列下的查看日志error3
  4. 按下ctrl+F搜索报错关键字(例如error),并查看报错信息。error
    说明 建议从最近的时间开始查看,最近的有效报错信息通常是导致作业运行失败的根本原因。

Vertex排查数据量问题

  • 现象分析
    数据经过JOIN、WHERE或WINDOW等节点,数据量变少为正常现象,因为数据可能因为条件限制被过滤或JOIN不上。当某个Operator为红色时,代表数据被该节点过滤。vertex
  • 过滤场景
    • Window节点过滤window
      排查方案:
      1. 检查开窗的字段ts是否正常:
        • 如果您的开窗时间是1970年(时间戳为10位)、15XXX年(时间戳为16位)等非13位时间戳的开窗时间,则需要使用计算列转换为13位时间戳后,再进行开窗操作。
        • 如果您不确定您的ts字段是否正常,建议您写一个虚拟的Sink,将ts字段打印到日志中,详情请参见如何通过调试模式(Debug)查看作业的输出信息?
          CREATE TABLE test_output (
              ts              timestamp
          ) WITH (
              type = 'print'
          );
          INSERT into test_output
          SELECT 
               ts
          FROM 源表;
      2. 查看数据曲线中有关WaterMark的三个曲线。详情请参见数据曲线watermark
        2.x以下的版本:查看数据源表的并发是否都有数据,只要一个并发没有数据,就不会触发WaterMark形成窗口输出。below
        说明 假设,窗口设置为1分钟的滚动窗口,数据被窗口过滤。检查下一个窗口是否有数据到来,如果下个窗口没有数据到来,则不会触发上一个窗口的结束,因此窗口没有输出。

      如果排查后,发现没有问题,请您提交工单进行咨询。

    • Where节点过滤where
      排查方案
      1. 将Where条件注释掉后,再将没有Where条件的数据打印到日志中,检查是否有数据满足Where条件。详情请参见如何通过调试模式(Debug)查看作业的输出信息?
      2. 当有符合Where条件的数据时,请检查Where条件的写法。例如,在Where条件中使用了to_timestampdate_format等函数时,您可以将Where条件中使用的函数打印到虚拟Sink中,检查函数使用的方法是否正确。
        CREATE TABLE test_output (
            t1              varchar
        ) WITH (
            type = 'print'
        );
        INSERT into test_output
        SELECT 
           DATE_FORMAT(datetime1, 'yyMMdd')
        FROM 源表;                         

      如果您排查后,发现没有问题,请您提交工单进行咨询。

    • JOIN节点过滤join

      排查方案:检查ON条件,如果您不确定ON条件是否有问题,您可以将左右两个表的数据打印到日志中检查。详情请参见如何通过调试模式(Debug)查看作业的输出信息?

      如果ON条件没有问题,请您提交工单进行咨询。

重新获取配置资源报错,该如何处理?

  • 报错信息1
  • 报错原因

    无法正常获取当前资源配置信息。

  • 解决方案
    1. 在资源配置页面,按住CTRL+E将资源配置信息删除后,应用当前配置并关闭窗口。2
    2. 重新获取配置资源,再应用当前配置并关闭窗口。3

在使用UDX函数时,引用JAR包内的本地文件报错

如果引用的JAR包内的本地文档报错信息为空指针,您可以从以下4个方面进行确认:
  • 本地文件是否存放在resources文件夹下。
  • 是否使用当前加载路径(UdtfTest)。
  • 获得相对路径下资源的方法是否为getResourceAsStream(name:''/config/res.txt'')
  • 是否正确读取文件内的内容。pointer

GROUP BY数据出现热点、数据倾斜

  • 问题描述

    在作业处理的速度很慢时,增加了资源后,作业处理速度并没有明显提升。

  • 问题原因

    数据出现热点、数据倾斜。

  • 解决方案
    • 优化前
      SELECT 
      ID,
      COUNT(distinct NAME)
      FROM  AA
      GROUP BY ID;
    • 优化后
      CREATE VIEW SSS AS
      SELECT
      ID,
      NAME
      FROM  AA
      GROUP BY ID,NAME;
      
      INSERT INTO  SS
      SELECT
      ID,
      COUNT(NAME)
      FROM  SSS
      GROUP BY ID;
      说明 把SQL拆分成两次进行GROUP BY,第一次去重,第二次聚合。

OpenAPI DEMO报错

  • 报错信息demo
  • 报错原因

    您使用了4.3.0以下版本的aliyun-java-sdk-core

  • 解决方案

    请使用4.3.0及以上版本的aliyun-java-sdk-core

云监控控制台页面配置监控告警时,显示无数据,应该如何处理?

  • 问题描述

    实时计算Flink版作业运维页面有数据曲线,且有数据传给云监控消费的日志信息,但在云监控控制台配置监控告警时,显示无数据。

  • 问题原因

    子账号没有授予相关权限。

  • 解决方案
    添加AliyunCloudMonitorFullAccessAliyunCloudMonitorReadOnlyAccess权限。权限
    说明 如果添加AliyunCloudMonitorFullAccessAliyunCloudMonitorReadOnlyAccess权限后,云监控控制台仍然没有数据,请您提交工单,产品名称选择云监控