欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Blink和Flink常见问题及诊断

时间:2023-06-22
Blink和Flink常见问题及诊断 基本概念

Hologres性能

写入性能

列存表: InsertOrIgnore > InsertOrReplace > InsertOrUpdate行存表: InsertOrReplcae = InsertOrUpdate > InsertOrIgnore 参数说明InsertOrIgnore结果表有主键,实时写入时如果主键重复,丢弃后到的数据。InsertOrReplace结果表有主键,实时写入时如果主键重复,按照主键更新,如果写入的一行数据不包含所有列,缺失的列的数据补Null。InsertOrUpdate结果表有主键,实时写入时如果主键重复,按照主键更新,如果写入的一行数据不包含所有列,缺失的列不更新。

点查性能

行存 = 行列混存 > 列存。

Blink、Flink(VVP)、开源Flink支持情况

产品形态源表结果表维表Binlog描述Flink全托管支持行存储及列存储。支持行存储及列存储。建议使用行存储。VVP-2.4版本支持。使用VVP开发平台。Blink独享支持行存储及列存储。支持行存储及列存储。建议使用行存储。Hologres V0.8版本只支持行存储,V0.9及以上版本支持行存储及列存储。建议使用行存储。使用Bayes开发平台。Blink独享集群3.5以下的版本与Hologres不兼容,建议您升级至3.7版本使用。开源Flink1.10支持行存储及列存储。支持行存储及列存储。无不支持无开源Flink1.11支持行存储及列存储。支持行存储及列存储。建议使用行存储。不支持从开源Flink1.11版本开始,Hologres代码已开源。开源Flink1.12支持行存储及列存储。支持行存储及列存储。建议使用行存储。不支持从开源Flink1.11版本开始,Hologres代码已开源。

Blink、Flink 映射Hologres的SQL示例如下。

create table holo_source('hg_binlog_lsn' BIGINT HEADER,'hg_binlog_event_type' BIGINT HEADER,'hg_binlog_timestamp_us' BIGINT HEADER,A int,B int,C timestamp )with (type = 'hologres','endpoint' = 'xxx.hologres.aliyuncs.com:80', --Hologres实例的Endpoint。'userName' = '', --当前阿里云账号的AccessKey ID。'password' = '', --当前阿里云账号的AccessKey Secret。'dbName' = 'binlog', --Hologres实例的数据库名称。'tableName' ='test' --Hologres实例的表名称。'binlog' = 'true',);

Blink、VVP、Flink SQL,都是在Flink侧声明一张表,然后根据参数映射至Hologres的一张具体的物理表,所以不支持映射至外部表。

实时写入慢问题排查流程

确认写入相关配置

需要确认以下配置信息。

目标表的存储格式,包括行存表、列存表和行列共存表。Insert模式,包括InsertOrIgnore、InsertOrUpdate和InsertOrReplace。目标表的Table Group及Shard Count。

查看监控指标的实时写入延迟

如果平均写入延迟偏高,在百毫秒甚至秒级别,通常便是后端达到了写入瓶颈,这时候可能会存在如下问题。

使用了列存表的InsertOrUpdate,即局部更新,且流量较高,这种情况下会导致实例的CPU负载和写入延迟偏高。

解决方法:建议更换表的类型,使用行存表,如果您的实例是V1.1及以上版本可以选择行列混存表。

云监控查看实例的CPU负载,如果CPU水位接近100%,但没有列存表的局部更新,那么通常情况下是由于高QPS的查询,或者本身写入量较高导致的。

解决方法:扩容Hologres实例。

确认是否有不断的Insert into select from命令,触发了该表的BulkLoad写入,当前BulkLoad写入会阻塞实时写入。

解决方法:将BulkLoad写入转换成实时写入,或者错峰执行。

确认是否有数据倾斜

使用如下SQL命令查看是否有数据倾斜。

select count(1) from t1 group by hg_shard_id;

解决方法:修改Distribution Key。

确认后端是否有压力

如果以上步骤排查完没有问题,写入性能突然下降,一般情况是后端集群压力比较大,存在瓶颈。请联系技术支持人员确认情况。

查看Blink/Flink侧的反压情况

上述步骤排查完后,发现Hologres侧没有明显的异常,通常情况下是客户端慢了,也就是Blink/Flink侧本身就慢了,这时候确认是否是Sink节点反压了。如果作业只有一个节点,就无法看出是否反压了,这时候可以将Sink节点单独拆开再观察。具体请联系Flink技术支持。

写入数据有问题排查流程

这种情况通常是由于数据乱序引起的,比如相同主键的数据分部在不同的Flink Task上,写入的时候无法保证顺序。需要确认Flink SQL的逻辑,最后写出到Hologres的时候,是否按照Hologres表的主键进行Shuffle了。

维表查询问题排查流程

维表Join和双流Join

对于读Hologres的场景,需要首先确认用户是否使用对了维表Join,是否错将双流Join当成维表Join来使用了。以下是Hologres作为维表的使用示例,如果少了proctime AS PROCTIME()和hologres_dim FOR SYSTEM_TIME AS两处关键字,则会变成双流Join。

CREATE TEMPORARY TABLE datagen_source ( a INT, b BIGINT, c STRING, proctime AS PROCTIME()) with ( 'connector' = 'datagen');CREATE TEMPORARY TABLE hologres_dim ( a INT, b VARCHAR, c VARCHAR) with ( 'connector' = 'hologres', ...);CREATE TEMPORARY TABLE blackhole_sink ( a INT, b STRING) with ( 'connector' = 'blackhole');insert into blackhole_sink select T.a,H.bFROM datagen_source AS T JOIN hologres_dim FOR SYSTEM_TIME AS OF T.proctime AS H ON T.a = H.a;

