本摘抄不保证论文完整性和理解准确性
背景
异构数据的适配及数据可扩展性,资源可扩展性,廉价机器,SQL查询。
架构概述
Worker pool,query server,clientinterfaces,metadata server
Worker线程是long-running的,worker pool包括master节点和worker节点,以及一个master watcher。
Query server把query解析,优化之后传给master执行,优化包括一些基本的规则优化和基于成本的优化。
SQL特性
SQL语法主要是SQL92,并增加了一些高级分析,增强的部分也是适合MR完全可并行化的。
内嵌了Sawzall语法,支持用户写的和Sawzall自带的方法。
在映射和过滤方面,
常量表达式在compile阶段就计算;
谓词是常数或者查找是常数范围,那么可以直接下推给Bigtable这样的数据源;
如果谓词不包含复杂的UDF,数据源是mysql这样的数据库,那么也下推给数据源;
如果是分区的,那么也会跳过其他分区数据;
根据ColumnIO的meta信息,跳过范围外的columns数据;
如果下面数据源是面向列的,那么Tenzing会跳过无关列。
聚合函数方面,
支持 sum,count,min,max,distinct,count distinct,
还支持统计型的corr,covar,stddev
在实现上加了一些额外优化,如在mapreduce里实现基于hash table的聚合。
Join方面,
Tenzing支持跨数据源的各种join方式。
Broadcast joins,基于成本的优化器会发现足够小的table,广播到内存里,让mapper和reducer可以直接内存访问到。还有几个细节的优化点。
Remote lookup joins,如Bigtable支持基于index的key查找,那么就可以实时。
Distributed sort-merge joins。
Distributer hash joins,适合两表都放不了内存,且一张表比另一张大许多,且在join的key上都没有索引的情况。具体实现和优化细节,见论文伪代码及说明,很清晰。
分析函数,
类似PostgreSQL/Oracle,支持rank,sum,min,max,lead,lag,ntile。
OLAP扩展,
支持rollup,cube。
集合操作,
支持标准sql集合操作,如union,union all,minus,minus all。
嵌套查询和子查询,
会优化mr个数
处理结构化数据,
根据pb协议,有的sql支持有的不行
Views,
支持create views
DML,
支持批模式下的insert,update,delete,不具备ACID性质。
DDL,
支持create table,drop table,rename table,generatestatistics,grant,revoke。
Table valued functions,
Data formats,
GFS, Bigtable, ColumnIO等
性能
性能目标是能与传统MPP数据库系统比较。
对mapreduce的优化和增强,
Work pool的设计,目的是减小latency,具体masterwatcher,master pool和worker pool的指责。
Streaming & In-memory chaining,MRs之间的数据衔接用流的方式;前一个mapper和后一个reducer可以在同一个进程里。
避免sort,一些hash join,hash聚合要shuffle,不要sort,增加了关闭sort开关。
块shuffle,原本基于row的shuffle是为了sort,在不需要sort的情况下,大约1M块的shuffle会高效3X倍。
本地执行,根据数据量大小(低于128M)决定可以本地执行。
LLVM Query Engine
一代引擎把sql翻译为Sawzall code
二代引擎是使用Dremel的sql表达式分析引擎
三代引擎尝试使用LLVM based row和vector based column
指出了一些优缺点,相信native codegeneration引擎是未来方向。
全文完 :)