SqlServer FlinkCDC同步到Paimon一直卡在Busy100%的问题处理: Failed to convert value xxx to type TINYINT

本文介绍了在使用Flink CDC从SqlServer同步数据到Paimon时遇到的问题,即作业卡在CDC MultiplexWriter, Busy 100%。原因是Paimon在处理TINYINT类型时的类型转换错误,导致越界异常。解决方案是修改Paimon的源码,将TINYINT处理方式改为与SMALLINT相同,重新编译并替换jar文件,最后重启Flink作业。

解决FlinkCDC流作业卡住问题

问题描述

通过FlinkCDC启动流式数据同步,将SqlServer数据同步到Paimon数据湖中,在Flink管理里界面发现同步状态异常:卡在CDC MultiplexWriter,一直处于Busy 100%。如图:
Flink同步作业状态异常
当Flink作业卡住一段时间之后,Flink Dashboard Exceptions页面可以看到以下异常信息:

org.apache.flink.util.FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold. The latest checkpoint failed due to Checkpoint expired before completing., view the Checkpoint History tab or the Job Manager log to find out why continuous checkpoints failed.
	at org.apache.flink.runtime.checkpoint.CheckpointFailureManager.checkFailureAgainstCounter(CheckpointFailureManager.java:212)
	at org.apache.flink.runtime.checkpoint.CheckpointFailureManager.handleJobLevelCheckpointException(CheckpointFailureManager.java:169)
	at org.apache.flink.runtime.checkpoint.CheckpointFailureManager.handleCheckpointException(CheckpointFailureManager.java:122)
	at org.apache.flink.runtime.checkpoint.CheckpointCoordinator.abortPendingCheckpoint(CheckpointCoordinator.java:2155)
	at org.apache.flink.runtime.checkpoint.CheckpointCoordinator.abortPendingCheckpoint(CheckpointCoordinator.java:2134)
	at org.apache.flink.runtime.checkpoint.CheckpointCoordinator.access$700(CheckpointCoordinator.java:101)
	at org.apache.flink.runtime.checkpoint.CheckpointCoordinator$CheckpointCanceller.run(CheckpointCoordinator.java:2216)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

问题原因

打开Task Managers日志界面,或者到hadoop的日志目录下查找taskmanager.log日志,定位到异常错误位置:

