设为首页 加入收藏

TOP

HBase简介、搭建环境及安装部署
2019-05-05 01:48:13 】 浏览:55
Tags:HBase 简介 搭建 环境 安装 部署

HBase简介

1、HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问,是Google的BigTable的开源实现。

2、HBase的目标是存储并处理大型的数据,更具体地说仅用普通的硬件配置,能够处理成千上万的行和列所组成的大型数据库。
3、HBase是一个开源的、分布式的、多版本的、面向列的存储模型。可以直接使用本地文件系统,也可使用Hadoop的HDFS文件存储系统。

为了提高数据的可靠性和系统的健壮性,并且发挥HBase处理大型数据的能力,还是使用HDFS作为文件存储系统更佳。

另外,HBase存储的是松散型数据,具体来说,HBase存储的数据介于映射(key/value)和关系型数据之间。如下图所示,HBase存储的数据从逻辑上看就是一张很大的表,并且它的数据列可以根据需要动态增加。每一个cell中的数据又可以有多个版本(通过时间戳来区别),从下图来看,HBase还具有 " 向下提供存储,向上提供运算 " 的特点。

HBase体系结构

HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion Server群HBase Master服务器构成。

HBase Master负责管理所有的HRegion Server,而HBase中的所有RegionServer都是通过ZooKeeper来协调,并处理HBase服务器运行期间可能遇到的错误。

HBase Master Server本身并不存储HBase中的任何数据,HBase逻辑上的表可能会被划分成多个Region,然后存储到HRegion Server群中。HBase Master Server中存储的是从数据到HRegion Server的映射。因此HBase体系结构如下图所示:

1 Client

HBase Client 使用HBase的RPC机制与HMaster和HRegionServer进行通信:对于管理类操作,Client与HMaster进行RPC;对于数据读写类操作,Client与HRegionServer进行RPC;

2 Zookeeper

Zookeeper Quorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到 Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的 单点问题;

3 HMaster

每台HRegionServer都会与HMaster进行通信,HMaster的主要任务就是要告诉每台HRegion Server它要维护哪些HRegion。
当一台新的HRegionServer登录到HMaster时,HMaster会告诉它等待分配数据。而当一台HRegion死机时,HMaster会把它负责的HRegion标记为未分配,然后再把它们分配到其他的HRegion Server中。
HBase已经解决了HMaster单点故障问题(SPFO),并且HBase中可以启动多个HMaster,那么它就能够通过Zookeeper来保证系统中总有一个Master在运行。HMaster在功能上主要负责Table和Region的管理工作,具体包括:

4 HRegion
当表的大小超过设置值得时候,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集。对用户来说,每个表是一堆数据的集合,靠主键来区分。从物理上来说,一张表被拆分成了多块,每一块就是一个HRegion。我们用表名+开始/结束主键来区分每一个HRegion,一个HRegion会保存一个表里面某段连续的数据,从开始主键到结束主键,一张完整的表格是保存在多个HRegion上面。

  • 管理用户对Table的增删改查操作
  • 管理HRegionServer的负载均衡,调整Region分布
  • 在Region Split后,负责新Region的分配
  • 在HRegionServer停机后,负责失效HRegionServer上的Region迁移

5 HRegionServer

HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。

HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个 Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。

HStore存储是HBase存储的核心,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。 MemStore是Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile), 当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要 进入内存中就可以立即返回,保证了HBase I/O的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前 Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上。

下图描述了Compaction和Split的过程:

理解上述HStore的基本原理之后,必须了解一下HLog的功能,因为上述的HStore在系统正常工作的前提下是没有问题的,但是在分布式系统环境中,无法避免系统出错或者宕机,一次一旦HRegion Server意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。每一个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中,HLog文件定期会滚动出新的,并删除旧的文件,当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应Region的目录下,然后再将失效的Region重新分配,领取到这些Region的HRegionServer在LoadRegion过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

6 HBase存储格式
HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,包括上述提到的两种文件类型:

  • HFile HBase中的KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级的包装,即StoreFile底层就是HFile。
  • HLogFile,HBase中WAL(Write Ahead Log)的存储格式,物理上是Hadoop的Sequence File

6.1 HFile

下图是HFile的存储格式:

首先HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。正如图中所示的,Trailer 中有指针指向其他数据块的起始点。File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index块记录了每个Data块和Meta块的起始点。

Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。 每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。后面会详细介绍每个KeyValue对的内部构造。

HFile里面的每个KeyValue对就是一个简单的byte数组。但是这个byte数组里面包含了很多项,并且有固定的结构。我们来看看里面的具体结构:

开始是两个固定长度的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey 的长度,紧接着是RowKey,然后是固定长度的数值,表示Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数 值,表示Time Stamp和Key Type(Put/Delete)。Value部分没有这么复杂的结构,就是纯粹的二进制数据了。

6.2 HLogFile

上图中示意了HLog文件的结构,其实HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。

HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue,可参见上文描述。

