Friday, September 16, 2011

并行数据库 VS. Hadoop Map/Reduce

并行数据库与Hadoop Map/Reduce是目前流行的两种规模数据处理的系统。知名数据库学者Stonebraker在论文[1]中对两种系统进行了比较。笔者根据自己的理解与体会,总结两种系统的差异如下:

1. 着重处理的数据类型不同
传统的数据库技术着重处理的是结构型的数据(关系表)。设计良好的关系模式(比如3范式)对一个数据库应用相当重要。而Map/Reduce更多处理的是无结构的数据(比如文本数据),数据被映射成<key, value>的二元结构,不存在模式需要根据应用而改变的问题。
注意:虽然数据库也可以用Blob字段存取无结构化数据,但归根到底数据是以表的形式进行存储的。

2. 用户的接口不同
SQL语言是数据库给用户提供的主要接口,SQL语言是一种阐述型(Declarative)语言,而不是一种过程型语言。用户只通过SQL描述关系表之间的逻辑操作,而由查询优化器产生最终的物理存取路径。Map/Reduce与之相反,程序员需要编写相应的Mapper实现类和Reducer实现类,用程序实现相应的应用逻辑。
注意:基于Hadoop实现类似SQL的高级语言是Hadoop社区正在进行的项目,比如Pig和Hive.

3. 存储模型的不同
数据库的储存对象是关系表(或者是列,如果是Columnar数据库),为了加速查找,表上可以建各种索引,如B+树,Hash索引,Bitmap索引,R树索引等。Map/Reduce的存储基于HDFS,以文件为接口,在Name节点上保存文件的元数据信息,文件分块存储在不同的数据节点上。

4. 数据分布(Data Distribution)不同
并行数据库的数据分布一般有Hash和Duplication两种方式。Hash分布就是根据关系表指定的Distribution Key为分一个元组计算一个Hash值,然后在将Hash值映射到某一个执行节点进行存储,系统中常常需要维护一个HashMap来记录Hash值与节点之间的映射关系。Duplication分布就是复制元组到每一个执行节点。HDFS的数据分布主要由Name节点进行分配,在Name节点保存有文件如何分布于各个数据节点的信息。Name节点相当于系统中的中心控制节点。比较而言,并行数据库不存在单点失败的问题,但系统在线增加和删除节点也变得复杂,需要做数据的重新分布(Redistribution),可能影响到系统中许多执行节点;而Hadoop存在单点失败的问题,但系统增加和删除节点比较容易,如果将源数据组织成一个类似B+树的节点,相当于只需要做节点的分裂或者合并,而且系统的负载均衡也比较容易做。

5. 执行方式不同
并行数据库采取的执行方式是推(Push)的方式,由查询引擎生成查询计划,然后将查询计划分步分发到各个执行节点进行执行。采用这种执行方式的假设是认为传输代码总比传输数据有效,将代码传输到数据所在的节点进行执行。而Map/Reduce采取的执行方式是托(Pull)的方式,由执行节点主动向JobTracker申请Task,如果数据不在执行节点,需要同时传输数据。这样的做法看起来似乎低效,但Hadoop假设系统中的节点的不稳定的,如果节点失败,Hadoop可以很容易地实现Fail over,由于各个执行节点根据自己当前的负载申请Task,因此系统的负载更为均衡,不会出现由于数据skew造成的负载不均衡。

6. 故障恢复不同
在分布式系统中预防节点失败的方式是数据复制(Replication)。并行数据库可以复制原始表数据于多个节点上,但不会复制中间结果,而且Pipeline的执行方式试图减少中间结果的产生,因此如果一个在运行时间很长的Query中间出现节点失败,并行数据库的做法基本需要重新执行这个Query。而在Map/Reduce中,输入数据被切割成多个splits,每个splits对应一个Mapper task,因此如果在Map节点出现故障,只需要重做相应那个Splits的Mapper Task就可以;如果在Reducer阶段出现故障,由于Mapping和Data Resuffling中间结果都被存储下来,因此也可以只重做相应的Reducer Task就可以了。从这个意义上,Hadoop提供了更高的故障恢复机制。

7. 事务支持
数据库对事务的支持无疑的比较复杂以及完整的。比较而言,Hadoop对事务的支持是比较有限的,文件的操作也以Append为主,Hadoop的主要应用场景还是分析型的应用,并不支持以更新为主的操作。

综上所述,并行数据库与Hadoop各有所长,各有所短。许多数据库厂商都在研究如何将Hadoop集成到并行数据库中(笔者将在今后的Blog讨论这一主题),而Hadoop社区也在研究如何基于Hadoop开发类似SQL的高级语言,使Hadoop不光面向程序言,而面向用户。两大阵营将来如何结合,让我们拭目以待。

参考文献:
[1] A Comparison of Approaches to Large-Scale Data Analysis. Michael Stonebraker etc. SIGMOD 2009.

No comments:

Post a Comment