Loading

HBase 学习

HBase 基本概念

HBase 的存储是基于 Hadoop 的。Hadoop 实现了一个分布式文件系统(HDFS)。HDFS 有高容错性的特点,被设计用来部署在低廉的硬件上,而且它提供高吞吐量以访问应用程序的数据,适合那些有着超大数据集的应用程序。基于 Hadoop 意味着 HBase 与生俱来的超强的扩展性和吞吐量。

HBase 采⽤的是Key/Value 的存储⽅式,这意味着,即使随着数据量增⼤,也⼏乎不会导致查询的性能下降。HBase 又是⼀个列式数据库(对⽐于传统的⾏式数据库⽽⾔)

当你的表字段很多的时候,你甚⾄可以把其中⼏个字段放在集群的⼀部分机器上,⽽另外⼏个字段放到 另外⼀部分机器上,充分分散了负载压⼒。然⽽,如此复杂的存储结构和分布式的存储⽅式带来的代价就是:哪怕只是存储少量数据,它也不会很快。

建议使用HBase的情况是:

  • 单表数据量超千万,⽽且并发还挺⾼。
  • 数据分析需求较弱,或者不需要那么灵活或者实时。

HBase 的部署架构

从 HBase 的部署架构上来说,HBase 有两种服务器:Master 服务器和 RegionServer 服务器。⼀般⼀个 HBase 集群有⼀个 Master 服务器和⼏个 RegionServer 服务器。Master 服务器负责维护表结构信息,实际的数据都存储在 RegionServer 服务器上。
image

HBase 有⼀点很特殊:客户端获取数据由客户端直连 RegionServer 的,所以Master挂掉之后依然可以查询数据,但就是不能新建表了。

RegionServer 是直接负责存储数据的服务器。RegionServer 保存的表数据直接存储在 Hadoop的HDFS上

image

RegionServer ⾮常依赖 ZooKeeper 服务,可以说没有 ZoOKeeper 就没有HBase。 ZooKeeper在 HBase 中扮演的⾓⾊类似⼀个管家。ZooKeeper 管理了 HBase 所有 RegionServer 的信息,包括具体的数据段存放在哪个 RegionServer 上。客户端每次与HBase 连接,其实都是先与 ZooKeeper 通信,查询出哪个 RegionServer 需 要连接,然后再连接 RegionServer。因此,以上的架构又可以拓展成
image

Region 是什么

Region 就是⼀段数据的集合。HBase 中的表⼀般拥有⼀个到多个 Region。Region 有以下特性:

  • Region 不能跨服务器,⼀个 RegionServer 上有⼀个或者多个 Region。
  • 数据量⼩的时候,⼀个Region⾜以存储所有数据;但是,当数据量⼤的时候,HBase 会拆分 Region。
  • 当HBase 在进⾏负载均衡的时候,也有可能会从⼀台 RegionServer 上把 Region 移动 到另⼀台 RegionServer 上。
  • Region 是基于 HDFS 的,它的所有数据存取操作都是调⽤了 HDFS 的客户端接⼜来实现的。

RegionServer 是什么

RegionServer 就是存放 Region 的容器,直观上说就是服务器上的⼀个服务。⼀般来说,⼀个服务器只会安装⼀个 RegionServer 服务,不过你实在想在⼀个服务器上装多个RegionServer 服务也不是不可以。当客户端从 ZooKeeper 获取 RegionServer 的地址后,它会直接从 RegionServer 获取数据。

Master 是什么

Master 只负责各种协调⼯作(其实就是打杂),⽐如建表、删表、移动 Region、合并等 操作。它们的共性就是需要跨 RegionServer,这些操作由哪个 RegionServer 来执⾏都不合适,所以 HBase 就将这些操作放到了 Master 上了。这种结构的好处是⼤⼤降低了集群对 Master 的依赖。⽽ Master 节点⼀般只有⼀个到两个,⼀旦宕机,如果集群对 Master 的依赖度很⼤,那么就会产⽣单点故障问题。在HBase 中,即使 Master 宕机了,集群依然可以正常地运⾏,依然可以存储和删除数据。

存储架构

