常见场景:使用 Flink 做 Paimon 批处理任务(例如 Hive 存量文件转换等),在 Shuffle 使用本地磁盘的时候,单个容器磁盘不足以承担 Shuffle 文件数据量。
日志报错:Caused by: java.io.IOException: No space left on device 。
常见场景:使用 Flink 做 Paimon 的流式和批式处理过程中,由于数据量过大或者资源不足,会出现内存不够的情形。流入。
日志报错:Caused by: java.lang.OutOfMemoryError: Java heap space 。
日志报错: GC overhead limit exceeded。
场景说明:Flink 作业调整并发到 Paimon Bucket 个数且单个 TM Slot 为 1,通过 Flink UI 观察部分任务在运行,但仍然出现 OOM 等问题:
日志报错: Caused by: org.apache.calcite.sql.validate.SqlValidatorException: Unknown target column 'order_id'
日志报错: Cause: Different number of columns.
Flink UI 显示不同的 task 处理的数据量差异几倍以上(数据严重不均衡),可能出现 OOM;
如果在验证 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
解决方案:任务上线过程中选择更多设置 - 跳过上线前的深度检查。
在执行完 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
可能原因
在执行完 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
解决方法:这个问题是因为在 LAS Catalog 中没有给指定账号赋予相关权限。请结合报错日志信息提示的 action,参考数据目录管理,为账号开通权限即可。
在执行完 6. 上线任务并且启动任务后,如果发现任务失败,并且运行事件中发现如下报错,org.apache.flink.table.catalog exceptions.DatabaseNotExistException
解决办法:这个原因是因为在 Flink 任务提交阶段,静态解析 SQL 的时候,当前不会去连接 LAS 获取已有的数据库。只要在 SQL 代码中加入以下语句:
CREATE TABLE IF NOT EXISTS test_db;
重新提交任务之后,就可以恢复正常。
在执行完 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]
解决办法:这个原因是因为对接 LAS 元数据中依赖的 hive-site.xml 的格式可能不正确。需要检查 xml 文件是否符合语法规范。常见 xml 格式问题可以参考:
<?xml ...
,在尖括号前方不能包含任何不可见字符、空格、空行等。<
、>
、&
等特殊字符,如果出现需要用 CDATA 语法标记为普通文本。如果需要删除 LAS 元数据中的库表,需要同时手动删除 LAS 元数据中的库表信息,以及 TOS 目录上的数据库表的文件路径。如果仅仅删除 LAS 元数据或者仅仅删除 TOS 目录的数据都会造成数据不一致。报以下类似的错误,导致任务失败:
解决方案:判断属于哪一种情况,将已有的 LAS 元数据和 TOS 文件数据都删除后才能保证数据库表继续正常写入。
如果我们使用了分区表,但是发现 LAS 和 TOS 的表信息不同:
解决方案:Paimon 不会自动将表的分区信息同步到 LAS 元数据管理。如果需要在 LAS 元数据管理看到数据表的分区字段,需要在建表语句中增加如下 WITH 参数:
'metastore.partitioned-table' = 'true' -- 确定是否将分区信息同步到 LAS 元数据管理
需要注意的是:因为分区字段无法动态增加,增加参数后,需要将原有的数据表清掉(包括 LAS 元数据和 TOS 的数据文件),然后重新创建。
问题描述:分层命名空间 HNS(Hierarchical NameSpace,简称分层桶),是对象存储 TOS 推出的一个全新的基于分层元数据管理的桶类型。在提供分层命名空间能力的同时兼顾了对象扁平化扩展性,提供对象语义与文件语义透明互通的能力,实现真正的一份数据多种访问协议,提升数据使用效率。
相比扁平桶,可以很好的支持目录级别的 mv 与 rename 操作,同时优化常见读操作 List 与目录 Head,提升数据处理效率与性能,能很好的满足大数据、数据湖和 AI 领域的使用场景。
而 Paimon + HNS 的配合能真正使用 HNS 的原子语义,在不同 Flink 任务之间同时提交的时候避免需要引入锁机制进行冲突解决。
使用方法:和大部分正常的 Paimon 使用方法一致,需要再在任务配置参数中额外增加自定义参数,即可正常使用
flink.plugins.filesystem.tos.proton.enabled: true
注意:当前功能暂时仅支持 Flink-1.16-volcano 版本。
问题现象:如果任务启动失败,在日志中出现如下异常信息 Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
。
解决方案:该问题是因为合规性原因,Flink CDC 没有内置 MySQL Driver,请参考 使用 JDBC 或者 MySQL-CDC 数据源 文档,下载 MySQL 官方 Driver (建议 8.0.27 版本),并且上传到 Flink CDC 任务的依赖文件中。
问题现象:在 Flink CDC 任务运行一段时间后,因为各种原因需要丢弃原来状态从全新的初始阶段开始同步。如果此时原来 Paimon 表没有删除,则会出现新数据无法写入的问题。
解决方案:这个是因为 Flink CDC Paimon 的数据下游存在缺陷,commit.user 固定不变,导致在 Paimon 写入的时候快照从 0 版本开始,因为落后当前 Paimon 表的版本,则会导致始终无法发布。有两种解决方案:
commit.user: v2
,可以保证当前新的 commit user 快照可以正常发布。问题现象:MySQL 的 datetime 是一个无时区信息的数据类型,很多用户会用这个类型存取本地时间。比如 UTC+8 时区的 2025-01-09 10:00:00
。因为无法确认时区,所以 Flink & Paimon 会在转型过程中默认使用 UTC 时间戳。所以在写入 Paimon 之后,使用 UTC+8 的时间再去查看这个时间结果为 2025-01-09 18:00:00
。导致与 MySQL 中时间出现差异。
解决方案:
2025-01-09 10:00:00
,在数据库中存储为 2025-01-09 02:00:00
问题现象:Flink CDC 启动失败,报错包含如下关键信息Can't extract bucket from row in dynamic bucket mode
如下图所示:
解决方案:当前 Flink CDC 版本暂不支持 Paimon 的动态分桶模式(bucket = -1)。所以需要在 Paimon Sink 中指定如下固定分桶的参数。
# 指定建表的时候指定的分桶数量,建议按照数据量进行合理设置 table.properties.bucket: 10
问题描述:Paimon 支持 changelog-producer 的选项,在 CDC 场景一般推荐使用哪个选项。
解决方案:Paimon 的 changelog-producer 功能支持下游 Flink 任务读取完整的变更日志,可以通过如下参数设置:
table.properties.changelog-producer: input
这个选项可以参考 Changelog 产出机制进行设置,在 CDC 场景下常见的设置有两种:
none
:如果下游不需要,则设置成 none,或者不设置即可。input
:如果下游需要 changelog,因为 CDC 上游就是变更日志,所以直接选择 input 即可。