Hbase入门与安装

Apache Hbase

1.概述

HBase 是建立在 hadoop hdfs 之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的nosql 数据库

支持通过主键 Row key 来检索数据

不支持 SQL 语句的查询;
不支持 join 等复杂操作;
不支持复杂的事务,

HBase 中支持的数据类型:byte[]。

与 hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

hdfs 是分布式文件存储系统,擅长一次写入,多次读取。

hbase 适合做实时的增删改查。

hbase 数据都是保存在 hdfs 上面的,但 hdfs 又不适合做实时的增删改查的操作,他们之间是如何协作的?

2 . Hbase 和 和 Hadoop  关系 、RDBMS  对比 

Hbase 和 和 Hadoop  关系

hbase 依赖于 hadoop hdfs,因为 hbase 的表数据最终都是存储在 hdfs 上面的。与 hadoop 的关系:紧耦合依赖关系。

此外 hbase 还需要依赖于 zookeeper,用于一些元数据的存储。所以也需要提前启动 zookeeper 集群,并且保证服务是正常的。

 Hbase 和 和 RDBMS  对比

RDBMS 关系型数据库,最大的特点就是支持事务操作。

hbase 被称之为 nosql 非关系型数据库,hbase 不支持事务(准确来说不支持连续操作多条数据的事务性), hbase 仅支持单条数据操作的事务性。

操作 hbase 当中一条数据,要么成功,要么失败,所以 hbase 支持的是行级别事务。hbase 不支持多张表 join 操作,不支持 sql 语句的查询。

3 . Hbase特性

海量存储
Hbase 适合存储 PB 级别的海量数据,在 PB 级别的数据以及采用廉价 PC 存储的情况下,能在几十到百毫秒内返回数据。这与 Hbase 的极易扩展性息息相关。
正式因为 Hbase 良好的扩展性,才为海量数据的存储提供了便利。
列式存储
这里的列式存储其实说的是列族存储,Hbase 是根据列族来存储数据的。列族下面可以有非常多的列.列族在创建表的时候就必须指定。
极易扩展
Hbase 的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
通过横向添加 RegionSever 的机器,进行水平扩展,提升 Hbase 上层的处理能力,提升 Hbsae 服务更多 Region 的能力。
高并发
由于目前大部分使用 Hbase 的架构,都是采用的廉价 PC,因此单个 IO 的延迟其实并不小,一般在几十到上百 ms 之间。这里说的高并发,主要是在并发的情况下,Hbase 的单个 IO 延迟下降并不多。能获得高并发、低延迟的服务。
稀疏
稀疏主要是针对 Hbase 列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

 4 . Hbase 数据模型

命名空间(namespace )
命名空间是对表的逻辑分组,不同的命名空间类似于关系型数据库中的不同的 Database 数据库。利用命名空间,在多租户场景下可做到更好的资源和数据隔离。
表(table )
对应于关系型数据库中的一张张表,HBase 以“表”为单位组织数据,表由多行组成。
行(row )
行由一个 y RowKey 和多个列族组成,一个行有一个 RowKey,用来唯一标示。
列族(Column Family )
每一行由若干列族组成,每个列族下可包含多个列。可以理解为一组列的集合。注意:物理上,同一列族的数据存储在一起的。HBase 官方建议尽量的减少列族的数量。
列限定符(Column Qualifier )
列由列族和列限定符唯一指定。
单元格(cell )
单元格由 RowKey、列族、列限定符唯一定位,单元格之中存放一个值(Value)和一个版本号。
时间戳(timestamp )
单元格内不同版本的值按时间倒序排列,最新的数据排在最前面。

5. Hbase 表的特点

数据规模大
单表可容纳数十亿行,上百万列。这种数据规模在 mysql 中是难以想象的。
无模式
不像关系型数据库有严格的 Scheme,每行可以有任意多的列,列可以动态增加,不同行可以有不同的列,列的类型没有限制。
稀疏
值为空的列不占存储空间,表可以非常稀疏,但实际存储时,能进行压缩。
数据多版本
利用时间戳来标识版本数据。一个列所对应的值可以存储多个版本。
数据无类型
所有数据以字节数据形式存储。 

 6. Hbase基本架构

Hbase入门与安装

Hbase 是一个 主从架构的集群

主角色叫做 HMaster,从角色叫做HRegionserver。部署的时候可以一主多从,也可以多主多从形成高可用机制。 

1.hbase  组成部分
1.1HMaster
  HMaster  节点是 H Hb be ase  集群的主角色,主要职责如下:
  对于 表的操作  DDL:create, delete, alter
  对于 RegionServer 的操作:分配 regions 到每个 RegionServer,监控每个RegionServer 的状态,负载均衡和故障转          移。
1.2HRegionServer
  HRegionServer  节点是 H Hb be ase  集群的从角色, 直接对接用户的读写请求,主要职责如下:
