Kairbon'Blog.

Hbase学习1——从论文讲起(还没搞完)

字数统计: 2.3k阅读时长: 8 min
2021/08/15

1. 从论文讲起

Hbase是一款根据google bigtable论文实现的高性能分布式数据库。Google 的 Bigtable 的设计目的是可靠的处理 PB 级别的数据,并且能够部署到上千台机器上。Bigtable 已经实现了下面的几个目标:适用性广泛、可扩展、高性能和高可用性。

Bigtable 已经在超过 60 个 Google 的产品和项目上得到了应用,包括 Google Analytics、Google Finance、 Orkut、Personalized Search、Writely 和 Google Earth。这些产品对 Bigtable 提出了迥异的需求,有的需要高吞吐量的批处理,有的则需要及时响应,快速返回数据给最终用户。它们使用的 Bigtable 集群的配置也有很大的差异,有的集群只有几台Server,而有的则需要上千台Server、存储几百 TB 的数据。

1.1 数据模型

Bigtable 不支持完整的关系数据模型;与之相反,Bigtable 为客户提供了简单的数据模型,利用这个模型,客户可以动态控制数据的分布和格式,用户也可以自己推测底层存储数据的位置相关性(我的理解是你如果存储的是二叉树索引,根据字典序排序,因此相同前缀的key会聚集在一起,查询的时候利用这个特性可以更加灵活的调整以提高效率)。数据的下标是行和列的名字,名字可以是任意的字符串。

Bigtable 是一个稀疏的、分布式的、持久化存储的多维度排序 Map,因此本质上Hbase它其实是一个Map,Map的索引是行关键字、列关键字以及时间戳;Map 中的每个value都是一个未经解析的byte数组。

1
(row:string, column:string,time:int64)->string

Bigtable表中的行关键字可以是任意的字符串(目前支持最大 64KB 的字符串,但是对大多数用户,10-100 个字节就足够了)。**对同一个行关键字的读或者写操作都是原子的(不管读或者写这一行里多少个不同列)**,这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。Bigtable 通过行关键字的字典顺序来组织数据。表中的每个行都可以动态分区。每个分区叫做一个”Tablet”, Tablet 是数据分布和负载均衡调整的最小单位。

image-20210815134027991

这里的com.cnn.www是网址,也就是这行的索引,contents是基于时间戳t3,t5,t6存的网站内容,后面的anchor是应用这个网站的源网站。这个例子主要说明bigtable适合使用的场景。

1.1.1 列族

列关键字组成的集合叫做“列族“,列族是访问控制的基本单位。存放在同一列族下的所有数据通常都 属于同一个类型(我们可以把同一个列族下的数据压缩在一起)。列族在使用之前必须先创建,然后才能在列 族中任何的列关键字下存放数据;列族创建后,其中的任何一个列关键字下都可以存放数据。根据我们的设 计意图,一张表中的列族不能太多(最多几百个),并且列族在运行期间很少改变。与之相对应的,一张表可 以有无限多个列。

列关键字的命名语法如下:列族:限定词。 列族的名字必须是可打印的字符串,而限定词的名字可以是任意的字符串。比如,Webtable 有个列族 language,language 列族用来存放撰写网页的语言。我们在 language列族中只使用一个列关键字,用来存放每个网页的语言标识 ID。Webtable 中另一个有用的列族是 anchor;这 个列族的每一个列关键字代表一个锚链接,如图一所示。Anchor 列族的限定词是引用该网页的站点名;Anchor 列族每列的数据项存放的是链接文本。

访问控制、磁盘和内存的使用统计都是在列族层面进行的。在我们的 Webtable 的例子中,上述的控制权 限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。

1.1.2 时间戳

在 Bigtable 中,表的每一个数据项都可以包含同一份数据的不同版本;不同版本的数据通过时间戳来索引。Bigtable 时间戳的类型是 64 位整型。Bigtable 可以给时间戳赋值,用来表示精确到毫秒的“实时”时间; 用户程序也可以给时间戳赋值。如果应用程序需要避免数据版本冲突,那么它必须自己生成具有唯一性的时间戳。数据项中,不同版本的数据按照时间戳倒序排序,即最新的数据排在最前面。

为了减轻多个版本数据的管理负担,我们对每一个列族配有两个设置参数,Bigtable 通过这两个参数可以 对废弃版本的数据自动进行垃圾收集。用户可以指定只保存最后 n 个版本的数据,或者只保存“足够新”的 版本的数据(比如,只保存最近7天的内容写入的数据。

在 Webtable 的举例里,contents:列存储的时间戳信息是网络爬虫抓取一个页面的时间。内置的垃圾收集机制可以让我们只保留最近三个版本的网页数据。(用户可以自己配置)

1.2 架构

BigTable主要有几个部件:分布式锁,master server,tablet server,tablet

Bigtable 包括了三个主要的组件:链接到客户程序中的库、一个 Master Server和多个 Tablet Server。针对系统工作负载的变化情况,BigTable可以动态的向集群中添加(或者删除)Tablet Server。

Master Server主要负责以下工作:为 Tablet Server分配 Tablet、检测新加入的或者过期失效的 Table Server、对Tablet Server进行负载均衡、以及对保存在 GFS 上的文件进行垃圾收集。除此之外,它还处理对模式(scheme)的相关修改操作,例如建立表和列族。

每个Tablet Server都管理一个Tablet的集合(通常每个Server有大约数十个至上千个 Tablet)。每个Tablet Server负责处理它所加载的 Tablet 的读写操作,以及在 Tablets 过大时,对其进行分割。

和很多 Single-Master 类型的分布式存储系统类似,客户端读取的数据都不经过 Master Server: 客户程序直接和 Tablet Server通信进行读写操作。由于 BigTable 的客户程序不必通过 Master Server来获取 Tablet 的位置信息,因此,大多数客户程序甚至完全不需要和 Master Server通信。在实际应用中,Master 服务器的负载是很轻的。

一个BigTable集群存储了很多表,每个表包含了一个Tablet的集合,而每个Tablet包含了某个范围内的行的所有相关数据。初始状态下,一个表只有一个Tablet。随着表中数据的增长,它被自动分割成多个Tablet, 缺省情况下,每个 Tablet 的尺寸大约是 100MB 到 200MB。

Bigtable是建立在其它的几个Google基础构件上的。BigTable使用Google的分布式文件系统(GFS)存储日志文件和数据文件。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 都放在内存中,这样就不必访问硬盘了。

image-20210816222857022

CATALOG
  1. 1. 1. 从论文讲起
    1. 1.1. 1.1 数据模型
      1. 1.1.1. 1.1.1 列族
      2. 1.1.2. 1.1.2 时间戳
    2. 1.2. 1.2 架构