tispark 中now()写入tidb时间减少13小时

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.5
  • 【问题描述】:

使用tispark 查询tidb,进行计算,有统计时间字段使用now() 值,最终结果使用dataset.show(),时间显示正常,但写入到tidb后,使用tidb查询,时间会小13小时

SHOW VARIABLES LIKE ‘%time_zone’;

system_time_zone CST
time_zone SYSTEM

通过date查看两个服务器时间一致
tidb使用sql直接 insert into时间正常显示

spark.show (时间最后一列)

|     100|     10002|  100020007|            null|          null|           null|                  0|        |        null|                  |            11144|          0|         8100125|   -0.67|     0.02|               0|             -0.0534|           -0.04|            0|             -0.0534|             -0.0534|-134.67000000000002|          134.6166|               0.0|  134.67000000000002|2020-04-23 12:22:...|
|     100|     10002|  100020007|            null|          null|           null|                  0|        |        null|                  |            11145|          0|         8100125|    0.33|     0.02|               0|0.006600000000000001|             0.0|            0|0.006600000000000001|0.006600000000000001|              66.33|-66.32339999999999|               0.0|              -66.33|2020-04-23 12:22:...|
|     100|     10002|  100020007|            null|          null|           null|                  0|        |        null|                  |            11146|          0|         8100125|    0.33|     0.02|               0|0.006600000000000001|             0.0|            0|0.006600000000000001|0.006600000000000001|              66.33|-66.32339999999999|               0.0|              -66.33|2020-04-23 12:22:...|

tidb表

70000	70000	100120222	(LOB) 6 bytes	(LOB) 8 bytes	(LOB) 2 bytes	20088	(LOB) 3 bytes	0	(LOB) 0 bytes	11224	0	8103820	9985	100	0	998500	0	0	998500	998500	599000.15	399499.85	12.5	-598987.65	2020-04-22 23:22:05
70000	70000	100120222	(LOB) 6 bytes	(LOB) 8 bytes	(LOB) 2 bytes	20088	(LOB) 3 bytes	0	(LOB) 0 bytes	11225	0	8103820	-9985	100	0	-998500	0	0	-998500	-998500	-599000.15	-399499.85	12.5	599012.65	2020-04-22 23:22:05
70000	70000	100120222	(LOB) 6 bytes	(LOB) 8 bytes	(LOB) 2 bytes	20088	(LOB) 3 bytes	0	(LOB) 0 bytes	11226	0	8103820	1	100	0	100	0	0	100	100	59.99	40.01	12.5	-47.49	2020-04-22 23:22:05

您好,麻烦提供下 tispark 的版本以及使用的 spark 的版本,另外写入到 tidb 是以什么方式写入的 ?

tispark-core-2.1.8-spark_2.4-jar-with-dependencies.jar

dataset
                .write()
                .mode(SaveMode.Overwrite)
                .format("jdbc")
                .option("driver", "com.mysql.jdbc.Driver")
                .option("url", "jdbc:mysql://*******:4000/h3_bigdata?&autoReconnect=true&failOverReadOnly=false&rewriteBatchedStatements=true&useServerPrepStmts=true&allowMultiQueries=true")
                .option("useSSL", "false")
                .option("isolationLevel", "NONE")
                .option(JDBCOptions.JDBC_BATCH_FETCH_SIZE(), 256)
                .option("dbtable", "r_order_outbound_pre")
                .save();

本地执行没有问题,ali上部署的预生产环境就有问题

好的,已经在查看,请稍后。

可以看一眼预生产环境上,spark 的 driver/worker 机器的时区是否设置正确?减少的 13 小时很可能是由于 spark 在取结果时先转成了本地时区,然后再重新通过 jdbc 写入。此时如果时区有误,可能会造成问题。

spark的driver与worker的时区是一致的

[tidb@tikv3 ~]$ timedatectl
      Local time: Fri 2020-04-24 10:02:31 CST
  Universal time: Fri 2020-04-24 02:02:31 UTC
        RTC time: Fri 2020-04-24 10:02:29
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: yes
      DST active: n/a

Warning: The system is configured to read the RTC time in the local time zone.
         This mode can not be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.

好的,你的问题已收到,正在分析,请稍等

可以尝试在 jdbcurl 中添加 serverTimezone=GMT+8&sessionVariables=time_zone=’+8:00’

jdbc:mysql://******:4000/h3_bigdata?&autoReconnect=true&failOverReadOnly=false&rewriteBatchedStatements=true&useServerPrepStmts=true&allowMultiQueries=true&serverTimezone=GMT+8&sessionVariables=time_zone='+8:00'

报错:com.mysql.cj.exceptions.CJException: Unknown or incorrect time zone: ’ 8:00’

删除&sessionVariables=time_zone=’+8:00’
报错:No timezone mapping entry for ‘GMT 8’

正在分析,请稍等

好的,谢谢

:grinning:

serverTimezone=Asia/Shanghai&sessionVariables=time_zone='+8:00'

可能是标点问题,可以尝试这个

1 个赞

只加了一个参数 serverTimezone=Asia/Shanghai 。
时间正常了

:ok_hand:

兄dei,怎么增加的?我这里也有这个问题噻

搞定了,加了个参数

:ok_hand:

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。