Qd-tree: Learning Data Layouts for Big Data Analytics论文阅读
Qd-tree: Learning Data Layouts for Big Data Analytics论文阅读
概要
现今数据分组无外乎按照时间分组或者根据选定字段进行范围/hash划分,但要是对于给定的workload进行查询,分组的状况往往不利于查询的快速展开,同时也牵扯到了查询的I/O成本,例如:
对于blocks数据分布如图所示,在这里如果我去查询用户root的数据,那么我需要扫描所有的两个块;然而,如果我可以将数据按照下图分布:
这时我可以只扫描第一个block,而跳过第二个block。
基于这种思想,我们希望用查询驱动(query-driven)的方法来划分数据blocks。比如我们想要查询一个数据的标签为(cpu = 95%, mem = 10GB),那么根据下图建立的qd-tree,我们只需要查询B1,忽略其他三个blocks。
算法
划分算法如图
假设我们存在一系列历史查询记录:
a | b | c | |
---|---|---|---|
SELECT * FROM R WHERE | >5 | ||
SELECT * FROM R WHERE | >5 | >6 | |
SELECT * FROM R WHERE | >5 | >6 | >7 |
SELECT * FROM R WHERE | >6 | >7 | |
SELECT * FROM R WHERE | >7 | ||
SELECT * FROM R WHERE | >5 | >7 | |
SELECT * FROM R WHERE | >5 | ||
SELECT * FROM R WHERE | >7 | ||
SELECT * FROM R WHERE | >6 |
数据则如表:
a | b | c |
---|---|---|
1 | 2 | 3 |
11 | 2 | 3 |
1 | 7 | 3 |
1 | 2 | 5 |
1 | 12 | 8 |
10 | 20 | 30 |
1 | 2 | 13 |
11 | 2 | 21 |
8 | 9 | 3 |
4 | 13 | 1 |
1 | 6 | 10 |
6 | 2 | 3 |
1 | 2 | 3 |
1 | 8 | 8 |
9 | 7 | 8 |
3 | 6 | 9 |
1 | 8 | 4 |
4 | 2 | 10 |
为简单,只选择a>5,b>6,c>7三项,这三项划分为Candidate Cuts,块最小要保持为3个元组。
开始时a>5可以跳过12个元组,若以此为划分依据,根据历史查询记录评价为5×12=60;同理b>6评价为10×4=40;c>7评价为9×5=45,此时选择a>5来划分;
第二阶段,元组分为12和6两组。考虑a>5对于6节点和12节点的划分,由于划分后不能保证两个子节点均大于3,所以不再考虑;对12节点而言,b>6划分为7和5,评价为7×4+60=88,c>7划分为6和6,评价为6×5+60=90,因此12节点由c>7划分;6节点同理均被两者划分为3和3,评价分别为3×4+90=102和3×5+90=105,故而6节点选择c>7作为cuts;
第三阶段,a>5和c>7都不在符合评价标准,因此由b>6划分其中一个6节点。
最终结果如图: