BigTable学习

没有时间操作,这里其实这是整理下了网上的资料,稍微看了看没做别的什么。所以,有帮助,但效果不明显。

1)    BigTable

BigTable是Google 在GFS文件系统的基础上设计的一种分布式数据库系统。用户的应用程序将通过BigTable存储结构施作用于GFS文件系统,其工作流程等同于一般关系数据库和的文件系统。但与一般关系数据库不同的是BigTable采用多级映射的数据结构,支持大规模数据处理及存储、高容错性和自我管理等功能,可部署到上千台服务器,整个集群系统处理速度可达每秒数百万次读写操作。BigTable正在为Google六十多种产品和项目提供存储和获取结构化数据的支撑平台,其中包括GooglePrint,Orkut,GoogleMaps,GoogleEarth和Blogger等,在Google内部至少运行着500个BigTable集群。

²  BigTable数据模型

BigTable为客户提供简单数据模型,客户可以利用这个模型动态控制数据的分布式存储及其存储模式。此数据模型是一个稀疏的、分布式的、持久化存储的多维度排序Map。Map的索引是行关键字、列关键字及时间戳,Map的值是未经解析的字符串。

其中行关键字可以使用任意字符串,BigTable对行关键字的读写操作具有原子性, 将行关键字按字典顺序组织数据,表中的每行都可以动态分区,每个分区叫子表(tablet),子表是数据分布和负载均衡调整的最小单位,有效的提高数据访问时的效率。BigTable中列关键字组成的集合叫“列族”,列族是访问控制的最小单位,存放在同一列族下的所有数据通常属于同一类型。BigTable中不同版本的数据通过时间戳进行索引,可采用精确到毫秒的实时时间表示,也可由用户程序为时间戳赋值。

上图为Google存储网页的数据模型。图中行关键字为url的倒序:com.cnn.www,列关键字有网页内容content,网页对应不同索引文件:anchor:cnnis.com和my.look.ca三个组成。时间戳控制不同网页的时间或版本信息如:网页内容(content)的t3,t5,t6,新闻网页1(anchor:consi.com)的t9,新闻网页2(anchor:my.loot.ca)的t8为同一类信息的不同时间。用户读写BigTable中数据时,需要以上三个关键字共同定位数据才能访问到所需内容。

²  BigTable组件

BigTable包括三个主要的组件:连接到客户端的库,一个Master服务器和多个子表服务器。针对系统工作负载的变化情况,可以动态向集群中添加或者删除子表服务器。Master服务器的主要功能是为子表服务器分配子表,监测新加或者过时的子表服务器,对子表服务器提供负载均衡以及对保存在GFS上的文件进行垃圾收集等功能。客户端读取的数据不经过Master服务器,而是由客户程序直接和子表服务器通信进行读写操作,所以,Master服务器的负载很轻。子表服务器负责处理它所加载的所有子表的读写操作,以及在子表过大时,对其进行分割的操作,子表的大小一般维持在100-200mb之间。

 

²  BigTable文件存储及读写操作

BigTable子表存储采用多级映射结构,使用一个三层、类似B+树的结构存储子表的位置信息,如图所示。

第一层是一个存储在Chubby中的文件,包含了RootTablet的位置信息,RootTablet中包含MetaData表的第一个子表,此表包含MetaData中所有子表的位置信息。MetaData表中的每个子表都包含一个用户子表的集合,各子表的位置信息存储在行关键字中。

BigTable数据的存储分为两部分,最近的更新存储在memtable中,较早的更新则以SSTable的格式存储在GFS中,数据存储中后者为主体部分,是不可变的数据。写操作的内容插入到memtable中时,直到memtable的大小达到一个阀值时就会被冻结,创建出一个新的memtable,旧的数据则转为SSTable写入GFS。

BigTable进行读操作时为了恢复一个子表需综合考虑memtable和SSTable,子表服务器首先从MetaData中读取他的元数据,子表的元数据包含了组成这个子表的SSTable的列表,以及一系列的已提交的读写日志记录。子表服务器把SSTABLE的索引读进内存,通过重复读写日志提交的更新重建memtable。

对tablet服务器进行写操作时,tablet服务器首先读取chubby文件中的读写权限信息,检查这个操作发起者是否有执行权限,检查操作格式是否正确。成功的修改操作将被记录在提交日志中。BigTable采用批量提交的方式提高包含大量小修改操作的应用程序的吞吐量。一个写操作被提交后,待写的内容插入到memtable中;

²  BigTable读写操作的优化设计

BigTable对用户的读写操作做了多方面的优化措施。

²  局部性群组:允许客户端将多个列族组合成一个局部性群组,对子表中的每个局部性群组都生成一个单独的SSTable,将通常不会一起访问的列族分割成不同的局部性群组大大提高读取操作的效率;

²  采用“两遍”、可定制的压缩方式。压缩时以列族的方式组合数据,使得压缩数据中包含大量重复内容,压缩速度达100-200MB/S,解压速度达400-1000MB/S.压缩率达到10:1。大大节约了存储空间的同时,压缩解及压缩速度都令人非常满意;

²  子表服务器使用二级缓存策略。第一级缓存是扫描缓存,缓存子表服务器通过SSTABLE接口获取的map键值对,block缓存是第二级缓存是从GFS读取的SSTable的block,对于经常读取刚刚读过的数据附近的数据的应用程序,这两种缓存都能有效的减少I/O的读取操作;

²  定制Bloom过滤器。通过允许客户程序对特定局部性群组的SSTable制定Bloom过滤器减少硬盘的访问次数,使用Bloom过滤器查询一个SSTABLE是否包含特定行和列的数据,使用少量、用于存储Bloom过滤器的内存的代价,换取读操作显著减少的磁盘访问次数;

²  为每个子表服务器设置一个提交日志文件,把修改操作已追加方式写入同一个日志文件,避免日志文件的搜索及实现批量提交任务的效果。

²  提供两个日志的写入线程,应对单线程效率低得情况;利用SSTable的不变性而省掉文件系统访问操作的同步,实现高效的对行的并行操作,同时对内存采用COW (copy on write)机制,允许读写操作的并行执行。将永久被标记为“删除”的SSTable的数据转交Master服务器的垃圾回收服务处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值