You need to enable JavaScript to run this app.
文档中心
流式计算 Flink版

流式计算 Flink版

复制全文
下载 pdf
Paimon 实时数据湖开发
Flink Paimon 常见问题诊断
复制全文
下载 pdf
Flink Paimon 常见问题诊断

1. 磁盘空间不足

常见场景:使用 Flink 做 Paimon 批处理任务(例如 Hive 存量文件转换等),在 Shuffle 使用本地磁盘的时候,单个容器磁盘不足以承担 Shuffle 文件数据量。

日志报错:Caused by: java.io.IOException: No space left on device 。

  • 原因:单个 TM Pod Slot 个数太多,TM 磁盘不足;
  • 解决方案:将单个 TM 的 Pod 的 Slot 调整到 1,并行度推荐 >= Paimon Bucket 个数(大于 Paimoin Bucket 个数主要是为了提高从 TOS 拉取的吞吐);

2. JVM 堆内存不足

常见场景:使用 Flink 做 Paimon 的流式和批式处理过程中,由于数据量过大或者资源不足,会出现内存不够的情形。流入。

日志报错:Caused by: java.lang.OutOfMemoryError: Java heap space 。

  • 原因:单个 TM Pod Slot 个数太多,TM 内存不足;
  • 解决方案:将单个 TM 的 Pod 的 Slot 调整到 1,并行度推荐 >= Paimon Bucket 个数(大于 Paimoin Bucket 个数主要是为了提高从 TOS 拉取的吞吐);

日志报错: GC overhead limit exceeded。

  • 原因:单个 TM Pod Slot 个数太多,TM 内存不足;
  • 解决方案:将单个 TM 的 Pod 的 Slot 调整到 1,并行度推荐 >= Paimon bucket 个数(大于 Paimoin Bucket 个数主要是为了提高从 TOS 拉取的吞吐);

3. Paimon 单分桶内数据量过大,导致仍然 OOM

场景说明:Flink 作业调整并发到 Paimon Bucket 个数且单个 TM Slot 为 1,通过 Flink UI 观察部分任务在运行,但仍然出现 OOM 等问题:

  • 原因:举例发现个别表 9 亿数据, 总共 150GB+, Paimon bucket 个数只有 13 个,单个 bucket 数据量过大;
  • 解决方案:停止写入 Flink 任务,调整分桶(ALTER TABLE xxx SET TBLPROPERTIES ('bucket' = 'xxx'),推荐单桶的数据在 1.5G - 2G 之间最佳;更详细操作方式可以参考官网 Rescale Bucket

4. 外部数据表字段未对齐

日志报错: Caused by: org.apache.calcite.sql.validate.SqlValidatorException: Unknown target column 'order_id'

  • 原因:Flink SQL 字段和外部目标表(如 LAS Catalog 中的数据表部分字段名和 Flink SQL 中不一致)字段未对齐;
  • 解决方案:检查 Flink SQL 中的字段和外部目标表字段是否对齐后修改 Flink SQL。

5. 字段数量不同

日志报错: Cause: Different number of columns.

  • 原因:外部 Source 和 Sink 字段个数不同;
  • 解决方案:检查 Source 表和 Sink 表的字段是否完全对齐。

6. Paimon 分桶数据不均衡

Flink UI 显示不同的 task 处理的数据量差异几倍以上(数据严重不均衡),可能出现 OOM;

  • 原因:Paimon 主键设置不合理导致无法使数据均衡分区;
  • 解决方案:重新仔细检查 Paimon 主键设置是否合理,发现不合理后如果表中无数据则删除源表后使用新主键重建表;如已有数据则重建表,停止源表的数据写入,然后通过 Flink Batch 任务导入新表,最后增量写入作业切换到新表即可;

7. LAS 元数据对接常见问题

7.1 验证 SQL 时报错

如果在验证 SQL 的时候(点击验证按钮,或者上线时候自动检查 SQL)报错如下,形如 Caused by: org.apache.thrift.transport.TTransportException此类错误,说明当前连接 LAS 接口不同。请不要慌张,当前版本暂时无法在验证 SQL 阶段访问 LAS 元数据。

org.apache.flink.table.api.ValidationException: Unable to create catalog 'paimon_test1'.

Catalog options are:
'hive-conf-dir'='/opt/tiger/workdir'
'metastore'='hive'
'type'='paimon'
'uri'='thrift://lakeformation.las.cn-beijing.ivolces.com:48869'
'warehouse'='tos://flink-cwz-paimon/paimon_test1'
        at org.apache.flink.table.factories.FactoryUtil.createCatalog(FactoryUtil.java:511)
        ...
Caused by: java.lang.RuntimeException: Failed to determine if database default exists
        at org.apache.paimon.hive.HiveCatalog.databaseExistsImpl(HiveCatalog.java:223)
        ... 9 more
Caused by: org.apache.thrift.transport.TTransportException
        at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)
        ... 15 more

