bigtable,mapreduce优势及缺点
Mapreduce,bigtable,gfs是google的三大技术基石。 Bigtable和与之支撑的Mapreduce技术则是google高性能搜索的主要工具。而开源后的HADOOP架构又为很多爱好者提供实践及修改的平台,老蒋认为BIGTABLE及HBase等半结构化分布式数据库为电信及大数据仓库及数据挖掘提供了很好的基础,其具体的实现相信在发布不久的中移动“大云” 上很快就可以看见,但与传统的数据库相比是不是可以完全超越还是有不能替代的东西,在这里老蒋做一个初步的甄别。首先理解一下分布式系统的数据结构和计算方法。
MapReduce是什么?
MapReduce基础出发点是很易懂的。它由称为map和reduce的两部分用户程序组成,然后利用框架在计算机集群上面根据需求运行多个程序实例来处理各个子任务,然后再对结果进行归并。
Map程序从输入流中读取一组“记录”,然后对记录进行需要的过滤或者转换,然后输出一组记录(key,data)。当map程序生成输出记录时,一个分 割方法将记录划分为M个不相交的块并赋予一个键值。这个分割方法一般是一个hash函数,只要这个决定性的函数能够满足就行。当一个块被填充后,它将写入 磁盘,map程序结束的时候每个块都将输出M个文件。
通常情况下,将有多个map的程序实例运行在计算机集群的不同的节点上。每个map实例都将由MapReduce调度程序分配一个不重复的输入文件来独立 执行。如果有N个节点参与map程序执行,那么N个节点中的每个节点都将有M个文件存储在各自的磁盘上,也就是说,总共将有N*M个文件。Fi,j, 1 ≤ i ≤ N, 1 ≤ j ≤ M.
其中有个值得注意的关键点是每个map实例都必须使用一个相同的hash方法。这样,所有的拥有相同hash值的输出记录才会写入相应的输出文件。
MapReduce的第二个阶段就是执行M个reduce的程序实例。Rj, 1 ≤ j ≤ M.每个reduce实例Rj的输入文件由文件 Fi,j组成,1 ≤ i ≤ N。还有一个值得注意的是:所有从map阶段输出的拥有相同hash值的记录,无论是哪个map实例生成的,都将由一个相同的reduce实例处理。在 map-reduce框架收集整理之后,所有的输入记录都将根据它们的键值(key)编组然后提供给reduce程序。跟map程序一样,reduce程 序也可以做任意的计算。所以,你可以对输入的记录做任何你想要的事情。举例来说,可能会对记录的别的字段进行一些附加的计算。每个reduce实例都可以 将记录写入输出文件,只要是MapReduce计算所需要的结果。
用SQL来做类比,map象聚合(aggregate)查询中的group-by子句。Reduce则类似计算group-by起来的行的聚合函数(例如求平均等)。
分布式结构化数据存储系统Bigtable
Bigtable是Google开发的基于GFS和Chubby的分布式存储系统。Google的很多数据,包括Web索引、卫星图像数据等在内的海量结构化和半结构化数据,都是存储在Bigtable中的。从实现上来看,Bigtable并没有什么全新的技术,但是如何选择合适的技术并将这些技术高效、巧妙地结合在一起恰恰是最大的难点。Google的工程师通过研究以及大量的实践,完美实现了相关技术的选择及融合。Bigtable在很多方面和数据库类似,但它并不是真正意义上的数据库。
Bigtable是一个分布式多维映射表,表中的数据是通过一个行关键字(Row Key)、一个列关键字(Column Key)以及一个时间戳(Time Stamp)进行索引的。Bigtable对存储在其中的数据不做任何解析,一律看做字符串,具体数据结构的实现需要用户自行处理。Bigtable的存储逻辑可以表示为:
(row:string, column:string, time:int64)→string
Bigtable数据的存储格式如图4所示。
分布式的数据库系统及并行计算方式有利于大规模的数据挖掘和数据统计,可以将以前电信的数据仓库的运算速度提供很多倍。但是分布式数据库及分布计算方法最大的问题是:
数据之间的关系约束没有
没有事务的支持 —— 支持并行更新以及从失败的更新中恢复
没有完整的视图 —— 底层逻辑数据描述可以改变但不需要重写程序
记录的字段和它的数据类型都记录在存储系统中。更重要的是,数据库 管理系统的运行时可以保证所有的记录都遵守结构描述。这是避免将垃圾数据添加到数据集中的最好的方法。MapReduce没有这样的方法,也没有避免将垃 圾数据添加到数据集中的控制。一个毁坏的数据集可以悄无声息的破坏整个使用这个数据集的MapReduce程序。
将数据描述与程序分离也很关键。如果开发者想在一个数据集上开发一个新的程序,他必须先去了解记录结构。在现代数据库管理系统中,结构描述存储在系统目录 中,而且可以被用户用SQL查询来了解它的结构。与此相反的是,如果数据描述不存在,或者隐藏在程序之中,开发者要了解这个数据结构必须通过检查原有的代 码。这个工作不仅仅是非常沉闷的,而且开发者必须先找到这个程序的源代码。如果没有相应的结构描述存在,后面的这个沉闷的问题将在所有的 MapReduce程序中存在。
最新评论及回复