【详述】相同资源条件下对查询得到的结果表落盘,StarRocks的性能不如Spark-SQL
StarRocks操作:CREATE TABLE table_b AS SELECT * FROM table_a;
Spark-SQL操作:先读取parquet文件转成DataFrame,然后创建temp view,再spark.sql(SELECT * FROM table_a)得到DataFrame,最后写入parquet
【背景】两种查询引擎的性能验证
【业务影响】不能满足业务对实时性的要求
【是否存算分离】否
【StarRocks版本】3.1.4
【集群规模】1fe+3be(fe与be混部)
【机器信息】三台机器,每台配置:16核+64G内存
【附件】
表table_a的行数是千万级
Spark-SQL耗时:5秒
StarRocks耗时:15秒
您好,最终查询的SQL是怎样的?
SELECT * FROM table_a;
table_a有多少数据量要跑15秒?
5千万条
取12个字段
直接在client里查询返回,受限于mysql-client的接受处理能力是很慢的,你可以试试把这种大数据集的查询结果导出到文件里,速度会快一些
或者可以试试select into outfile
回复到另一个帖子去了,关于大数据量的问题,我们尝试过返回limit 10, 不做大数据量的返回,但是对比结果还是StarRocks无优势
将结果导出到文件,字段的类型很受限:
1.这是导出到CSV的报错,ERROR 1064 (HY000): Getting analyzing error. Detail message: Type ARRAY<struct<RsrpRslt bigint(20), RsrqRslt decimal128(38, 9), SinrRslt decimal128(38, 9), SsbBeamID int(11), SsbIndex int(11)>> is not supported for CSV outfile.
2.这是导出到parquet的报错:ERROR 1064 (HY000): Getting analyzing error. Detail message: Type LARGEINT is not supported for PARQUET outfile.
sr里SELECT * FROM table_b limit 10不可能慢,肯定是毫秒级
或者可以给个建议吗,我们的场景是:一个微服务处理了parquet后,经过sql查询,得到的结果,怎么给另一个微服务用。是写入到hdfs还是内部表,哪种方式落盘最快?
写内部表落盘快,但还要看另一个微服务怎么使用这么大的一个结果集,也是全量读的话内部还需要再导出来快一些,直接select *会慢。
另外落盘starrocks的话还可以使用单副本写的功能加速,https://docs.starrocks.io/zh/docs/3.1/sql-reference/sql-statements/data-definition/CREATE_TABLE/#指定数据在多副本间的写入和同步方式
下游微服务是通过mysql直接读取SR的内部表
如果下游就是普通的点查或者范围查、计算等,而非全量读的话,可以直接落盘sr里,使用单副本写加速写入
我们用的是3.1.4的版本,默认开启了单副本写加速,但对比下来,落盘速度不及Spark-SQL,是SR本身在落盘方面不擅长吗?
sr里写入是事务操作,会有额外的开销。不过你写入多少数据用了15秒?
6.7千万条数据,12个字段,SR耗时15秒,Spark-SQL耗时5秒