2024-06-11 18:17:52,318 INFO  org.apache.paimon.flink.sink.cdc.CdcRecordUtils     [] - Failed to convert value 162 to type TINYINT. Waiting for schema update. 
java.lang.NumberFormatException: Value out of range. Value:"162" Radix:10
        at java.lang.Byte.parseByte(Byte.java:151) ~[?:1.8.0_371]
        at java.lang.Byte.valueOf(Byte.java:205) ~[?:1.8.0_371]
        at java.lang.Byte.valueOf(Byte.java:231) ~[?:1.8.0_371]
        at org.apache.paimon.utils.TypeUtils.castFromStringInternal(TypeUtils.java:125) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.paimon.utils.TypeUtils.castFromCdcValueString(TypeUtils.java:60) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.paimon.flink.sink.cdc.CdcRecordUtils.toGenericRow(CdcRecordUtils.java:103) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.paimon.flink.sink.cdc.CdcRecordUtils.toGenericRow(CdcRecordUtils.java:103) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.paimon.flink.sink.cdc.CdcRecordStoreMultiWriteOperator.processElement(CdcRecordStoreMultiWriteOperator.java:153) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.flink.streaming.runtime.tasks.OneInputStreamTask$StreamTaskNetworkOutput.emitRecord(OneInputStreamTask.java:237) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.processElement(AbstractStreamTaskNetworkInput.java:146) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.emitNext(AbstractStreamTaskNetworkInput.java:110) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:65) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:550) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:231) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:839) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:788) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:952) [flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:931) [flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:745) [flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.runtime.taskmanager.Task.run(Task.java:562) [flink-dist-1.17.1.jar:1.17.1]
        at java.lang.Thread.run(Thread.java:750) [?:1.8.0_371]

在错误栈中注意到org.apache.paimon.utils.TypeUtils,查看其源码:

private static Object castFromStringInternal(String s, DataType type, boolean isCdcValue) {
   
   
        BinaryString str = BinaryString.
<think>好的,我现在需要帮用户解决如何在Flink SQL中将Kafka topic的数据实时同步Paimon表的问题。首先,我需要回忆一下相关的知识和之前的引用内容。 根据用户提供的引用[1],Paimon支持将多个或一个Kafka topic同步到一个数据库中,并且能够自动识别不同表的数据,插入到对应的Paimon表中。这里提到了使用Flink的kafka_sync_database操作,但用户现在问的是Flink SQL的配置方法,可能需要转换一下思路,因为引用中的例子是使用Flink作业提交的方式,而不是直接写SQL。 不过Flink SQL通常需要创建源表和目标表,然后使用INSERT INTO语句来实现数据同步。所以可能需要用CREATE TABLE语句来定义Kafka源表和Paimon目标表的结构,并配置相应的连接器。 引用[2]提到会自动创建Paimon表,如果不存在的话,模式是从Kafka的表中派生的。这可能意味着在Flink SQL中,当定义好源表之后,写入到Paimon表时,如果表不存在,Paimon会自动创建。但需要确认Flink SQL的DDL是否支持这种自动创建表的功能。 引用[3]给出了一个Flink写入Oracle的例子,但这里的情况不同,用户需要的是写入Paimon,所以可能需要参考Paimon的官方文档,看看如何配置Flink SQL的connector。 接下来,我需要整理步骤: 1. 创建Kafka源表:使用Flink SQL的CREATE TABLE语句,指定connector为kafka,配置topic、bootstrap.servers、反序列化方式(比如JSON),以及格式参数。 2. 创建Paimon目标表:同样使用CREATE TABLE,但connector为paimon,指定warehouse和database。需要注意的是,如果表不存在,是否会自动创建?可能需要设置相应的参数,比如'auto-create'之类的选项。或者根据引用[2],可能不需要显式创建,因为在同步时会自动生成。 不过,用户可能希望用SQL的方式直接定义,而不是使用作业提交的方式。这时候可能需要明确写出DDL语句。 另外,需要注意主键的定义,因为Paimon可能需要主键来进行更新或合并操作。在Kafka的数据中,需要确保有主键字段,并在创建Paimon表时指定PRIMARY KEY。 可能还需要设置一些表属性,比如写入模式(append或upsert),以及检查间隔等。 然后,用户需要编写INSERT INTO语句将数据从Kafka源表插入到Paimon目标表。这一步可能需要流处理的环境,比如启用checkpoint,并提交作业。 另外,用户可能需要配置Flink的执行环境,比如在SQL客户端中设置execution.runtime-mode为streaming,或者通过提交作业时指定。 现在,我需要验证这些步骤是否正确,是否有遗漏。例如,是否需要在Flink SQL中启用特定的配置来支持Paimon connector,比如添加相关的jar包到lib目录下。用户可能需要提前部署好PaimonFlink connector。 此外,时间字段的处理也很重要,可能需要指定事件时间或处理时间字段,尤其是在处理实时数据时,可能需要用到水印。 举个例子,假设Kafka中的消息是JSON格式,包含id、name、event_time等字段,那么创建源表时需要正确解析这些字段,并设置水印。而Paimon表的结构需要与之匹配,并定义主键。 最后,用户可能需要一个完整的示例,包括创建源表、目标表和插入语句,以及提交作业的方式。可能还需要提到如何启动Flink SQL客户端,并执行这些SQL语句。 总结一下,步骤应该是: 1. 配置Flink环境,添加Paimon和Kafka的连接器依赖。 2. 使用CREATE TABLE语句定义Kafka源表,指定格式和连接参数。 3. 使用CREATE TABLE语句定义Paimon目标表,指定主键和存储路径。 4. 执行INSERT INTO将数据从源表插入到目标表。 5. 提交作业到Flink集群运行。 同时,需要检查是否有语法错误,比如在定义PRIMARY KEY时是否使用了正确的语法,以及连接器参数是否正确。例如,Paimon的connector参数可能为'paimon',而路径需要指向warehouse和database。 此外,根据引用[1]中的参数,可能需要配置一些表前缀、后缀或过滤规则,但如果在SQL中处理,可能需要通过动态表选项或直接在表名中处理。 最后,需要确保示例中的配置参数是用户实际需要替换的部分,比如kafka的bootstrap.servers,topic名称,以及Paimon的warehouse路径。</think>### Flink SQL实时同步Kafka Topic到Paimon表配置方法 #### 一、环境准备 1. 确保Flink集群已部署Paimon Connector(需将`paimon-flink-*.jar`放入`$FLINK_HOME/lib`目录) 2. Kafka Connector需包含`flink-connector-kafka`依赖 #### 二、配置步骤 1. **创建Kafka源表** ```sql CREATE TABLE kafka_source ( id INT, name STRING, event_time TIMESTAMP(3), WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND ) WITH ( 'connector' = 'kafka', 'topic' = 'user_behavior', 'properties.bootstrap.servers' = 'kafka-server:9092', 'properties.group.id' = 'paimon-sync-group', 'scan.startup.mode' = 'latest-offset', 'format' = 'json' ); ``` 2. **创建Paimon目标表** ```sql CREATE TABLE paimon_sink ( id INT PRIMARY KEY NOT ENFORCED, name STRING, event_time TIMESTAMP(3) ) WITH ( 'connector' = 'paimon', 'warehouse' = 'hdfs:///paimon/warehouse', 'database' = 'user_db', 'table' = 'behavior_log' ); ``` 3. **启动流式写入作业** ```sql INSERT INTO paimon_sink SELECT id, name, event_time FROM kafka_source; ``` #### 三、参数说明 1. **Kafka连接参数**: - `scan.startup.mode`:支持`earliest-offset`/`latest-offset`/`timestamp` - `format`:需与Kafka消息格式匹配(JSON/Avro等) 2. **Paimon参数**: - `warehouse`:Paimon数据仓库路径 - `auto-create`:未显式声明时自动建表[^2] - 支持动态表参数配置: ```sql 'snapshot.time-retained' = '1h', 'changelog-producer' = 'lookup' ``` #### 四、执行命令 通过Flink SQL客户端提交作业: ```bash ./bin/sql-client.sh embedded \ -j /path/to/paimon-flink-*.jar \ -f /path/to/sync_job.sql ``` #### 五、高级配置 1. **多Topic同步**: 通过正则表达式匹配多个Topic: ```sql 'topic' = 'userlog_.*', 'scan.topic-pattern' = 'userlog_2023.*' ``` 2. **Schema演化**: 当Kafka Topic数据结构变更时,Paimon支持自动合并Schema: ```sql 'merge-schema' = 'true' ``` 3. **状态后端配置**(在Flink配置文件中设置): ```yaml state.backend: rocksdb state.checkpoints.dir: hdfs:///flink/checkpoints ``` [^1]: Paimon通过combined sink实现多表同步,自动处理表结构映射[^1] [^2]: 当目标表不存在时,会根据源表Schema自动创建Paimon表[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值