最基本的存储单位是列(column),⼀个列或者多个列形成⼀⾏(row)。传统数据库是严格的⾏列对齐。⽐如这⾏有三个列a、b、c,下⼀⾏肯定也有三个列a、b、c。⽽在HBase中,这⼀⾏有三个列a、b、c,下⼀个⾏也许是有4个列a、e、f、g。在HBase 中,⾏跟⾏的列可以完全不⼀样,这个⾏的数据跟另外⼀个⾏的数据也可以存储在不同的机器上,甚⾄同⼀ ⾏内的列也可以存储在完全不同的机器上!每个⾏(row)都拥有唯⼀的⾏键(row key)来标定这个⾏的唯⼀性。每个列都有多个 版本,多个版本的值存储在单元格(cell)中。若⼲个列又可以被归类为⼀个列族。

image

行键

这个 rowkey 完全是由用户指定的⼀串不重复的字符串,这个指定的 row key是会直接决定这个row的存储位置的。HBase 中⽆法根据某个 column 来排序,系统永远是根据rowkey 来排序的。因
此,rowkey 就是决定 row 存储顺序的唯⼀凭证。⽽这个排序也很简单:根据字典排序。

如果在插入 HBase 的时候,使用了已存在的 rowkey,那么新的记录会把旧的记录更新掉,之前存在的值将会放到这个单元格的历史记录中,需要带上版本参数才能找到这个值。

⼀个列上可以存储多个版本的单元格。单元格就是数据存储的最⼩单元。

列族

在HBase 中,若⼲列可以组成列族(column family)。

建表的时候是不需要制定列的,因为列是可变的,它⾮常灵活,唯⼀需要确定的就是列族。 这就是为什么说⼀个表有⼏个列族是⼀开始就定好的。此外,表的很多属性,⽐如过期时间、 数据块缓存以及是否压缩等都是定义在列族上,⽽不是定义在表上或者列上。这⼀点做法跟以往的数据库有很⼤的区别。同⼀个表⾥的不同列族可以有完全不同的属性配置,但是同⼀个列族内的所有列都会有相同的属性,因为他们都在⼀个列族⾥⾯,⽽属性都是定义在列族上的。⼀个没有列族的表是没有意义的,因为列必须依赖列族⽽存在。

在HBase 中⼀个列的名称前⾯总是带着它所属的列族。列名称的规范是列族:列名,⽐如brother:age、brother:name、parent:age、parent:name。

列族存在的意义是:HBase 会把相同列族的列尽量放在同⼀台机器上,所以说,如果想让某⼏个列被放到⼀起,你就给他们定义相同的列族。

⼀个表要设置多少个列族⽐较合适?官⽅的建议是:越少越好,因为 HBase 并不希望⼤家指定太多的列族。为什么?因为没有必要,虽然 HBase 是分布式数据库,但是数据在同⼀台物理机上依然会加速数据的查询过程。所以请根据实际需要来指定列族,列族太多会极⼤程度地降低数据库性能;

Region 与行的关系

⼀个 Region 就是多个⾏的集合。在Region 中⾏的排序按照⾏键排序

与传统的关系型数据库对比

传统关系型数据库,其中每个⾏都是不可分割的,也就是说三个列必须在⼀起,⽽且要被存储在同⼀台机器上, 甚⾄是同⼀个⽂件⾥⾯。

image

HBase,HBase 中的每⼀个⾏都是离散的。因为有列族的存在,所以⼀个⾏⾥⾯的不同列甚⾄被分配到了不同的服务器上。⾏的概念被减弱到只有⼀个抽象的存在。在实体上,把多个列标定为⼀个⾏的关键词是 rowkey,这也是⾏这个概念在 HBase 中的唯⼀体现。在 HBase 中,每⼀个存储语句都必须精确地写出数据是要被存储到哪个单元格,⽽单元格是由表:列族:⾏:列来定义的。翻译过来就是你要精确地写出数据要被存储到哪个表的哪个列族的哪个⾏的哪个列。如果⼀⾏有10列,那存储⼀⾏的数据得写10⾏的语句;⽽在传统数据 库中存储语句(insert 语句)可以把整个⾏的数据⼀次性写在⾏语句⾥⾯。

image

posted @ 2024-03-27 23:30  Xianhao  阅读(9)  评论(0编辑  收藏  举报