yarn开启spark.speculation写入TiDB,数据会写多

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

  • 【TiDB 版本】:3.0.4 6个tikv 全SSD存储
  • 【问题描述】:

场景一:yarn开启推测执行机制,会出现写入TiDB数据重复问题,导致数据多写

场景二:SQL:insert into。。。ON DUPLICATE KEY UPDATE。。。 写入的时候出现 Write Conflict 报错,调整 tidb_disable_txn_auto_retry 设置为off,不报错了, 但是写入数据少了,应该是update的时候没有全更新,类似于锁的问题

(user:root time: 20:03)[db: (none)]set global tidb_disable_txn_auto_retry=0; Query OK, 0 rows affected (0.09 sec)

(user:root time: 20:03)[db: (none)]show variables like ‘tidb_retry%’;

±-----------------±------+

| Variable_name | Value |

±-----------------±------+

| tidb_retry_limit | 10 |

±-----------------±------+

1 row in set (0.01 sec)

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

  1. 如果是spark+jdbc写入tidb 不建议开启“推测执行” 确实会导致数据重复

  2. 关于 tidb_disable_txn_auto_retry 设置为 off 导致数据更新丢失,这个是符合预期的 可以看下这个参数的介绍:

以及事务自动重试带来的异常:

在代码端判断,怎么判断呢,有提交的代码的例子嘛?

我这样试写了一下,不对

def trycommit(connection: Connection){

    try{

        connection.commit()

    }catch{

        case e: Exception   => {

            connection.rollback()

            trycommit(connection)

        }

    }

}

TiDB 会返回错误信息的,可以根据返回的错误信息进行捕捉: