JDBC通过StreamingResult 流式获取执行结果的效率问题

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

  • 【TiDB 版本】:v4.0.7
  • 【问题描述】:
    我们是用TiDB做OLAP分析用的,流程是用TiDB做分析,然后通过JDBC把分析结果传到Spark,再用Spark把数据写到Hive。
    我们希望把TiDB分析好的结果,传输的越快越好,现在传输速度有点慢。
    1、请问如果使用“JDBC通过StreamingResult 流式获取执行结果”传输数据的话,相比于默认的方式,会快还是慢?内存使用得多没关系,关键是速度越快越好。
    https://docs.pingcap.com/zh/tidb/stable/java-app-best-practices#使用-streamingresult-流式获取执行结果

2、JDBC传数据这块,还有其他可以优化的吗?


对于fetchsize,numpartitions,请问有比较合理的参数吗?
TIDB官方有篇文章,我看了下, 但是里面没有具体参数,我们设置的参数优化效果不明显,所以想请教下。

1、具体的参数值哪个合适,和硬件有关系,无法直接给出答案,另外,流式和一次性,应该是一次性更好,不过觉得时间主要是看:上游的查询速度及下游的插入速度
2、另外,如果咱们分析是什么类型的分析,是否可以利用 tiflash 列存的特性,来加快速度

分析的话,就是一个大的SQL,好几百行,表的数据量在2000万行以下。我了解下tiflash。
还有个问题,就是我们的表,没办法确定主键,或者明确的用哪个字段来查询。因为每个字段都有可能有来查询,group by 之类的,不同SQL查询的列不一样,这样的话,用tiflash可以优化吗?

是说 SQL 的文本是好几百行对吧?这样的话 tiflash 可能效果不大,后面的字段不确定不是问题,SQL 文本太复杂,可能就不会走 tiflash

是的,SQL文本好几百行

还想请教个问题,我们Spark写Hive这块,一般就是在spark.sql(insert overwrite select * from …) 这种方式,也就是在sparksql中直接insert overwrite。
image
有时也会将Spark.sql执行的结果,封装成DataFrame,然后缩减成5个左右的分区,然后用dataframe.write的方式,写到Hive。
image
写到Hive的数据量,一般在十几万行到几百万行之间。
请问Spark写Hive,如果想速度最快的话,有什么好的办法吗?

1、spark 这个不太清楚,不过倒是建议可以使用 tispark 来查询数据(如果你的数量很大的话)

我们一个SQL会涉及很多张表,但单表数据量最多2000w行。
1、我测试的几个大SQL,一般都是TiDB速度比TiSpark快,有些TiSpark运行起来会卡住,但TiDB运行起来没问题。这个情况正常吗?
2、请问我这种数据量,是不是用TiDB比TiSpark要好一些?

那就用 tidb吧,哪个快用哪个,这个没有确定答案

好的,谢谢

ok,将来 tispark 会合并到 tidb-server ,就不用纠结了,现在一般就用 tidb 就行,负载分析型的计算用 tispark

好的,谢谢

有问题可随时开帖

能否问下,大约什么时候TiSpark能合并到tidb-server?

1、这个目前还没有准确的时间,今年估计是够呛了

好的,谢谢

请问TiSpark集成到tidb-server中,大致意思是会自动识别一个SQL,是TiDB快,还是TiSpark快,然后内部会自动选择快的那个执行吗?到时候SQL语法,用的是MySQL的语法,还是Spark的语法?

对的,都用 mysql 语法

请问你们现在有将Spark合并到TiDB的计划时间点吗?

没有计划哈~ 你可以考虑在 Github TiDB repo 上面提交这个需求请求,我们会跟进这个需求的进展。如果是是希望加快 AP 处理速度,可以考虑使用 TiDB + TiFlash,可以解决 HTAP 场景。