解决方案:任务上线过程中选择更多设置 - 跳过上线前的深度检查。
Image

7.2 运行时访问 LAS 接口失败

在执行完 6. 上线任务并且启动任务后,如果发现任务失败,并且在日志中报如下类似错误,这个问题说明 LAS 的接口无法访问

Caused by: org.apache.hadoop.hive.metastore.api.MetaException: Could not connect to meta store using any of the URIs provided. Most recent failure: org.apache.thrift.transport.TTransportException

Image
可能原因

  1. 没有上传 hive-site.xml 文件,或者文件名不正确
    1. 解决方法:检查 hive-site.xml 是否成功上传到依赖文件中,并且文件名必须完全符合要求。
  2. 访问 LAS 的 AK/SK 不正确,无法正确认证用户信息。
    1. 解决方法:检查 hive-site.xml 中 AccessKey 和 AccessKeySecret 是否正确。
  3. 访问 LAS 的用户没有 IAM 的 LASFullAccess 权限,请联系管理者开通该权限
    1. 解决方法:联系主账号管理者,检查是否为用户开通 LASFullAccess 权限。

7.3 访问 LAS 报接口无权限

在执行完 6. 上线任务并且启动任务后,如果发现任务失败,并且在日志中报如下类似错误,这个问题说明 LAS 的接口没有成功授权

Caused by: org.apache.hadoop.hive.metastore.api.MetaException: Access denied: [DeniedPrivilege(resource:Resource{resourceScope='SCHEMA', catalogName='paimon_test1', schemaName='test_db'}, action:DESCRIBE)] for user: 31035840

Image
解决方法:这个问题是因为在 LAS Catalog 中没有给指定账号赋予相关权限。请结合报错日志信息提示的 action,参考数据目录管理,为账号开通权限即可。

7.4 任务无法启动,报 LAS 数据库不存在

在执行完 6. 上线任务并且启动任务后,如果发现任务失败,并且运行事件中发现如下报错,org.apache.flink.table.catalog exceptions.DatabaseNotExistException
Image
解决办法:这个原因是因为在 Flink 任务提交阶段,静态解析 SQL 的时候,当前不会去连接 LAS 获取已有的数据库。只要在 SQL 代码中加入以下语句:

CREATE TABLE IF NOT EXISTS test_db;

重新提交任务之后,就可以恢复正常。

7.5 hive-site.xml 格式不正确

在执行完 6. 上线任务并且启动任务后,如果发现任务失败,并且日志中发现如下报错,com.ctc.wstx.exc.WstxParsingException

Caused by: java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs.
 at [row,col {unknown-source}]: [2,5]

Image
解决办法:这个原因是因为对接 LAS 元数据中依赖的 hive-site.xml 的格式可能不正确。需要检查 xml 文件是否符合语法规范。常见 xml 格式问题可以参考:

  1. 文件开头的内容必须是 <?xml ...,在尖括号前方不能包含任何不可见字符、空格、空行等。
  2. xml 文档内必须包含合法的标签,比如在内容中不能出现 <>&等特殊字符,如果出现需要用 CDATA 语法标记为普通文本。

7.6 删除 LAS 的库表应该怎么操作

如果需要删除 LAS 元数据中的库表,需要同时手动删除 LAS 元数据中的库表信息,以及 TOS 目录上的数据库表的文件路径。如果仅仅删除 LAS 元数据或者仅仅删除 TOS 目录的数据都会造成数据不一致。报以下类似的错误,导致任务失败:

  1. 仅删除 TOS 文件路径,但未删除 LAS 元数据

Image

  1. 仅删除 LAS 元数据,但未删除 TOS 文件数据

Image
解决方案:判断属于哪一种情况,将已有的 LAS 元数据和 TOS 文件数据都删除后才能保证数据库表继续正常写入。

7.7 LAS 中数据表是非分区表,TOS 文件系统上却有分区

如果我们使用了分区表,但是发现 LAS 和 TOS 的表信息不同:

  1. LAS 界面展示表为分区表

Image

  1. TOS 界面展示数据表已经产生分区

Image
解决方案:Paimon 不会自动将表的分区信息同步到 LAS 元数据管理。如果需要在 LAS 元数据管理看到数据表的分区字段,需要在建表语句中增加如下 WITH 参数:

'metastore.partitioned-table' = 'true' -- 确定是否将分区信息同步到 LAS 元数据管理