维表查询

确认维表存储格式

确认维表的存储格式是行存表、列存表还是行列共存。

维表查询延迟高

维表的使用,最常见的问题就是Flink/Blink侧用户反馈Join节点有反压,导致整个作业的吞吐上不去。

确认Flink维表Join的模式

当前Hologres Flink Connector的维表Join功能支持同步和异步模式两种,异步模式性能要优于同步模式,具体需要看Flink SQL进行区分,以下是一个开启异步维表查询功能的SQL示例。

CREATE TABLE hologres_dim( id INT, len INT, content VARCHAR) with ( 'connector'='hologres', 'dbname'='', --Hologres的数据库名称。 'tablename'='', --Hologres用于接收数据的表名称。 'username'='', --当前阿里云账号的AccessKey ID。 'password'='', --当前阿里云账号的AccessKey Secret。 'endpoint'='' --当前Hologres实例VPC网络的Endpoint。 'async' = 'true'--异步模式);

确认后端查询延迟

查看监控指标的实时写入延迟:

确认是否是列存表在做维表,列存表的维表在高QPS场景下开销很高。如果是行存表,且延迟高,通常情况下是实例整体负载较高导致的,需要进行扩容。

确认Join的Key是否是Hologres表的主键

自VVR 4.x (Flink 1.13) 版本开始,Hologres Connector基于Holo Client实现了Hologres表的非主键查询,这种情况通常性能会比较差、实例负载也比较高,尤其是建表没有特别优化过的情况。这时候需要引导优化表结构,最常见的就是将Join的key设置成Distribution Key,这样就能实现Shard Pruning。

查看Blink侧的反压情况

如果上述步骤排查完成,发现Hologres侧没有明显的异常,通常情况下是客户端慢了,也就是Blink侧本身就慢了,这时候可以确认是否是Sink节点反压了。如果作业只有一个节点,就无法看出是否反压了,这时候可以将Sink节点单独拆开再观察。同样可以排查是否是Join节点导致的反压。具体请联系Flink技术支持排查。

常见报错

报错:ERPC TIMEOUT或者ERPC ConNECTION CLOSED

可能原因:写入时压力过大或者集群比较繁忙,导致后端节点挂掉了,OOM(Out Of Memory)或者Coredump。

解决方法:请先重试写入,如果不能恢复请找Hologres技术支持人员排查原因。

报错:BackPresure Exceed Reject Limit。

可能原因:通常是Hologres后端写入压力过大,导致Memtable来不及刷盘导致写入失败。解决方法:如偶发失败可忽略该问题,或者Sink加上参数rpcRetries = ‘100’ 来调大写入重试次数。如果一直报该错误,请联系Hologres技术支持人员确认后端实例状态。

报错:The requested table name xxx mismatches the version of the table xxx from server。

可能原因:通常是用户做了Alter Table导致Blink写入所带表的Schema版本号低于Server端版本号导致的,当前客户端没有对该场景进行重试。解决方法:如偶发报错可忽略该问题。如果一直报该错误,请联系Hologres技术支持人员。

报错:Failed to query table meta for table。

可能原因:一种可能是用户读写了一张Hologres的外部表,Hologres Connector不支持读写外部表。如果不是,可能是Hologres实例 meta出现了问题。解决方法:请联系Hologres技术支持人员。

报错:Cloud authentication failed for access id。

可能原因:该报错通常是用户配置的AccesKey信息不对,或者用户没有添加账号至Hologres实例。解决方法:

请检查当前账户的AccessKey ID和AccessKey Secret填写是否正确,一般是AccessKey Secret错误或者有空格。 检查不出原因可以用当前AccesKey连接HoloWeb(使用账号密码方式登录),在测试联通性时看报错是什么,还是一样的报错说明AccesKey有问题,如果报错为FATAL:role“ALIYUN$xxxx“does not exist说明账号没有实例的权限,需要管理员给该账号授予权限。

Hologres维表Join不到数据。

可能原因:Hologres维表使用了分区表,Hologres维表暂不支持分区表。解决方法:请将分区表转为普通表。

报错:Modify record by primary key is not on this table。

可能原因:实时写入的时候选择了更新模式,但是Hologres的结果表没有主键。解决方法:给Hologres表添加主键。

报错:shard columns count is no match。

可能原因:写入Hologres的时候,没有写入完整的Distribution Key的列(默认是主键)。解决方法:请写入完整的Distribution Key列。

报错:Full row is required, but the column xxx is missing。

可能原因:Hologres老版本的报错信息,通常是用户没有写某列数据,而那一列是不能为空的。解决方法:请为不能为空的列赋值。

VVP用户读写Hologres导致JDBC连接数暴涨。

可能原因:VVP Hologres Connector读写Hologres(除了Binlog),采用JDBC模式,最大占用 并发度 * connectionSize(VVP表的参数,默认为3) 个连接。解决方法:合理规划任务连接数,降低并发度或者connectionSize。如无法调低并发度或connectionSize,可以为表设置参数useRpcMode = ‘true’ 切回至Rpc模式。

Blink/VVP用户读写Hologres报错显示无法连接Hologres。

可能原因:Blink/VVP集群默认访问公网很慢或者无法访问。解决方法:需要保证和Hologres实例在相同Region,且使用VPC的Endpoint。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。