按照时间逆序排序可以说是很多日志系统的硬指标。在延云YDB系统中,我们改变了传统的暴力排序方式,通过索引技术,可以超快对数据进行单列排序,不需要全表暴力扫描,这个技术我们称之为blockSort,目前支持tlong,tdouble,tint,tfloat四种数据类型。
由于blockSort是借助搜索的索引来实现的,所以,采用blockSort的排序,不需要暴力扫描,性能有大幅度的提升。
blockSort的排序,并非是预计算的方式,可以全表进行排序,也可以基于任意的过滤筛选条件进行过滤排序。
为此,我们针对spark sql与YDB在排序性能上做了一个比较性的测试
机器配置
一共虚拟出来,1台master,4台slave
其中slave机器的配置如下
4台slave是运行在两台24core,128G的物理机上的,我们在物理机上做的虚拟机,配置如下
注意,硬盘为SSD磁盘,不是普通的磁盘。
测试数据(100亿条,一共有两列数据)
tradetime:tlong类型
待测试的排序字段,高纬值(几乎没重复值),格式为为yyyyMMddHHmmss格式的随机时间,通过new Date(System.currentTimeMillis()-(long)(Math.random()*10000000000000l))来生成。
为0~1000之间的整数,用于验证筛选条件与排序结合的性能,本身不用于排序。
测试结果(时间单位为秒)
amtint 列筛选 |
筛选后 条数 |
排序 方式 |
ydb blocksort |
spark |
无筛选 |
100亿 |
降序 |
3.3 |
1118 |
升序 |
3.6 |
1085 |
||
100 TO 900 |
80亿 |
降序 |
1.5 |
1093 |
升序 |
1.3 |
1070 |
||
100 TO 600 |
50亿 |
降序 |
1.53 |
1104 |
升序 |
1.38 |
867 |
||
100 TO 200 |
10亿 |
降序 |
7.00 |
1115 |
升序 |
1.11 |
1131 |
||
100 TO 110 |
1亿 |
降序 |
2.1 |
1160 |
升序 |
3.44 |
1114 |
||
100 TO 101 |
0.1亿 |
降序 |
10.67 |
1089 |
升序 |
7.0 |
1110 |
测试过程
一、伪造数据
hadoop fs -mkdir -p /data/example/demo/blocksort_time/
hadoop fs -ls /data/example/demo/blocksort_time/
hadoop fs -rm -r /data/example/demo/blocksort_time/
hadoop fs -mkdir -p /data/example/demo/blocksort_time/
hadoop fs -ls /data/example/demo/blocksort_time/
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_1.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_2.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_3.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_4.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_5.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_6.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_7.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_8.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_9.txt &
hadoop jar ./lib/ydb-1.1.5-pg.jar cn.net.ycloud.ydb.server.reader.kafka.KafkaMakeBlockSortDataTime 1000000000 /data/example/demo/blocksort_time/2000_time_10.txt &
二、创建相关数据表
--###创建文本表####
drop table blocksort_time_txt;
CREATE external table blocksort_time_txt(
tradetime bigint,