问题一:FlinkCDC同步Oracle的同一个库的多个表就会延迟很大
使用同一段代码,只是表名不同,目的是同步同一个库中的多个表。运行在yarn上的。当启动一个表的任务时,基本没什么延迟,并且一切正常,但是当再启动另一个表的同步任务时,就会特别慢,延迟四五分钟这样,哪怕新增一笔数据也是延迟这么久。有时候还会出现数据库连接失败的报错。具体代码如下:public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing();
env.getCheckpointConfig().setCheckpointInterval(30000);
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30000);
env.getCheckpointConfig().setCheckpointTimeout(60000);
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
env.setParallelism(1);
EnvironmentSettings Settings = EnvironmentSettings.newInstance() .inStreamingMode() .build(); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, Settings); String sourceDDL = "CREATE TABLE TS_XX_source (\n" + "ACCT_ID DECIMAL,\n" + " SEQ DECIMAL,\n" + " CC_TYPE DECIMAL,\n" + " CREDIT_LIMIT DECIMAL,\n" + " EFF_DATE TIMESTAMP(3),\n" + " EXP_DATE TIMESTAMP(3),\n" + " SP_ID DECIMAL,\n" + " primary key (ACCT_ID) not enforced\n" + ") WITH (\n" + " 'connector' = 'oracle-cdc',\n" + " 'hostname' = '******',\n" + " 'port' = '******',\n" + " 'username' = '******',\n" + " 'password' = '******',\n" + " 'database-name' = '******',\n" + " 'schema-name' = '******'," + " 'table-name' = '这里表名不同',\n" + " 'scan.startup.mode' = 'latest-offset'\n" + ")"; String sinkDDL = "CREATE TABLE TS_XX_sink (\n" + "ACCT_ID DECIMAL,\n" + " SEQ DECIMAL,\n" + " CC_TYPE DECIMAL,\n" + " CREDIT_LIMIT DECIMAL,\n" + " EFF_DATE TIMESTAMP(3),\n" + " EXP_DATE TIMESTAMP(3),\n" + " SP_ID DECIMAL,\n" + " primary key (ACCT_ID) not enforced\n" + ") WITH (\n" + " 'connector' = 'jdbc',\n" + " 'driver' = 'oracle.jdbc.driver.OracleDriver',\n" + " 'url' = '******',\n" + " 'username' = '****',\n" + " 'password' = '****',\n" + " 'table-name' = '****'\n" + ")"; String transformDmlSQL = "insert into TS_XX_sink select * from TS_XX_source"; tableEnv.executeSql(sourceDDL).print(); tableEnv.executeSql(sinkDDL).print(); tableEnv.executeSql(transformDmlSQL).print(); env.execute("sync-cdc");
}
参考回答:
根据您提供的代码段,以下是一些可能导致同步任务运行缓慢和数据库连接失败的常见问题和建议解决方法:
- 并行度设置:在代码中,您将并行度设置为了1 (
env.setParallelism(1)
),这意味着只有一个并行任务来处理数据。如果您同时启动了多个任务,但并行度仍然为1,可能会导致任务之间的竞争和资源争夺,从而导致某些任务运行缓慢。建议适当调整并行度,以充分利用集群资源,并确保每个任务都可以获得足够的计算能力。 - 数据源配置:检查您的数据源配置是否正确,并且与每个表的任务相关。确保使用了正确的连接参数、用户名、密码等信息。还要确保数据库服务器具有足够的性能和资源,以支持同时处理多个任务。
- 资源调整:在执行多个任务时,尤其是在相同的数据库上执行时,需要评估和调整任务所需的资源。包括内存、CPU、网络等方面的资源。确保分配给每个任务的资源足够,并避免资源争夺和瓶颈。
- 数据库连接池:考虑使用连接池管理数据库连接,以减少连接的创建和销毁开销。连接池可以帮助提供可重用的连接,并对连接进行管理,以支持并发访问和提高性能。
- 日志和错误排查:检查任务运行期间的日志文件,查看是否存在其他错误或异常信息,这可能有助于确定导致任务慢和数据库连接失败的具体原因。注意关注资源不足、网络问题、数据库负载过高等可能的问题。
- 调整参数:根据具体情况,可以尝试调整 Flink 的相关配置参数,如网络缓冲区大小、堆内存大小等,以优化任务的性能和资源利用。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/575709
问题二:FlinkCDC同步oracle数据的时候报错
报错信息为:Caused by: io.debezium.DebeziumException: Online REDO LOG files or archive log files do not contain the offset scn 17674590. Please perform a new snapshot.
参考回答:
这个错误是由于Flink CDC在同步Oracle数据时,找不到指定的偏移量(offset scn)17674590。为了解决这个问题,你需要执行一个新的快照。
解决方法:
- 停止当前的Flink CDC任务。
- 删除现有的Oracle数据库快照文件。
- 重新创建一个新的Oracle数据库快照。
- 重新启动Flink CDC任务。
具体操作步骤如下:
- 停止当前的Flink CDC任务。你可以使用以下命令来停止任务:
./bin/flink stop -t <job-id>
将<job-id>
替换为你的Flink CDC任务的ID。
- 删除现有的Oracle数据库快照文件。你需要找到并删除与Flink CDC相关的Oracle数据库快照文件。这些文件通常位于
$FLINK_HOME/connectors/jdbc/oracle/snapshots
目录下。 - 重新创建一个新的Oracle数据库快照。你可以使用以下命令来创建新的快照:
./bin/flink run -p oracle-cdc --from-jars flink-connector-oracle-cdc_2.11-1.13.2.jar /path/to/your/sql/script.sql
将/path/to/your/sql/script.sql
替换为你的SQL脚本文件路径。这个脚本文件应该包含创建新快照所需的所有SQL语句。
- 重新启动Flink CDC任务。你可以使用以下命令来启动任务:
./bin/flink run -t <job-id>
将<job-id>
替换为你的Flink CDC任务的ID。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/575386
问题三:Flink CDC中flinksql消费kafka的数据写入doris中,没报错,有遇到过么?
Flink CDC中flinksql消费kafka的数据写入doris中,没报错,但是也没有输出,大家有遇到过么?
参考回答:
在使用Flink CDC将Kafka中的数据写入Doris时,如果没有任何错误信息但也没有输出结果,可能的原因和解决方法包括:
- 检查源表的元数据:确保从Kafka读取的数据列与目标Doris表的列相匹配。这包括列的数量、名称和类型。
- 确认数据是否正确流入Kafka:可以使用如
kafka-console-consumer.sh
工具来直接查看Kafka中是否有数据。 - 检查SQL查询语句:确保你的INSERT INTO或INSERT OVERWRITE SQL语句没有逻辑错误,并且正确的指定了源表和目标表。
- 确认数据格式转换:如果你的源数据是JSON或者其他非结构化的数据格式,你需要在插入到Doris之前进行解析和转换。
- 查看Flink任务的状态:可以通过Flink Web UI或者命令行界面(CLI)来检查Flink任务的运行状态和日志,看看是否有任何警告或异常。
- 开启并查看Flink的日志记录级别:将Flink的日志记录级别设置为DEBUG或TRACE,以获取更详细的日志信息。
- 检查Doris表的权限:确认你有足够的权限向该Doris表中写入数据。
- 确认网络连接:确保Flink集群能够访问到Kafka和Doris服务器。
- 验证Doris实例的健康状况:检查Doris实例是否正常运行,有无磁盘空间不足、负载过高等问题。
- 重启Flink作业:有时重启Flink作业可能会解决问题,尤其是在配置更改后。
- 升级Flink和相关依赖库版本:如果使用的不是最新版本的Flink和相关库,尝试更新到最新版,因为可能存在已知的问题和修复。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/575333
问题四:Flink CDC 有碰到过mysql的作业无法启动的问题吗?
Flink CDC有碰到过mongo-cdc与mysql-cdc的胖包放一起之后,mysql的作业无法启动的问题吗?
2023-11-30 01:50:48,073 INFO org.apache.flink.runtime.executiongraph.ExecutionGraph [] - Source: t_a_data_develop_task_info[3] -> ConstraintEnforcer[4] -> t_a_data_develop_task_info[4]: Writer -> t_a_data_develop_task_info[4]: Committer (1/1) (e7c156712ee3d1468468a1713462c619_cbc357ccb763df2852fee8c4fc7d55f2_0_8) switched from INITIALIZING to RUNNING.
2023-11-30 01:50:48,079 ERROR org.apache.flink.runtime.source.coordinator.SourceCoordinator [] - Uncaught exception in the SplitEnumerator for Source Source: t_a_data_develop_task_info[3] while handling operator event RequestSplitEvent (host='10.36.0.6') from subtask 0 (#8). Triggering job failover.
org.apache.flink.util.FlinkRuntimeException: Chunk splitting has encountered exception
at com.ververica.cdc.connectors.mysql.source.assigners.MySqlSnapshotSplitAssigner.checkSplitterErrors(MySqlSnapshotSplitAssigner.java:583) ~[flink-sql-connector-mysql-cdc-2.4.2.jar:2.4.2]
at com.ververica.cdc.connectors.mysql.source.assigners.MySqlSnapshotSplitAssigner.getNext(MySqlSnapshotSplitAssigner.java:341) ~[flink-sql-connector-mysql-cdc-2.4.2.jar:2.4.2]
参考回答:
从日志中可以看出,Flink CDC在处理MySQL和MongoDB的CDC数据时遇到了问题。具体来说,当将两个连接器(mongo-cdc和mysql-cdc)放在同一个作业中时,MySQL作业无法启动。这可能是由于这两个连接器之间的兼容性问题导致的。
为了解决这个问题,你可以尝试以下方法:
- 确保你的Flink版本与这两个连接器的版本兼容。你可以查看官方文档或GitHub仓库中的已知问题,以了解这两个连接器之间是否存在已知的不兼容问题。
- 检查你的作业配置,确保没有设置可能导致冲突的配置参数。例如,你可能需要禁用其中一个连接器,或者调整它们的优先级。
- 如果可能的话,尝试将这两个连接器分开运行。这样,你可以分别调试它们的问题,而不是在一个作业中同时使用它们。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/575331
问题五:Flink CDC任务总是报错这个怎么解决哇?
Flink CDC任务总是报错这个怎么解决哇?org.apache.kafka.connect.errors.ConnectException: An exception occurred in the change event producer. This connector will be stopped.
at io.debezium.pipeline.ErrorHandler.setProducerThrowable(ErrorHandler.java:55)
at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:239)
at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:61)
at io.debezium.pipeline.ChangeEventSourceCoordinator.streamEvents(ChangeEventSourceCoordinator.java:188)
at io.debezium.pipeline.ChangeEventSourceCoordinator.executeChangeEventSources(ChangeEventSourceCoordinator.java:153)
at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:118)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
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)
Caused by: java.lang.IllegalStateException: None of log files contains offset SCN: 10611284798911, re-snapshot is required.
at io.debezium.connector.oracle.logminer.LogMinerHelper.setLogFilesForMining(LogMinerHelper.java:102)
at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.initializeRedoLogsForMining(LogMinerStreamingChangeEventSource.java:362)
at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:212)
... 9 more
参考回答:
这个报错表明在Flink CDC任务中使用的Debezium连接器在处理变更事件时发生了异常。
具体报错信息是java.lang.IllegalStateException: None of log files contains offset SCN: 10611284798911, re-snapshot is required.
,提示没有找到指定的偏移量(SCN),需要重新进行快照数据的生成。
要解决这个问题,您可以尝试以下方法:
- 执行重新快照:根据报错信息建议,可以尝试对数据库进行重新快照。可以停止Flink CDC任务并清除相关的状态信息(如offset状态),然后重新启动任务以生成新的快照。
- 检查数据库日志文件:确保数据库的日志文件完整且可用。日志文件可能已经被删除、移动或损坏,导致无法找到指定的偏移量。请检查数据库配置和日志文件路径,确保日志文件存在且正确配置。
- 检查Debezium和CDC版本兼容性:确保使用的Debezium版本与您的CDC任务版本兼容,并且支持所需的功能。有时,特定的版本组合可能会导致一些问题。
- 调整Debezium配置:根据您的实际情况和需求,可能需要调整Debezium连接器的配置。例如,可以尝试更改redo log的配置、切换到streaming模式等来适应数据库环境的变化。
关于本问题的更多回答可点击原文查看: