当前位置: > > > HBase的介绍与安装教程1(基本介绍、系统架构说明)

HBase的介绍与安装教程1(基本介绍、系统架构说明)

一、基本介绍

1,基本介绍

(1)HBase 是一个分布式的、面向列的开源的 NoSQL 数据库。它是 Apache Hadoop 中的一个子项目,Hbase 依托于 HadoopHDFS 作为最基本存储基础单元。
    Hadoop 是这些年崛起的拥有着高性能,高稳定,可管理的大数据应用平台。其已经快变成大数据的代名词了。
    Hadoop 实现了一个分布式文件系统(HDFS)。HDFS 有高容错性的特点,被设计用来部署在地低廉的硬件上,而且它提供高吞吐量以访问应用程序的数据,适合那些有着超大数据集的应用程序。基于 Hadoop 意味着 HBase 与生俱来的扩展性和吞吐量。

(2)作为一种 NoSQL 数据库,HBase 不像传统的 RDBMS 数据库那样支持 SQL 作为查询语言,也缺少很多 RDBMS 系统的特性,比如列类型,辅助索引,触发器,和高级查询语言等等。不过 HBase 自生也有如下特性:
  • 强读写一致,但是不是“最终一致性”的数据存储,这使得它非常适合高速的计算聚合
  • 自动分片,通过 Region 分散在集群中,当行数增长的时候,Region 也会自动的切分和再分配
  • 自动的故障转移
  • Hadoop/HDFS 集成,和 HDFS 开箱即用,不用太麻烦的衔接
  • 丰富的“简洁,高效APIThrift/REST APIJava API
  • 块缓存,布隆过滤器,可以高效的列查询优化
  • 操作管理,Hbase 提供了内置的 web 界面来操作,还可以监控 JMX 指标

2,应用场景

  • 如果数据库量足够多,比如有十亿及百亿行数据,那么 Hbase 是一个很好的选项。在 百亿行 * 百万列 情况下,Hbase 查询可以做到百毫秒以内。
  • 如果单表数据量不超过千万(比如只有几百万行甚至不到的数据量),使用 MySQL 或者 Oracle 之类的产品会更加适合。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态。而且做数据分析时 RDBMS 也比 HBaseMapReduce 来的简单。

3,部署架构


(1)一般一个 HBase 集群有一个 Master 服务器和几个 RegionServer 服务:
  • Master 服务器负责维护表结构消息,可以控制 RegionServer 的故障转移和 Region 的切分。由于其不负责存储数据,因此 Master 挂掉之后我们依然可以查询 、存储、删除数据,但就是不能新建表了。
  • RegionServer 是直接负责存储数据的服务器(可理解为数据节点),RegionServer 保存的表数据直接存储在 HadoopHDFS 上。并且 RegionServer 要实时的向 Master 报告信息,Master 知道全局的 RegionServer 运行情况

(2)ZooKeeper 类似 HBase 中的管家,它管理了 HBase 所有 RegionServer 的信息,包括具体的数据端存放在哪个 RegionServer 上。
  • 客户端每次与 HBase 连接,其实都是先与 ZooKeeper 通信,查询出哪个 RegionServer 需要连接,然后在连接 RegionServer

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

附:存储架构

1,总体介绍

    HBase 的存储结构如下,HBase 最基本的单元是列(colume),一个列或者多个列形成一行。每个行(row)都拥有唯一的行键(row key)来标定这个行的唯一性。每个列都有多个版本,多个版本的值存储在单元格(cell)中。若干个列又可以被归类为一个列族。
与传统的关系型数据库对比:
  • 传统数据库是严格的行列对齐。比如这行有三列 abc,下行肯定也有三列 abc。其中每个行都是不可分割的,也就是说三个列必须在一起,而且要被存储在同一台机器上,甚至是同一个文件里面。
  • HBase 中行跟行的列可以完全不一样,比如这一行有三列 abc,下一个行也许是 4 aefg。并且这个行的数据跟另一个行的数据也可以存储在不同的机器上,甚至同一个行内的列也可以存储在完全不同的机器上。

2,行键(rowkey)

(1)rowkey 类似 MySQLOracle 中的主键,不过它是由用户指定的一串不重复的字符串,规则随我们定义。在 HBASE 内部,RowKey 保存为字节数组。
提示RowKey 可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes

(2)rowkey 决定这个 row 的存储位置。HBase 中无法根据某个 column 来排序,系统永远是根据 rowkey 来排序的,排序规则为:根据字典排序。因此设计 RowKey 时,要充分利用排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
(1)比如,以下三个 rowkey
  • row-1
  • row-2
  • row-11
(2)根据字典排序结果:
  • row-1
  • row-11
  • row-2

(3)访问 HBASE table 中的行,只有三种方式:
  • 通过单个 RowKey 访问
  • 通过 RowKeyrange(正则)
  • 全表扫描

(4)插入 HBase 的时候,如果用了之前已经存在的 rowkey 的话,会把之前存在的那个 row 更新掉。
提示:更新后之前存在的值并不会丢掉,而是会被放在这个单元格的历史记录里面,只是我们需要带上版本参数才可以找到这个值。

3,列族(column family)

(1)在 HBase 中,若干列可以组成列族。或者说表中的每个列,都归属于某个列族。
(2)建表的时候我们不需要指定列,因为列是可变的。但是一个表有几个列族必须一开始就定好。
(3)表的许多属性,比如过期时间、数据块缓存以及是否压缩等都定义在列族上,而不是定义在表或者列上。
(4)同一个表里的不同列族可以有完全不同的属性配置,但是同一个列族内的所有列都会有相同的属性。
(5)列名都以列族作为前缀。例如 courses:historycourses:math 都属于 courses 这个列族。
(6)列族存在的意义是:HBase 会把相同列族的列尽量放在同一台机器上。所以如果想让某几个列被放在一起,我们就要给他们定义相同的列族。
一个表的列族数量建议越少越好:
  • 因为虽然 HBase 是分布式数据库,但是数据在同一台物理机上依然会加速数据的查询过程。而列族太多会极大程度地降低数据库性能(不同列族列会更容易被分配到不同的服务器上)
  • 而且根据目前的 HBase 实现,列族定得太多,容易出 BUG

4,单元格(cell)

(1)虽然列已经是 HBase 的最基本单位,但一个列上可以存储多个版本的值,多个版本的值被存储在多个单元格里,多个版本之间用版本号(Version)来区分。
(2)唯一确认一条结果的表达式应该是“行键:列族:列:版本号”(rowkey:column family:column:version
版本号说明:
  • 确定单元时如果不写版本号,HBase 默认获取最后一个版本的数据返回。
  • 版本通过时间戳来索引。时间戳的类型是 64 位整型。这个时间戳默认由 Habse(在数据写入时自动)赋值,也可以有用户指定。
  • 每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
  • 为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE 提供了两种数据版本回收方式。一是保存数据的最后 n 个版本,二是保存最近一段时间内的版本(比如最近七天)。 用户可以针对每个列族进行设置。
评论0