7 ROOT表和META表
用户表的Regions元数据被存储在.META.表中,随着Region的增多,.META.表中的数据也会增大,并分裂成多个Regions。为了定位.META.表中各个Regions的位置,把.META.表中的所有Regions的元数据保存在-ROOT-表中,最后由Zookeeper记录-ROOT-表的位置信息。所有客户端访问用户数据前,需要首先访问Zookeeper获得-ROOT-的位置,然后方位-ROOT-表获得.META.表的位置,最后根据.META.表中的信息确定用户数据存放的位置,-ROOT-表永远不会被分割,它只有一个Region,这样可以保证最多需要三次跳转就可以定位任意一个Region。为了加快访问速度,.META.表的Regions全部保存在内存中,如果.META.表中的每一行在内存中占大约1KB,且每个Region限制为128M,下图中的三层结构可以保存Regions的数目为(128M/1KB)*(128/1KB)=2^34个。

HBase安装

HBase的安装也有三种模式:单机模式、伪分布模式和完全分布式模式,在这里只介绍完全分布模式。前提是Hadoop集群和Zookeeper已经安装完毕,并能正确运行。
第一步:下载安装包,解压到合适位置,并将权限分配给安装用户(运行Hadoop的账户):

从Apache网站上(hbase.apache.org)下载HBase发布包: hbase-1.2.7-bin.tar.gz,通过上传软件上传至/usr/local/src目录;

解压软件包并移动至/opt/目录:(所有节点

cd /usr/local/src
tar -xzvf hbase-1.2.7-bin.tar.gz
mv ./hbase-1.2.7 /opt/hbase-2.0.0

第二步:配置相关的文件
(1)配置hbase-env.sh,该文件在/opt/hbase-2.0.0/conf

exportJAVA_HOME=/usr/java/default #Java安装路径
exportHBASE_CLASSPATH=/opt/hbase-1.2.7/conf#HBase类路径
exportHBASE_MANAGES_ZK=false #由HBase负责启动和关闭Zookeeper

(2)配置hbase-site.xml,该文件位于/opt/hbase-2.0.0/conf

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://namenode1:9000/hbase</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>slave01,slave02,slave03</value>
</property> 

(3)配置conf/regionservers

slave01
slave02
slave03

第三步运行测试

Distributed HBase Quickstart

See quickstart-fully-distributed for a walk-through of a simple three-node cluster configuration with multiple ZooKeeper, backup HMaster, and RegionServer instances.

Procedure: HDFS Client Configuration

  1. Of note, if you have made HDFS client configuration changes on your Hadoop cluster, such as configuration directives for HDFS clients, as opposed to server-side configurations, you must use one of the following methods to enable HBase to see and use these configuration changes:

    1. Add a pointer to your HADOOP_CONF_DIR to the HBASE_CLASSPATH environment variable in hbase-env.sh.

    2. Add a copy of hdfs-site.xml (or hadoop-site.xml) or, better, symlinks, under ${HBASE_HOME}/conf, or

    3. if only a small set of HDFS client configurations, add them to hbase-site.xml.

An example of such an HDFS client configuration is dfs.replication. If for example, you want to run with a replication factor of 5, HBase will create files with the default of 3 unless you do the above to make the configuration available to HBase.

根据官方说明,拷贝Hadoop的hdfs-site.xml文件至${HBASE_HOME}/conf目录;

cd /opt/hbase-1.2.7/bin
./start-hbase.sh

网页观察:http://master:60010

基本操作

 (注意操作后不要加分号)

  (常量不需要用引号引起来,在shell中输入Object.constants命令可以查看常量) 

  (表名和列名都需要加引号,不区分单双引号) 

  hbase shell,是Hbase的命令行工具,命令行中执行hbase shell即可进入hbase shell命令行 :

hbase shell

  1) list 查看hbase中所有表;

  2) 创建表:

    create '表名' , '列簇1' , '列簇2'....

create 'student', 'name','grade','course'

管理界面中查看student:

3)describe 查看表结构

describe '表名' ;

eg: describe 'student'

4)插入数据和查看数据

put '表名','行键名','列名','value','列名2','value2','family:列名1','value3'.......

put 'student','wish','name:','wish'

5)查询数据:

get '表名','行名'

get 'student','wish'

6)插入更多数据

hbase(main):004:0> put 'student','wish','course:English','100'
hbase(main):005:0> put 'student','wish','course:Chinese','60'
hbase(main):006:0> put 'student','rain','course:Chinese','100'
hbase(main):007:0> put 'student','rain','course:English','200'


get 'student','wish','course'
get 'student','wish',['course']
get 'student','wish',['course','name']

5)删除数据 

delete 'student','wish','course:Math'

6)删除表

需停止表的可用性,再删除表   

disable 'student'
drop 'student'

7) 统计行数

count 'student'

8)常用Hbase shell命令截图:

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇5 hbase-shell +   hbase.. 下一篇Hbase架构   Hbase Region的..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目