需要注意的是:因为分区字段无法动态增加,增加参数后,需要将原有的数据表清掉(包括 LAS 元数据和 TOS 的数据文件),然后重新创建。

8. 如何使用 TOS 的 HNS 分层桶

问题描述:分层命名空间 HNS(Hierarchical NameSpace,简称分层桶),是对象存储 TOS 推出的一个全新的基于分层元数据管理的桶类型。在提供分层命名空间能力的同时兼顾了对象扁平化扩展性,提供对象语义与文件语义透明互通的能力,实现真正的一份数据多种访问协议,提升数据使用效率。
相比扁平桶,可以很好的支持目录级别的 mv 与 rename 操作,同时优化常见读操作 List 与目录 Head,提升数据处理效率与性能,能很好的满足大数据、数据湖和 AI 领域的使用场景。
而 Paimon + HNS 的配合能真正使用 HNS 的原子语义,在不同 Flink 任务之间同时提交的时候避免需要引入锁机制进行冲突解决。
使用方法:和大部分正常的 Paimon 使用方法一致,需要再在任务配置参数中额外增加自定义参数,即可正常使用

flink.plugins.filesystem.tos.proton.enabled: true

Image
注意:当前功能暂时仅支持 Flink-1.16-volcano 版本。

9.1 JDBC Driver 找不到错误

问题现象:如果任务启动失败,在日志中出现如下异常信息 Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

Image
解决方案:该问题是因为合规性原因,Flink CDC 没有内置 MySQL Driver,请参考 使用 JDBC 或者 MySQL-CDC 数据源 文档,下载 MySQL 官方 Driver (建议 8.0.27 版本),并且上传到 Flink CDC 任务的依赖文件中。

Image

问题现象:在 Flink CDC 任务运行一段时间后,因为各种原因需要丢弃原来状态从全新的初始阶段开始同步。如果此时原来 Paimon 表没有删除,则会出现新数据无法写入的问题。
解决方案:这个是因为 Flink CDC Paimon 的数据下游存在缺陷,commit.user 固定不变,导致在 Paimon 写入的时候快照从 0 版本开始,因为落后当前 Paimon 表的版本,则会导致始终无法发布。有两种解决方案:

  1. 在全新启动的时候,需要删除 TOS 上所有的 Paimon 文件,保证全量同步从头开始。
  2. 在全新启动的时候,需要将 commit.user 变更成新的值,比如 commit.user: v2,可以保证当前新的 commit user 快照可以正常发布。

Image

9.3 MySQL Datetime 和 Paimon Timestamp 类型时间有差异

问题现象:MySQL 的 datetime 是一个无时区信息的数据类型,很多用户会用这个类型存取本地时间。比如 UTC+8 时区的 2025-01-09 10:00:00。因为无法确认时区,所以 Flink & Paimon 会在转型过程中默认使用 UTC 时间戳。所以在写入 Paimon 之后,使用 UTC+8 的时间再去查看这个时间结果为 2025-01-09 18:00:00。导致与 MySQL 中时间出现差异。
解决方案:

  1. 在 MySQL 中避免使用 datetime 类型字段,而采用有时区信息的 timestamp 类型字段。这样 Flink 会结合 server-time-zone 信息,进行时区转换
  2. 如果 MySQL 无法避免使用 datetime 类型,可以在 MySQL datetime 类型字段中用 UTC 时间存储,比如 UTC+8 的 2025-01-09 10:00:00,在数据库中存储为 2025-01-09 02:00:00

9.4 CDC 任务启动失败,提示动态 Bucket 模式不支持

问题现象:Flink CDC 启动失败,报错包含如下关键信息Can't extract bucket from row in dynamic bucket mode如下图所示:
Image
解决方案:当前 Flink CDC 版本暂不支持 Paimon 的动态分桶模式(bucket = -1)。所以需要在 Paimon Sink 中指定如下固定分桶的参数。

# 指定建表的时候指定的分桶数量,建议按照数据量进行合理设置
table.properties.bucket: 10

9.5 changelog-producer 应该如何选择

问题描述:Paimon 支持 changelog-producer 的选项,在 CDC 场景一般推荐使用哪个选项。
解决方案:Paimon 的 changelog-producer 功能支持下游 Flink 任务读取完整的变更日志,可以通过如下参数设置:

table.properties.changelog-producer: input

这个选项可以参考 Changelog 产出机制进行设置,在 CDC 场景下常见的设置有两种:

  1. none:如果下游不需要,则设置成 none,或者不设置即可。
  2. input:如果下游需要 changelog,因为 CDC 上游就是变更日志,所以直接选择 input 即可。
最近更新时间:2025.02.10 10:49:01
这个页面对您有帮助吗?
有用
有用
无用
无用