2023年11月29日发(作者:)

flink读取mysql表中的时间字段ateTi。。。

版本说明

flink 版本 1.13.5

mysql 版本 8.0.26

操作

使⽤mysql table api 读取mysql8中的⼀个表,这个表的时间字段类型是datetime,在创建数据源的时候,对应mysql 的时间类型,设置成

datatime,String 都不⾏,执⾏都报错。

这让我emo好久,找不出问题所在。这应该是mysql的⼀个bug。

具体错误信息

Exception in thread "main" eException: Failed to fetch next result

at sultFromFetcher(:109)

at t(:80)

at esultImpl$CloseableRowIteratorWrapper.hasNext(:370)

at sTableauForm(:152)

at (:160)

at (:69)

Caused by: ption: Failed to fetch job execution result

at umulatorResults(:177)

at (:120)

at sultFromFetcher(:106)

... 5 more

Caused by: ionException: cutionException: Job execution failed.

at Get(:357)

at (:1928)

at umulatorResults(:175)

... 7 more

Caused by: cutionException: Job execution failed.

at xecutionResult(:144)

at $getJobExecutionResult$3(:137)

at ly(:616)

at lyStage(:628)

at ply(:1996)

at ExecutionResult(:134)

at umulatorResults(:174)

... 7 more

Caused by: eption: Recovery is suppressed by NoRestartBackoffTimeStrategy

at Failure(:138)

at lureHandlingResult(:82)

at TaskFailure(:216)

at andleTaskFailure(:206)

at TaskExecutionStateInternal(:197)

at TaskExecutionState(:682)

at TaskExecutionState(:79)

at TaskExecutionState(:435)

at (Unknown Source)

at (:43)

at (:498)

at RpcInvocation(:305)

at RpcMessage(:212)

at RpcMessage(:77)

at Message(:158)

at (:26)

at (:21)

at rElse(:123)

at rElse$(:122)

at rElse(:21)

at lFunction$OrElse.applyOrElse(:171)

at lFunction$OrElse.applyOrElse(:172)

at lFunction$OrElse.applyOrElse(:172)

at lFunction$OrElse.applyOrElse(:172)

at Receive(:517)

at Receive$(:515)

at Receive(:225)

at eMessage(:592)

at (:561)

at sMailbox(:258)

at (:225)

at (:235)

at (:260)

at inPool$WorkQueue.runTask(:1339)

at ker(:1979)

at (:107)

Caused by: astException: ateTime cannot be cast to amp

at (:30)

at sitionBased(:163)

at (:142)

at (:72)

at Operator(:69)

at t(:46)

at t(:26)

at t(:50)

at t(:28)

at SourceContexts$ManualWatermarkContext.processAndCollect(:317)

at SourceContexts$WatermarkContext.collect(:411)

at (:92)

at (:110)

at (:66)

at StreamTask$LegacySourceFunctionThread.run(:269)

解决办法

⽬前定位问题是 mysql8的驱动问题,服务器mysql的版本是8.0.26,我试了驱动 8.0.26 8.0.25 好⼏个版本,最后发现低版本的可以解

决这个问题,我使⽤mysql 8.0.16 ,设置时间类型为 timestamp 就可以查询了。

复现测试

public class ReadsMysql {

public static void main(String[] args) throws Exception {

// 连接mysql 数据源

String sourceDDL = "CREATE TABLE c_ex_stock (n" +

" EndDate TIMESTAMP,n" +

" InnerCode INT,n" +

" StatisPeriod INT,n" +

" StatisType VARCHAR,n" +

" SecuCode VARCHAR,n" +

" SecuAbbr VARCHARn" +

" CalDate TIMESTAMPn" +

") WITH (n" +

"'' = 'jdbc'," +

"'' = 'jdbc:mysql://.120.201:3306/fl?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL

=true&serverTimezone=GMT&2B8'," +

"'' = ''," +

"'' = 'c_ex_stock'," +

" 'me' = 'xxx'," +

" 'rd' = 'xxxx'"+

")";

EnvironmentSettings settings = EnvironmentSettings

.newInstance()

.inStreamingMode()

.useBlinkPlanner()

.build();

StreamTableEnvironment tEnv = (env, settings);

// 注册sourcesink

eSql(sourceDDL);

// 数据提取

Table sourceTable = ("c_ex_stock");

TableResult tableResult = eSql("select * from " + sourceTable);

();

// 执⾏作业

e("flink-read-mysql");

}

}