对于 数据的操作  DML:get, put, delete;
对于 Region 的操作:splitRegion、compactRegion。 

1.3 zookeeper
  HBase 通过 Zookeeper 来做 master 的高可用、RegionServer 的监控、元数据的入口以及集群配置的维护等工作。具体工作如下:
  通过 Zoopkeeper 来保证集群中只有1个master 在运行,如果master 异常,会通过竞争机制产生新的 master 提供服务;
  通过 Zoopkeeper 来监控 RegionServer 的状态,当 RegionSevrer 有异常的时候,通过回调的形式通知 Master RegionServer 上下线的信息;
  通过Zoopkeeper 存储元数据的统一入口地址.

 7. Hbase内部核心组件

2.1Region
Hbase 表的分片,HBase 表会根据 RowKey 值被切分成不同的 region 存储在RegionServer 中,在一个 RegionServer 中可以有多个不同的 region。
2.2Write-Ahead logs (简称 WAL )
HBase 的修改记录,也称之为预写日志。当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead log 的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。实现 WAL  的类叫做 HLog。
2.3Store
HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。
2.4MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL 中之后,RegsionServer 会在内存中存储键值对。
2.5HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile 是以 Hfile 的形式存储在 HDFS 的。

8. Hbase集群搭建

搭建hadoop集群zookeeper集群

HBase强依赖zookeeper和hadoop,安装HBase之前一定要保证zookeeper和hadoop启动成功,且服务正常运行。

  • 下载安装包

所有关于CDH版本的软件包下载地址如下

http://archive.cloudera.com/cdh5/cdh/5/

HBase对应的版本下载地址如下

http://archive.cloudera.com/cdh5/cdh/5/hbase-1.2.0-cdh5.14.0.tar.gz

  • 上传解压安装包

上传hbase安装包到node-1服务器的/export/servers路径下并解压

cd /export/servers/

tar zxvf hbase-1.2.0-cdh5.14.0.tar.gz

  • 修改配置文件hbase-env.sh

导入java路径,禁止HBase使用自带的zookeeper

cd /export/servers/hbase-1.2.0-cdh5.14.0/conf

vim hbase-env.sh

export JAVA_HOME=/export/servers/jdk1.8.0_65

export HBASE_MANAGES_ZK=false

  • 修改配置文件hbase-site.xml

vim hbase-site.xml

<configuration>

        <property>

                <name>hbase.rootdir</name>

                <value>hdfs://node-1:9000/hbase</value>  

        </property>

 

        <property>

                <name>hbase.cluster.distributed</name>

                <value>true</value>

        </property>

 

   <!-- 0.98后的新变动,之前版本没有.port,默认端口为60000 -->

        <property>

                <name>hbase.master.port</name>

                <value>16000</value>

        </property>

 

        <property>

                <name>hbase.zookeeper.quorum</name>

                <value>node-1:2181,node-2:2181,node-3:2181</value>

        </property>

 

        <property>

                <name>hbase.zookeeper.property.dataDir</name>

                <value>/export/data/zkdata</value>

        </property>

</configuration>

  • 修改regionservers

vim regionservers

node-1

node-2

node-3

  • 发送安装包到其他节点

cd /export/servers/

scp -r hbase-1.2.0-cdh5.14.0/ node-2:$PWD

scp -r hbase-1.2.0-cdh5.14.0/ node-3:$PWD

  • 三台机器创建依赖链接

因为hbase需要读取hadoop的core-site.xml以及hdfs-site.xml当中的配置文件信息,所以三台机器都要执行以下命令创建软连接。

ln -s /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/core-site.xml /export/servers/hbase-1.2.0-cdh5.14.0/conf/core-site.xml

ln -s /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml /export/servers/hbase-1.2.0-cdh5.14.0/conf/hdfs-site.xml

  • 配置hbase环境变量

vim /etc/profile

export HBASE_HOME=/export/servers/hbase-1.2.0-cdh5.14.0

export PATH=:$HBASE_HOME/bin:$PATH

source /etc/profile

  • 一键脚本启动

第一台机器执行以下命令进行启动

start-hbase.sh

警告提示:HBase启动的时候会产生一个警告,这是因为jdk7与jdk8的问题导致的,如果linux服务器安装jdk8就会产生这样的一个警告

我们可以在所有机器的hbase-env.sh当中注释掉以下参数:

“HBASE_MASTER_OPTS”和“HBASE_REGIONSERVER_OPTS”配置,来解决这个问题。不过警告不影响我们正常运行,可以不用解决。

  • 单节点逐个启动

启动HMaster命令

bin/hbase-daemon.sh start master

启动HRegionServer命令

bin/hbase-daemon.sh start regionserver

  • hbase web 页面

浏览器页面访问

http://node-1:60010/master-status