1. 为什么说交互式计算模式(interactive analysis)是界于MapReduce批处理计算和大内存计算之间的一个折衷解决方案?它主要依靠什么技术实现?
参考答案:以MapReduce为代表的批处理计算被证明是一种数据量大、性价比高、技术成熟的解决方案,但其计算延迟长(通常在数小时到数天的量级),不利于对时效要求高的在线实时分析类应用;以RAMCloud和SAP HANA为代表的内存计算模式处理速度快(通常在毫秒到秒量级),有利于实时智能分析,但系统硬件成本高,常需要专用硬件设备,与周边系统同步兼容性差。
以Google的Dremel为代表的交互式计算模式并非基于昂贵硬件平台的技术方案,而是运行在通用商业机器集群上,主要通过嵌套数据结构(nested data structure)、列存储(columnar storage)和查询树(query tree)等软件技术来实现Web规模数据查询性能的飞跃提升。因此,交互式计算模式可看作一种界于MapReduce批处理和内存计算之间的一个折衷方案,运行在廉价商业硬件平台上,通过特定的软件技术来实现超大规模数据的快速查询。
2. 什么是列存储结构(column-based storage structure)?为什么列存储结构的查询效率要远高于基于行存储结构(row-based storage structure)的关系型数据库?
参考答案:大多数需要存储的数据结构最后都可以表示为一张二维数据表,即数据表由多行(row)组成,而每一行包含多个值域(field)或字码段。多行数据的同一值域或字码段则构成一列(column)。
这个二维数据表存储时有两种方式:行存储(row-oriented storage)和列存储(column-oriented storage),如下图所示。行存储是以数据表的行键(RowKey)为基准、以数据记录(record)为单位进行存储,每一行数据包含了一个对象或事务的完整记录,每一行记录包含了多个值域(图左边r1和r2的不同颜色块表示不同的值域)。列存储则是将不同记录的相同值域(r1和r2的相同颜色块)放入一个列中存储,采用的是树状存储结构,如下图右边所示。
如果是行存储,在读取数据时(查找一条记录的某个值域)需要完成两个步骤:1)纵向按行键(RowKey)查找到该行;2)横向向右搜索,跳过不相关值域,直到找到查询项。这种存储方式使得每读一个RowKey后,都需要跳到下一个RowKey的位置,所有要搜索的字段都不是连续存放,且有些值域是变长度的字符串(repeated),不能通过简单公式计算得到地址,查询起来效率非常低。
而如果按列存储方式,只需按树状结构找到需要查询的列所在分支的首地址,然后顺序读取数据(每个record对应值域的地址飘移值(offset)都记录在元数据表中),而不需要扫描其他不相干的分支。列存储格式不仅实现简单,而且磁盘顺序读取比随机读取要快得多,而且更容易进行优化(比如把临近地址的数据预读到内存,对连续同类型数据进行压缩存放),因而查询效率大大提高。
3. Dremel将嵌套数据结构在实际存储时映射成一维存储结构,在计算过程中常常需要将内存中的一维存储结构恢复成原有的数据结构。Dremel是通过什么方法实现数据结构的无损表达(lossless representation)和高速组装(quick re-assembly)的?试简述之。
参考答案:Dremel采用了基于值域的列存储模式,即将数据记录基于值域拆分成多个列存储表,每个列存储表(仅包含一列或一个字码段)存储了多个记录的相同值域(字码段)的值,在物理存储时将多个列存储表进行一维顺序存储。
Dremel的列存储表中不光包含各记录的列值或字码段,还包含了其对应的r值(repetition level)和d值(definition level),r值和d值的定义参加书中14.2节。有了包含r值和d值的列存储表,Dremel可以对每个值域或字码段按照有限状态机(FSM)规则(图14-8)读取顺序存储的物理表并按14.2节所描述的数据重构方法进行原数据记录的重构。
每次对一维顺序存储的物理表进行扫描和数据记录重建时,Dremel并不需要扫描和重建全部数据,而可根据需要只扫描部分数据,重新组装感兴趣的值域(列)。
4. 根据第14章图14-11的Dremel查询树结构,说明为什么中间节点层(intermediate sever)的层次不宜太多(比如多于两层)?
参考答案:Dremel采用的是多层服务树(serving-tree)查询架构,如下图所示。最上层的根服务器(root server)接收所有的客户端查询请求,并把查询语句分解,读取相关元数据,再把分解后的请求下发中间服务器(intermediate server)。中间服务器进一步把查询需求分发到它所属的下级叶节点服务器(leaf server)完成并行计算。数据记录存储在叶节点服务器的本地文件系统上,叶节点完成计算处理后,其返回计算结果的过程与上述步骤逆向而行。
Dremel查询服务树的层级数可以人为设定。比如,一个有3000个叶子服务器节点的系统,可以是两层(1:3000),即一个根服务器和3000个叶子服务器;也可以设置成三层(1:100:3000),即在根服务器和底层叶子服务器之间增加100个中间服务器;如果选择两层,根服务器很容易成为计算瓶颈(所有的叶子服务器的请求汇集到根服务器)。而当服务树有三层时(增加一层中间节点),整个系统的并行度得到提高,执行性能也大大优化(约6倍左右);再多的中间层,比如三层以上,对于系统的性能提高并无太多帮助,反而使得系统软件结构过于复杂。
5. 从列存储结构和查询树并行模型的特点说明为什么交互式计算模式只适宜于数据查询业务,而不适宜于数据增删操作。
参考答案:列存储结构则是将不同记录的相同值域(如下图r1和r2记录的相同颜色块)放入一个列中存储,采用的是树状存储结构,如下图右边所示。这种树状列存储结构适合于快速查找记录的某个值域或字码段,因为不同记录的相同值域或字码段被存储在树状结构的某一叶节点分支内,只要快速找到这个叶节点,也就确定了所查询的值域或字码段的位置。
但这一存储结构并不利于数据库的增删操作。如果需要增加一条新记录,不同于行存储的只需要在二维表中增加一行(或是一维存储结构中增加一段空间),列存储需要一次找到该记录包含的各项值域(字码段)在树状存储结构中的各项分支并且嵌入到相关位置。这种遍历存储树结构的操作是一个非常耗时且高成本的操作。从列存储树结构中删掉一条完整记录的过程与上面相似,执行成本非常高。因此基于列存储结构的交互式计算模式只适宜于数据查询,而不适合于数据增删。



