kyuubi-tispark 的sql如何使用.mode("append")

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】使用kyuubi + tidb模式下,如何使用 insert into 、insert overwrite

【应用框架及开发适配业务逻辑】

【背景】
采用kyuubi + tispark + tidb 做数据处理

【现象】
这两种情况下会有主键问题报错,


这种insert到无主键表是正常的。

搜索资料下,batchmode开启,在submit模式下可以使用如下方式

如何通过kyuubi提交sql可以使用batchmode呢

【问题】 当前遇到的问题
如果在kyuubi下解决batch mode的insert方式

【业务影响】

【TiDB 版本】 6.5.6

【附件】 相关日志及监控

SQL 错误: org.apache.kyuubi.KyuubiSQLException: org.apache.kyuubi.KyuubiSQLException: Error operating ExecuteStatement: org.tikv.common.exception.TiBatchWriteException: currently user provided auto id value is only supported in update mode!
at com.pingcap.tispark.write.TiBatchWriteTable.preCalculate(TiBatchWriteTable.scala:179)
at com.pingcap.tispark.write.TiBatchWrite.$anonfun$doWrite$7(TiBatchWrite.scala:199)
at scala.collection.immutable.List.map(List.scala:293)
at com.pingcap.tispark.write.TiBatchWrite.doWrite(TiBatchWrite.scala:199)
at com.pingcap.tispark.write.TiBatchWrite.com$pingcap$tispark$write$TiBatchWrite$$write(TiBatchWrite.scala:94)
at com.pingcap.tispark.write.TiBatchWrite$.write(TiBatchWrite.scala:50)
at com.pingcap.tispark.write.TiDBWriter$.write(TiDBWriter.scala:41)
at com.pingcap.tispark.v2.TiDBTableProvider.createRelation(TiDBTableProvider.scala:94)
at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:47)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:75)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:73)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.executeCollect(commands.scala:84)
at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.$anonfun$applyOrElse$1(QueryExecution.scala:98)
at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$6(SQLExecution.scala:109)
at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated

有点难办啊。
我感觉不一定你用了batchmode就能解决。
可能问题是真的在target表上有自增键这个问题上。

  if ((autoIncProvidedID || autoRandomProvidedID) && conflictRows.count() != count) {
    throw new TiBatchWriteException(
      "currently user provided auto id value is only supported in update mode!")
  }

条件是这样的。我感觉好像和batchmode关系不大。

大佬您好。
我们想尝试使用tispark进行数据处理。
但发现kyuubitispark的insert into能力好像有限,使用无自增主键的target表才可以使用,但是大量写入,要求无热点,必须使用autorandom 的bigint主键。但是这样要求写入的时候就必须存在这个主键。
您有什么好的使用实践吗

我其实没怎么用过tispark,就是根据你的报错堆栈,追了一下。
你的代码碰上autorandom的表就不会抛出异常嘛?我看上面的代码,好像是autoRandom和autoInc都不行。

根据代码,似乎想要不触发上面这个异常,就要求没有autoRandom和autoInc,并且没有两个表没有冲突的数据。

至于消除热点,要么使用聚簇表+anturandom,要么使用非聚簇表+ SHARD_ROW_ID_BITS。
如果你要一定要使用自增键,那最好的方式就是非聚簇表+ SHARD_ROW_ID_BITS来消除热点。

我又对错误分析一下 ,非常符合您的分析。

默认已经是batchmode。

1 个赞

我试了带主键插入聚簇表。

聚簇表+自增是肯定会有热点的。

我用dm接mysql写入流量的时候也是自增键换不掉。
最后消除热点的方式就是非聚簇表+SHARD_ROW_ID_BITS.

https://docs.pingcap.com/zh/tidb/stable/troubleshoot-hot-spot-issues#使用-shard_row_id_bits-处理热点表

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