欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

《HBase不睡觉》读书笔记初始HBase

程序员文章站 2022-03-01 22:01:57
《HBase不睡觉书》杨曦 著 清华大学出版社声明:如果我侵犯了您的权利,请联系我,我会删除文章目录1. HBase部署架构:Master服务器和RegionServer服务器1.1 Region是什么1.2 RegionServer是什么1.3 Master是什么2 HBase存储架构2.1 行键是什么2.2 列族2.4 单元格2.5 Region跟行的关系2.6 跟关系型数据库的对比1. HBase部署架构:Master服务器和RegionServer服务器一般一个HB...

《HBase不睡觉书》杨曦 著 清华大学出版社
声明:如果我侵犯了您的权利,请联系我,我会删除

1. HBase部署架构:Master服务器和RegionServer服务器

一般一个HBase集群有一个Master服务器和几个RegionServer服务 器。Master服务器负责维护表结构信息,实际的数据都存储在 RegionServer服务器上,如下图所示。

《HBase不睡觉》读书笔记初始HBase
RegionServer是直接负责存储数据的服务器。RegionServer保存的 表数据直接存储在Hadoop的HDFS上,架构如下图所示:
《HBase不睡觉》读书笔记初始HBase
  RegionServer非常依赖ZooKeeper服务,可以说没有ZooKeeper就没有HBase。ZooKeeper在HBase中扮演的角色类似一个管家。ZooKeeper管 理了HBase所有RegionServer的信息,包括具体的数据段存放在哪个 RegionServer上。
客户端每次与HBase连接,其实都是先与ZooKeeper通信,查询出哪 个RegionServer需要连接,然后再连接RegionServer。因此,以上的架
构又可以拓展成如下图所示的这样:
《HBase不睡觉》读书笔记初始HBase

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

1.1 Region是什么

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

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

1.2 RegionServer是什么

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

1.3 Master是什么

    客户端从 ZooKeeper获取了RegionServer 的地址后,会直接从RegionServer获取数据。其实不光是获取数据,包 括插入、删除等所有的数据操作都是直接操作RegionServer,而不需要 经过Master
    Master只负责各种协调工作(其实就是打杂),比如建表、删表、 移动Region、合并等操作。它们的共性就是需要跨RegionServer,这些 操作由哪个RegionServer来执行都不合适,所以HBase就将这些操作放 到了Master上了。
    这种结构的好处是大大降低了集群对Master的依赖。而Master节点 一般只有一个到两个,一旦宕机,如果集群对Master的依赖度很大,那 么就会产生单点故障问题。在HBase中,即使Master宕机了,集群依然 可以正常地运行,依然可以存储和删除数据。

2 HBase存储架构

  • 最基本的存储单位是列(column),一个列或者多个列形成一行(row)
  • 传统数据库是严格的行列对齐。比如这行有三个列a、b、c, 下一行肯定也有三个列a、b、c。而在HBase中,这一行有三个列a、b、 c,下一个行也许是有4个列a、e、f、g
  • 在HBase中,行跟行的列可以 完全不一样,这个行的数据跟另外一个行的数据也可以存储在不同的机 器上,甚至同一行内的列也可以存储在完全不同的机器上
  • 每个行(row)都拥有唯一的行键(row key)来标定这个行的唯一 性。
  • 每个列都有多个版本,多个版本的值存储在单元格(cell)中。
  • 若干个列又可以被归类为一个列族。
    综上所述,HBase的存储结构可以表示成如下图所示的结构:
    《HBase不睡觉》读书笔记初始HBase

2.1 行键是什么

  • rowkey完 全是由用户指定的一串不重复的字符串,
  • rowkey可是会直接决定这个row的存储位置的。
  • HBase中无法 根据某个column来排序,系统永远是根据rowkey来排序的。
  • 因此, rowkey就是决定row存储顺序的唯一凭证
  • 而这个排序也很简单:根据字典排序
  • 如果你插入HBase的时候,不小心用了之前已经存在的rowkey呢? 那你就会把之前存在的那个row更新掉
  • 之前已经存在的值呢? 会被放到这个单元格的历史记录里面,并不会丢掉,只是你需要带上版本参数才可以找到这个值。
  • 什么是单元格呢?
    一个列上可以存储多个版本的单元格。单元格就是数据存储的最小单元。

2.2 列族

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

  • 建表的时候是不需要制定列的,因为列是可变的,它非常灵活,唯 一需要确定的就是列族
  • 属性都是定义在列族上的:,表的很多属性,比如过期时间、数据块缓存以及是否压 缩等都是定义在列族上,同一个表里的不同列族可以有完全不同的属性配置,但是同一个列族内的所有列都会有相同的属性
  • 在HBase中一个列的名称前面总是带着它所属的列族。列名称的规 范是列族:列名,比如brother:age、brother:name、parent:age、parent:name。
  • 列族存在的意义是:HBase会把相同列族的列尽量放在同一台机器 上,所以说,如果想让某几个列被放到一起,你就给他们定义相同的列族。

提示
一个表要设置多少个列族比较合适?官方的建议是:越少越好,因 为HBase并不希望大家指定太多的列族。为什么?因为没有必要,虽 然HBase是分布式数据库,但是数据在同一台物理机上依然会加速数 据的查询过程。所以请根据实际需要来指定列族,列族太多会极大 程度地降低数据库性能;而且根据目前的HBase实现,列族定得太 多,容易出BUG。

2.4 单元格

    唯一确定一条结果的表达式应该是行键:列 族:列:版本号(rowkey:column family:column:version)。
    如果你不写版本号,HBase默认获取 最后一个版本的数据返 回给你。每个列或者单元格的值都被赋予一个 时间戳。这个时间戳默认是由系统制定的,也可以由用户显示指定。

2.5 Region跟行的关系

一个Region就是多个行的集合。在 Region中行的排序按照行键(rowkey)字典排序。

2.6 跟关系型数据库的对比

传统的关系型数据库的表结构如下图所示:
《HBase不睡觉》读书笔记初始HBase
其中每个行都是不可分割的,也就是说三个列必须在一起,而且要 被存储在同一台机器上,甚至是同一个文件里面。

HBase的表结构如下图所示:
《HBase不睡觉》读书笔记初始HBase
    HBase中的每一个行都是离散的。因为有列族的存在,所以一个行里面的不同列甚至被分配到了不同的服务器上。行的概念被减弱到只有一个抽象的存在。在实体上,把多个列标定为一个行的关键词是 rowkey,这也是行这个概念在HBase中的唯一体现。
    在HBase中,每一个存储语句都必须精确地写出数据是要被存储到哪个单元格,而单元格是由表:列族:行:列来定义的。

本文地址:https://blog.csdn.net/qq_45531729/article/details/110563938