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 个赞
  1. 如果是spark+jdbc写入tidb 不建议开启“推测执行” 确实会导致数据重复

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

https://pingcap.com/docs-cn/dev/reference/configuration/tidb-server/tidb-specific-variables/#tidb_disable_txn_auto_retry

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

https://pingcap.com/docs-cn/dev/reference/transactions/transaction-isolation/#事务自动重试及带来的异常

1 个赞

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

我这样试写了一下,不对

def trycommit(connection: Connection){

    try{

        connection.commit()

    }catch{

        case e: Exception   => {

            connection.rollback()

            trycommit(connection)

        }

    }

}

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

https://pingcap.com/docs-cn/stable/faq/tidb/#91-tidb-自定义报错汇总

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