使用tidb和tispark对1亿大表查询出现超时报错

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

  • 【TiDB 版本】:4.0.0
  • 【问题描述】:对1亿大表查询时很久没有结果,最后出现错误:

ERROR 9006 (HY000): GC life time is shorter than transaction duration, transaction starts at 2020-08-22 14:24:54.847 +0800 CST, GC safe point is 2020-08-22 14:34:28.997 +0800 CST

查询语句:select count(*) from items where xxxx;
该表数据量大概1.8亿行,且字段有十多个。

后来以为是tidb性能问题就使用tispark进行查询,结果光count(*)没有where条件就报了大量错误。

toreClient.handleCopResponse(RegionStoreClient.java:679)
at com.pingcap.tikv.region.RegionStoreClient.coprocess(RegionStoreClient.java:623)
at com.pingcap.tikv.operation.iterator.DAGIterator.process(DAGIterator.java:219)
at com.pingcap.tikv.operation.iterator.DAGIterator.lambda$submitTasks$1(DAGIterator.java:90)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
20/08/21 18:16:32 ERROR DAGIterator: Process region tasks failed, remain 0 tasks not executed due to
com.pingcap.tikv.exception.SelectException: Execution terminated due to exceeding the deadline
at com.pingcap.tikv.region.RegionStoreClient.doCoprocessor(RegionStoreClient.java:708)
at com.pingcap.tikv.region.RegionStoreClient.handleCopResponse(RegionStoreClient.java:679)
at com.pingcap.tikv.region.RegionStoreClient.coprocess(RegionStoreClient.java:623)
at com.pingcap.tikv.operation.iterator.DAGIterator.process(DAGIterator.java:219)
at com.pingcap.tikv.operation.iterator.DAGIterator.lambda$submitTasks$1(DAGIterator.java:90)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
20/08/21 18:16:32 ERROR DAGIterator: Process region tasks failed, remain 0 tasks not executed due to
com.pingcap.tikv.exception.SelectException: Execution terminated due to exceeding the deadline
at com.pingcap.tikv.region.RegionStoreClient.doCoprocessor(RegionStoreClient.java:708)
at com.pingcap.tikv.region.RegionStoreClient.handleCopResponse(RegionStoreClient.java:679)
at com.pingcap.tikv.region.RegionStoreClient.coprocess(RegionStoreClient.java:623)
at com.pingcap.tikv.operation.iterator.DAGIterator.process(DAGIterator.java:219)
at com.pingcap.tikv.operation.iterator.DAGIterator.lambda$submitTasks$1(DAGIterator.java:90)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
20/08/21 18:16:32 ERROR DAGIterator: Process region tasks failed, remain 0 tasks not executed due to
com.pingcap.tikv.exception.SelectException: Execution terminated due to exceeding the deadline
at com.pingcap.tikv.region.RegionStoreClient.doCoprocessor(RegionStoreClient.java:708)
at com.pingcap.tikv.region.RegionStoreClient.handleCopResponse(RegionStoreClient.java:679)
at com.pingcap.tikv.region.RegionStoreClient.coprocess(RegionStoreClient.java:623)
at com.pingcap.tikv.operation.iterator.DAGIterator.process(DAGIterator.java:219)
at com.pingcap.tikv.operation.iterator.DAGIterator.lambda$submitTasks$1(DAGIterator.java:90)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

所以是无论在tidb上查还是使用tispark在tikv上查都会超时吗?
tidb对于上亿级别大表的单次查询count,min,max的正常时间预期大概是多长?
还有想问一下tispark查询时会用到tidb建表时创建的索引吗?
已经按照官方文档处理ERROR 9006 (HY000): GC life time is shorter的方法将GC life time调至30m.

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

这里超时应该是因为 TiKV 压力较大导致 request 进入排队时间太久,可能的原因是 Region 太大或者 TiKV 集群压力太大。可以从这两个角度查看监控确认一下。

能否提供一下集群的拓扑信息和环境配置,方便计算?

会的。

最后请问一下数据导入是通过 lightning 吗?可以看看这个回答是否有帮助:lightning 导入大表,select count(*) 报错:Execution terminated due to exceeding the deadline

集群有3个PD,3个KV。

数据是通过python脚本插入的,导入没有问题,只是查询的时候报错,根本无法做大量数据或跨列的条件查询

  1. tispark 查询其他表正常吗?
  2. tidb 修改 gc 时间后,查询报什么错?

1.tispark做其他查询,比如直接求count(*)不带where条件,查询字段信息带limit 500等可以拿到结果,虽然count可能会等十几分钟甚至有几率报上面的错,但是有时候spark的task不断重试能跑出来。

但是大部分情况或稍微多加几个where条件必定会崩掉,图中四十多分钟的是崩掉的任务。跑了十多分钟的可能是retry多次后拿到结果的时间

  1. tidb修改GC时间后还是报ERROR 9006 (HY000): GC life time is shorter than transaction duration, 的错误

麻烦反馈出问题时的 over-view , tidb , detail-tikv 监控,多谢。

(1)、chrome 安装这个插件https://chrome.google.com/webstore/detail/full-page-screen-capture/fdpohaocaechififmbbbbbknoalclacl

(2)、鼠标焦点置于 Dashboard 上,按 ?可显示所有快捷键,先按 d 再按 E 可将所有 Rows 的 Panels 打开,需等待一段时间待页面加载完成。

(3)、使用这个 full-page-screen-capture 插件进行截屏保存

  1. 您好从over-view 中查看 cpu 和 内存都上涨了非常多,但是我没有看到整体机器的信息


  2. 能否麻烦您确认下,当查询出错时,是否 cpu 或者 内存被打满了?

  3. 也可以查看下 dmesg,是否有 OOM

请问一下 tispark 是什么版本?

tispark:2.3.2

不过我感觉应该不是tispark的问题,如果能解决tikv压力过大的问题tidb和tispark应该都能查询出结果

那麻烦您先检查下资源使用情况,是不是cpu或者内存, IO 打满了吗?

我检查了下图中所有组件过去 7 天的 cpu、mem 消耗,资源都在 45% 以下,远远低于 60% 健康线的告警

不过还是想问一下,以这样的集群配置预期亿级以上数据的查询正常预期耗时大概多少?无法避免GC life time error的问题吗?只能通过不断调大GC life time解决?或者是正常来说实际上30m内可以完成一次查询,无需特意延长GC life time来避免此类问题?

可以试下最新版的tispark-2.3.2
https://github.com/pingcap/tispark/releases/tag/v2.3.2

能否麻烦反馈下您的机器配置信息,over-view 里没有看到,配置是满足要求的吗? 还是说是机械盘,且内存都比较小?

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