![](https://csdnimg.cn/release/download_crawler_static/4371860/bg5.jpg)
存储在一个行关键字下的数据进行原子性的读-更新-写操作。虽然 Bigtable 提
供了一个允许用户跨行批量写入数据的接口,但 是,Bigtable 目前还不支持通
用的跨行事务处理。其次,Bigtable 允许把数据项用做整数计数器。最后,
Bigtable 允许用户在服务器的地 址空间内执行脚本程序。脚本程序使用 Google
开发的 Sawzall【28】数据处理语言。虽然目前我们基于的 Sawzall 语言的 API
函数还不允许 客户的脚本程序写入数据到 Bigtable,但是它允许多种形式的数
据转换、基于任意表达式的数据过滤、以及使用多种操作符的进行数据汇总。
Bigtable 可以和 MapReduce【12】一起使用,MapReduce 是 Google 开发的大规
模并行计算框架。我们已经开发了一些 Wrapper 类,通过使用这些 Wrapper 类,
Bigtable 可以作为 MapReduce 框架的输入和输出。
4 BigTable 构件
Bigtable 是建立在其它的几个 Google 基础构件上的。BigTable 使用 Google 的
分布式文件系统(GFS)【17】存储日志 文件和数据文件。BigTable 集群通常运
行在一个共享的机器池中,池中的机器还会运行其它的各种各样的分布式应用程
序,BigTable 的进程经常要 和其它应用的进程共享机器。BigTable 依赖集群管
理系统来调度任务、管理共享的机器上的资源、处理机器的故障、以及监视机器
的状态。
BigTable 内部存储数据的文件是 Google SSTable 格式的。SSTable 是一个持久
化的、排序的、不可更改的 Map 结构,而 Map 是一个 key-value 映射的数据结构,
key 和 value 的值都是任意的 Byte 串。可以对 SSTable 进行如下的操作:查询与
一个 key 值相关的 value,或者遍历某个 key 值范围内的所有的 key-value 对。
从内部看,SSTable 是一系列的数据块(通常每个块的大小是 64KB,这个大小是
可以配置的)。SSTable 使用块索引(通 常存储在 SSTable 的最后)来定位数据块;
在打开 SSTable 的时候,索引被加载到内存。每次查找都可以通过一次磁盘搜索
完成:首先使用二分查找法 在内存中的索引里找到数据块的位置,然后再从硬盘
读取相应的数据块。也可以选择把整个 SSTable 都放在内存中,这样就不必访问
硬盘了。
BigTable 还依赖一个高可用的、序列化的分布式锁服务组件,叫做 Chubby【8】。
一个 Chubby 服务包括了 5 个活动的副本,其中的一个副本被选为 Master, 并
且 处理请求。只有在大多数副本都是正常运行的,并且彼此之间能够互相通信
的情况下,Chubby 服务才是可用的。当有副本失效的时候,Chubby 使用 Paxos
算法【9,23】来保证副本的一致性。Chubby 提供了一个名字空间,里面包括了
目录和小文件。每个目录或者文件可以当成一个锁,读写文件的 操作都是原子
的。Chubby 客户程序库提供对 Chubby 文件的一致性缓存。每个 Chubby 客户程
序都维护一个与 Chubby 服务的会话。如果客户程 序不能在租约到期的时间内重
新签订会话的租约,这个会话就过期失效了
(alex 注:又用到了 lease。 原文
是:A client’s session expires if it is unable to renew its session lease
within the lease expiration time.)。
当一个会话失效时,它拥有的锁和打开