本文汇总了实时计算Flink版服务和作业上线、启动、输出、延时等的常见问题。
购买实时计算Flink版服务时,遇到Inventory check failed报错,应该如何处理?
- 问题场景
在购买实时计算Flink版服务时,遇到Inventory check failed报错。
- 问题原因
- 您不小心删除了阿里云实时计算Flink版在RAM的角色AliyunStreamDefaultRole。
- 您不小心修改了AliyunStreamDefaultRole的授权策略且无法恢复。
- 解决方案
请您参见共享模式角色授权恢复AliyunStreamDefaultRole角色。注意
- 删除AliyunStreamDefaultRole角色后,导致实时计算Flink版正在运行的作业瞬间无法读写上下游外部存储,直到后续重新初始化AliyunStreamDefaultRole角色后才可恢复正常。请务必确认这项操作对于线上实时计算Flink版业务是否会造成影响。
- RAM删除角色和实时计算Flink版重新初始化操作,均需要您的主账号或者经主账号授权的RAM账号来完成。
控制台提示项目参数错误,项目不存在,应该如何处理?
- 问题描述
在阿里云实时计算Flink版控制台出现错误提示窗口。
- 原因分析
系统下线了已经到期但是没有续费的项目。
- 解决方案
您需要对项目进行续费,详情请参见手动续费。
作业无法启动,应该如何处理?
- 作业中存在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后,重启作业。
- 问题现象
作业上线后,作业的运维页面看不到拓扑图、瞬时值的指标或曲线指标,应该如何处理?
- 查看是否有Failover错误信息
解决方案:如果有Failover错误信息,请参见运行Failover。
- 运维页面没有拓扑图和瞬时值的数据
解决方案:请您提交工单进行咨询。工单格式如下:
- 项目名
- 作业名称
- 什么时间提交的作业
- 公司名称
- 报错信息截图
- 运维页面的曲线指标,全部指标或者是部分指标都没有信息
解决方案:
- 首先确认是否使用了自定义的Source,如果是自定义的Source,Source的输入曲线为空是正常的,因为实时计算Flink版无法监控到自定义的Source。
- 如果没有使用自定义的插件,但曲线指标不存在,请您提交工单进行咨询,工单格式如下:
- 项目名
- 作业名称
- 什么时间提交的作业
- 公司名称
- 报错信息截图
新作业提交后,项目中现存作业出现异常的原因是什么?
- 仅独享模式存在此问题。
- 新作业提交运行后,项目使用率过高(超过95%以上)可能会出现以上问题。
例如,1个项目的总资源为10CU,已经启动了两个作业,分别申请了2.5CU。由于资源有超用,其中一个作业A实际使用了3CU。总项目上来看,已使用CU(即实际申请CU)=5CU
,但实际使用的资源为5.5CU。如果此时再提交运行1个申请5CU的作业,由于总资源为10CU,此时资源超用的作业A需要退还超用的0.5CU。因此,作业A实际使用的资源为2.5CU(与实际申请的一致),相比之前的实际使用的资源3CU有所减少,其处理能力也有所下降,可能会出现业务延迟增大的现象。
为什么作业没有输出?
- 场景描述
上线运行作业后,下游结果表中没有数据。
- 排错流程图
- 检查作业中是否存在Failover
- 排错指引
查看Failover报错信息,分析作业运行异常原因。
- 解决方案
解决Failover问题,使作业正常运行。
- 排错指引
- 检查源表数据是否进入实时计算Flink版
- 排错指引
这种情况下没有Failover,但数据延时会很大,请查看数据曲线,检查各Source输入是否有数据。
- 解决方案
检查源表,保证上游有数据进入实时计算Flink版。
- 排错指引
- 检查数据是否被某个节点过滤
- 排错指引
- 在运行信息页面,查看每个节点的IN_Q(输入)和OUT_Q(输出)。如果输入有数据,输出为0,说明数据被这个节点过滤了。单击对应节点vertex顶部深蓝色区域后,再单击Metrics,查看数据输入和数据输出指标的详细信息。
- 在数据曲线页面,查看数据流入流出情况。
- 有数据流入:检查是否使用了数据存储的方式引入。
- 没有数据流出:可能是启动位点设置的有误。
- 解决方案
请参见Vertex排查数据量问题。
- Join过滤了数据。
- Window过滤了数据(检查Watermark的字段是否有效)。
- Where条件过滤了数据。
- 排错指引
- 检查下游是否由于默认缓存机制缓存了数据
解决方案:排除JOB的业务逻辑异常后,调整下游存储的batchsize的大小,设置为1。说明 该参数可能会造成下游数据库I/O压力过大、存在性能瓶颈的风险。
with( type ='DATAHUB', endpoint = 'XXXX', batchsize = '1' )
- 检查下游RDS,是否存在死锁
解决方案:请参见写MySQL(TDDL/RDS)时,出现死锁(DeadLock)。
- 检查作业中是否存在Failover
另外,您可以使用调试模式(Debug),将计算结果打印到日志中,对日志进行分析,判断无输出结果的原因。详情请参见如何通过调试模式(Debug)查看作业的输出信息?
为什么使用滑动窗口没有数据输出?
作业延时增加,应该如何处理?
- 排查指引
- 数据间隔时间较大
数据间隔时间:
no_data_delay = 当前系统时间 - 最后一条数据到达实时计算Flink版的时间
,即数据源中的数据到达实时计算Flink版的时间间隔。数据间隔延时过大表明上游可能没有数据进入实时计算Flink版系统。实时计算Flink版数据间隔时间等于所有并发中的最大的延迟。您可以参见运维页面Source SubTask 最大延迟 Top 15曲线分析源表各并发的延迟。中的 - 作业性能不佳
SQL语法或者资源配置的不合理可能导致作业性能不佳,从而造成数据处理的滞后和作业延时的增加。
- 数据间隔时间较大
- 处理方法
- 检查作业链路,确保上游所有Shard(Queue)都有最新的数据流入实时计算Flink版。
- 如果在数据间隔时间较小的情况下,仍然存在作业延时增加的现象,则可能是作业性能不佳所导致。处理方法参见高性能Flink SQL优化技巧。SQL优化后,建议您先进行3~5次自动配置调优,如果调优效果不明显,再进行手动配置调优。
说明
- 第一次进行自动配置调优时,请不要指定CU数。
- 建议您先优化SQL,再进行资源配置,优化效率会更高。
作业延迟过大,应该如何处理?
- 源数据中存在脏数据
- 排错指引
- 在曲线图中,查看各Source的脏数据,脏数据会在相应时间节点上显示数据量,没有则显示为0。
- 查看Failover或Taskmanager.log日志中的报错信息,脏数据会在错误信息中标明。
- 解决方案
更改SQL,过滤脏数据后,重新上线作业。
- 排错指引
- 没有源表数据进入实时计算Flink版
- 排错指引
这种情况下没有Failover,请查看数据曲线,检查各Source输入是否有数据。
- 解决方案
检查源表,确保上游有数据进入实时计算Flink版。详情请参见数据曲线业务延迟3条曲线。
- 排错指引
- RDS写入瓶颈
- 排错指引
在RDS写入过慢时,建议您调大并发或增加资源,观察输出是否仍然为0或RPS极小。
- 解决方案
新建一个Schema相同的结果表,重新注册存储引入。
- 排错指引
- 源数据存在问题
- 排错指引
请确认是否存在以下情况:
- 是否存在历史数据。
- 数据周期性输入为0。
- 输入数据不稳定,表现为输入曲线有抖动。
- 解决方案
- 历史数据处理完成后(例如,追历史数据完成后),延迟会下降。
- 确认数据生产机制是否异常。
- 数据输入波动大,检查Source源。
- 排错指引
- 部分节点存在反压
- 排错指引
- 解决方案
- 优化SQL。详情请参见高性能Flink SQL优化技巧。
- 优化上下游WITH参数。详情请参见上下游存储文档的WITH参数介绍。
- 优化作业参数。详情请参见高性能Flink SQL优化技巧。
- 资源调优。AutoScale自动配置调优后,再进行手动调优。
业务延迟显示作业无效,应该如何处理?
如何对实时计算Flink版3.0以上版本的作业进行反压检测?
- 查看Vertex拓扑中的IN_Q与OUT_Q的参数值是否到达100%。
- IN_Q与OUT_Q值间歇性到达100%:作业不存在反压。
- IN_Q与OUT_Q值长时间维持在100%:进行下一步检测。
- 查看Input Queue Usage和Output Queue Usage是否达到100%。
- 未达到100%:作业不存在反压。
- 达到100%:进行下一步检测。
中的 - 查看BackPressure的状态是否为high。
- 在
- 在右侧Task信息区域,查看BackPressure参数。
- 红色high:该节点存在反压。
- 绿色ok:该节点不存在反压。
- 在
如何通过调试模式(Debug)查看作业的输出信息?
- 无UDX
- 将结果表中的WITH参数改为
type='print'
。CREATE table result_infor( id bigint, phoneNumber bigint, name VARCHAR )with( type='print' );
- 重新上线并且启动作业。
- 单击作业名称,进入运行信息页面。
- 单击Expand all。
- 按住CTRL+F,输入print,找到Print节点所在的Vertex。
- 单击目标vertex顶部深蓝色区域。
- 在SubTasks页签,单击LOG0,跳转至Container Log页面。
- 单击logList,返回日志列表。
- 单击taskmanager.out查看日志结果。日志结果如下图所示。
- 将结果表中的WITH参数改为
- 存在UDX
如果您使用UDX,在Java代码中又可以分为如下两种Debug方法:
- system out/err方法
在Java代码中使用
system.out
或system.err
方法,把调试的日志打印到taskmanager.out
或taskmanager.err
。 - SLF4J的Logger方法
在Java代码中使用SLF4J的Logger功能,把调试的日志打印到
taskmanager.log
。
- system out/err方法
如何处理调试过程、窗口或计算过程中的脏数据?
- 调试过程中的脏数据
- 错误详情
作业调试过程中出现报错信息:操作错误,所有的数据均被跳过,请检查DDL中的LENGTHCHECK项。
- 错误原因
单行字段条数检查策略LENGTHCHECK的默认值为NONE,即解析出的字段数小于定义字段数时,跳过这行数据。如果您的数据源存在脏数据,不符合单行字段条数检查的默认策略,则调试线上抽取数据时会报错,导致无法抽取到线上数据。
- 解决方案
建议在源表的WITH参数中增加lengthcheck='PAD'参数,即当解析出的字段数小于定义字段数时,系统会使用null在行尾填充缺少的字段。
- 错误详情
- 窗口中的脏数据
- 错误详情
报错信息:
Caused by: java.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:""
- 报错原因
输入值是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;
- 使用WHERE对脏数据进行过滤,示例如下。
- 错误详情
如何利用报错信息快速定位作业问题?
- 黄色:作业正在调度。(可能因为资源不足导致作业运行失败。)
- 红色:作业存在错误。
- 查看Attempt为0的Failover历史信息。
- 在Attempt为0的Failover历史信息。
- 查看Failover当前页面最后一个Caused by信息。找到最开始的Failover,并将页面拉至最下端,由下至上,找到Cause by信息。 说明 第1个Failover中的Cause by信息,往往是导致作业异常的根因,根据该根因的提示信息,可以快速定位作业异常的原因。
- 在Attempt为0的Failover历史信息。
- 无法查看Attempt为0的Failover信息:
- 在数据曲线页面,通过最近6小时、最近1天或最近1周维度,查看Failover曲线中第一次Failover的时间点。
- 在taskmanager.log日志中查看报错的原因。报错原因查询方法参见如何从taskmanager.log中查找脏数据等报错信息?
- 在数据曲线页面,通过最近6小时、最近1天或最近1周维度,查看Failover曲线中第一次Failover的时间点。
如何从taskmanager.log中查找脏数据等报错信息?
taskmanager.log
日志文件中,如果您的作业出现运行失败的状态,您可以在taskmanager.log
日志文件中查看可能的报错原因,例如脏数据。在taskmanager.log
日志文件中查看报错信息的步骤如下:
- 单击Status为FAILED的节点或者Source节点。
- 在Status为FAILED的Subtask操作列下的查看日志。
- 单击taskmanager.log日志操作列下的查看日志。
- 按下
ctrl+F
搜索报错关键字(例如error),并查看报错信息。说明 建议从最近的时间开始查看,最近的有效报错信息通常是导致作业运行失败的根本原因。
Vertex排查数据量问题
- 现象分析
数据经过JOIN、WHERE或WINDOW等节点,数据量变少为正常现象,因为数据可能因为条件限制被过滤或JOIN不上。当某个Operator为红色时,代表数据被该节点过滤。
- 过滤场景
- Window节点过滤排查方案:
- 检查开窗的字段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 源表;
- 查看数据曲线中有关WaterMark的三个曲线。详情请参见数据曲线。2.x以下的版本:查看数据源表的并发是否都有数据,只要一个并发没有数据,就不会触发WaterMark形成窗口输出。说明 假设,窗口设置为1分钟的滚动窗口,数据被窗口过滤。检查下一个窗口是否有数据到来,如果下个窗口没有数据到来,则不会触发上一个窗口的结束,因此窗口没有输出。
如果排查后,发现没有问题,请您提交工单进行咨询。
- 检查开窗的字段ts是否正常:
- Where节点过滤排查方案
- 将Where条件注释掉后,再将没有Where条件的数据打印到日志中,检查是否有数据满足Where条件。详情请参见如何通过调试模式(Debug)查看作业的输出信息?
- 当有符合Where条件的数据时,请检查Where条件的写法。例如,在Where条件中使用了to_timestamp、date_format等函数时,您可以将Where条件中使用的函数打印到虚拟Sink中,检查函数使用的方法是否正确。
CREATE TABLE test_output ( t1 varchar ) WITH ( type = 'print' ); INSERT into test_output SELECT DATE_FORMAT(datetime1, 'yyMMdd') FROM 源表;
如果您排查后,发现没有问题,请您提交工单进行咨询。
- JOIN节点过滤
排查方案:检查ON条件,如果您不确定ON条件是否有问题,您可以将左右两个表的数据打印到日志中检查。详情请参见如何通过调试模式(Debug)查看作业的输出信息?
如果ON条件没有问题,请您提交工单进行咨询。
- Window节点过滤
重新获取配置资源报错,该如何处理?
- 报错信息
- 报错原因
无法正常获取当前资源配置信息。
- 解决方案
- 在资源配置页面,按住CTRL+E将资源配置信息删除后,应用当前配置并关闭窗口。
- 重新获取配置资源,再应用当前配置并关闭窗口。
- 在资源配置页面,按住CTRL+E将资源配置信息删除后,应用当前配置并关闭窗口。
在使用UDX函数时,引用JAR包内的本地文件报错
- 本地文件是否存放在resources文件夹下。
- 是否使用当前加载路径(UdtfTest)。
- 获得相对路径下资源的方法是否为
getResourceAsStream(name:''/config/res.txt'')
。 - 是否正确读取文件内的内容。
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报错
- 报错信息
- 报错原因
您使用了4.3.0以下版本的
aliyun-java-sdk-core
。 - 解决方案
请使用4.3.0及以上版本的
aliyun-java-sdk-core
。
云监控控制台页面配置监控告警时,显示无数据,应该如何处理?
- 问题描述
实时计算Flink版作业运维页面有数据曲线,且有数据传给云监控消费的日志信息,但在云监控控制台配置监控告警时,显示无数据。
- 问题原因
子账号没有授予相关权限。
- 解决方案
添加AliyunCloudMonitorFullAccess和AliyunCloudMonitorReadOnlyAccess权限。说明 如果添加AliyunCloudMonitorFullAccess和AliyunCloudMonitorReadOnlyAccess权限后,云监控控制台仍然没有数据,请您提交工单,产品名称选择云监控。