大数据技术之Hbase

一、HBaes介绍

1.1、HBase简介

HBase是一个分布式的、面向列的开源数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

大:上亿行、百万列

面向列:面向列(族)的存储和权限控制,列(簇)独立检索

稀疏:对于为空(null)的列,并不占用存储空间,因此,表的设计的非常的稀疏

1.2、HBase的角色

1.2.1、HMaster

功能:

1) 监控RegionServer

2) 处理RegionServer故障转移

3) 处理元数据的变更

4) 处理region的分配或移除

5) 在空闲时间进行数据的负载均衡

6) 通过Zookeeper发布自己的位置给客户端

1.2.2、HRegionServer

功能:

1) 负责存储HBase的实际数据

2) 处理分配给它的Region

3) 刷新缓存到HDFS  

4) 维护HLog

5) 执行压缩

6) 负责处理Region分片

组件:

1) Write-Ahead logs

HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值

可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

2) HFile

这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。

3) Store

HFile存储在Store中,一个Store对应HBase表中的一个列簇。

4) MemStore

顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。

5) Region

Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer

1.3、HBase的架构

一个RegionServer可以包含多个HRegion,每个RegionServer维护一个HLog,和多个HFiles以及其对应的MemStore。RegionServer运行于DataNode上,数量可以与DatNode数量一致,请参考如下架构图:

1.4 HBase数据模型

 

Rowkey

timestamp

列簇(colume family) Store

列1(colume)

列2(colume)

列3(colume)

region

Rowkey1

 

 

 

 

Rowkey2

 

 

 

 

Rowkey3

 

 

 

 

确定一个单元格的位置(cell),需要如下四个

rowkey + Colume Family + Colume + timestamp(版本version),数据有版本的概念,即一个单元格可能有多个值,但是只有最新得一个对外显示。

  1. HBase中有两张特殊的Table,-ROOT-和.META.
  2. .META.:记录了用户表的Region信息,.META.可以有多个region
  3. -ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region
  4. Zookeeper中记录了-ROOT-表的location
  5. Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过client端会做cache缓存,注意:在0.96版本后,Hbase移除了-ROOT-表

Row Key: 行键,Table的主键,Table中的记录默认按照Row Key升序排序

Timestamp:时间戳,每次数据操作对应的时间戳,可以看作是数据的version number

Column Family

列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。

Table & Region:

当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,不同的region会被Master分配给相应的RegionServer进行管理:.

HMaster

HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作:

1. 管理用户对Table的增、删、改、查操作

2. 管理HRegionServer的负载均衡,调整Region分布

3. 在Region Split后,负责新Region的分配

4. 在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移

HRegionServer

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

MemStore & StoreFiles

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上。

HLog

每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中,HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复

文件类型

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

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

 

  1. Zookeeper中hbase的节点的存储信息:

    rs:regionserver节点信息

    table-lock:hbase的除meta以外的所有表

    Table:hbase的所有的表

二、HBase部署与使用

2.1、部署

2.1.1、Zookeeper正常部署

首先保证Zookeeper集群的正常部署,并启动之:

/opt/mod/zookeeper-3.4.5/bin/zkServer.sh start

2.1.2、Hadoop正常部署

Hadoop集群的正常部署并启动:

/opt/mod/hadoop-2.8.4/sbin/start-dfs.sh

/opt/mod/hadoop-2.8.4/sbin/start-yarn.sh

2.1.3、HBase的解压

解压HBase到指定目录:

tar -zxf /opt/hbase-1.3.1-bin.tar.gz -C /opt/mod/

2.1.4HBase的配置文件

需要修改HBase对应的配置文件。

/opt/mod/hbase/conf/hbase-env.sh修改内容:

export JAVA_HOME=/opt/module/jdk1.8.0_121

export HBASE_MANAGES_ZK=false

尖叫提示:如果使用的是JDK8以上版本,注释掉hbase-env.sh的45-47行,不然会报警告

/opt/mod/hbase/conf/hbase-site.xml修改内容:

         <property>

                   <name>hbase.rootdir</name>  

                   <value>hdfs://bigdata31:9000/hbase</value>  

         </property>

         <property>

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

                   <value>true</value>

         </property>

         <property>

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

                   <value>16000</value>

         </property>

         <property>  

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

                   <value>bigdata31:2181,bigdata32:2181,bigdata33:2181</value>

         </property>

         <property>  

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

                   <value>/opt/mod/zookeeper-3.4.10/zkData</value>

         </property>

         <property>

                  <name>hbase.master.maxclockskew</name>

                  <value>180000</value>

         </property>

/opt/mod/hbase/conf/regionservers:

bigdata31

bigdata32

bigdata33

2.1.5、HBase需要依赖的Jar包(额外,不用配置)

由于HBase需要依赖Hadoop,所以替换HBase的lib目录下的jar包,以解决兼容问题:

  1.  删除原有的jar:

rm -rf /opt/mod/hbase/lib/hadoop-*

rm -rf /opt/mod/hbase/lib/zookeeper-3.4.10.jar

  1.  拷贝新jar,涉及的jar有:

hadoop-annotations-2.8.4.jar

hadoop-auth-2.8.4.jar

hadoop-client-2.8.4.jar

hadoop-common-2.8.4.jar

hadoop-hdfs-2.8.4.jar

hadoop-mapreduce-client-app-2.8.4.jar

hadoop-mapreduce-client-common-2.8.4.jar

hadoop-mapreduce-client-core-2.8.4.jar

hadoop-mapreduce-client-hs-2.8.4.jar

hadoop-mapreduce-client-hs-plugins-2.8.4.jar

hadoop-mapreduce-client-jobclient-2.8.4.jar

hadoop-mapreduce-client-jobclient-2.8.4-tests.jar

hadoop-mapreduce-client-shuffle-2.8.4.jar

hadoop-yarn-api-2.8.4.jar

hadoop-yarn-applications-distributedshell-2.8.4.jar

hadoop-yarn-applications-unmanaged-am-launcher-2.8.4.jar

hadoop-yarn-client-2.8.4.jar

hadoop-yarn-common-2.8.4.jar

hadoop-yarn-server-applicationhistoryservice-2.8.4.jar

hadoop-yarn-server-common-2.8.4.jar

hadoop-yarn-server-nodemanager-2.8.4.jar

hadoop-yarn-server-resourcemanager-2.8.4.jar

hadoop-yarn-server-tests-2.8.4.jar

hadoop-yarn-server-web-proxy-2.8.4.jar

zookeeper-3.4.10.jar

 

尖叫提示:这些jar包的对应版本应替换成你目前使用的hadoop版本,具体情况具体分析。

查找jar包举例:

find /opt/module/hadoop-2.8.4/ -name hadoop-annotations*

cp /opt/mod/hadoop-2.8.4/share/hadoop/common/lib/hadoop-annotations-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/tools/lib/hadoop-auth-2.8.4.jar /opt/mod/hbase-1.3.1/lib/ 
cp /opt/mod/hadoop-2.8.4/share/hadoop/common/hadoop-common-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/hdfs/hadoop-hdfs-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-client-app-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-client-hs-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-client-hs-plugins-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.8.4-tests.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-client-shuffle-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-api-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-applications-unmanaged-am-launcher-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-client-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-common-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-server-applicationhistoryservice-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-server-common-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-server-nodemanager-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-server-resourcemanager-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-server-tests-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/hadoop-2.8.4/share/hadoop/yarn/hadoop-yarn-server-web-proxy-2.8.4.jar /opt/mod/hbase-1.3.1/lib/
cp /opt/mod/zookeeper-3.4.10/zookeeper-3.4.10.jar /opt/mod/hbase-1.3.1/lib/

然后将找到的jar包复制到HBase的lib目录下即可。

2.1.6、HBase软连接Hadoop配置(额外,不用配置)

ln -s /opt/mod/hadoop-2.8.4/etc/hadoop/core-site.xml /opt/mod/hbase-1.3.1/conf/core-site.xml

ln -s /opt/mod/hadoop-2.8.4/etc/hadoop/hdfs-site.xml /opt/mod/hbase-1.3.1/conf/hdfs-site.xml

2.1.7.0 配置环境变量

vi /etc/profile

export HBASE_HOME=/opt/mod/hbase-1.3.1

export PATH=$HBASE_HOME/bin:$PATH

source /etc/profile

2.1.7、HBase远程scp到其他集群

scp -r /opt/mod/hbase-1.3.1/ bigdata32:/opt/mod/

scp -r /opt/mod/hbase-1.3.1/ bigdata33:/opt/mod/

2.1.8HBase服务的启动

启动方式1:

/opt/mod/hbase-1.3.1/bin/hbase-daemon.sh start master

/opt/mod/hbase-1.3.1/bin/hbase-daemon.sh start regionserver

尖叫提示:如果集群之间的节点时间不同步,会导致regionserver无法启动,抛出ClockOutOfSyncException异常。

启动方式2:

/opt/mod/hbase-1.3.1/bin/start-hbase.sh   //再每个节点查看相关进程,如果没有启动,则在相关节点执行

对应的停止服务:

/opt/mod/hbase-1.3.1/bin/stop-hbase.sh

2.1.9、查看Hbse页面

启动成功后,可以通过“host:port”的方式来访问HBase管理页面,例如:

http://bigdata31:16010,这里是借用了工作环境的测试库

 

2.2、简单使用

2.2.1 基本操作

  1.  进入HBase客户端命令行

/opt/mod/hbase-1.3.1/bin/hbase shell

2) 查看帮助命令

hbase(main)> help

3) 查看当前数据库中有哪些表

hbase(main)> list

4) 查看当前数据库中有哪些命名空间

hbase(main)> list_namespace

2.2.2 表的操作

  1.  创建表

hbase(main)> create 'student','info'

hbase(main)> create 'iparkmerchant_order','smzf'

hbase(main)> create 'staff','info'

2) 插入数据到表

hbase(main) > put 'student','1001','info:name','Thomas'

hbase(main) > put 'student','1001','info:sex','male'

hbase(main) > put 'student','1001','info:age','18'

hbase(main) > put 'student','1002','info:name','Janna'

hbase(main) > put 'student','1002','info:sex','female'

hbase(main) > put 'student','1002','info:age','20'

数据插入后的数据模型

Rowkey

timestamp

info

name

sex

age

 

1001

 

Thomas

male

18

 

1002

 

Janna

female

20

 

3) 扫描查看表数据

hbase(main) > scan 'student'

hbase(main) > scan 'student',{STARTROW => '1001', STOPROW  => '1001'}

hbase(main) > scan 'student',{STARTROW => '1001'}

注:这个是从哪一个rowkey开始扫描

4) 查看表结构

hbase(main):012:0> desc 'student'

5) 更新指定字段的数据

hbase(main) > put 'student','1001','info:name','Nick'

hbase(main) > put 'student','1001','info:age','100'

hbase(main) > put 'student','1001','info:isNull'                       (仅测试空值问题)

6) 查看“指定行”或“指定列族:列”的数据

hbase(main) > get 'student','1001'

hbase(main) > get 'student','1001','info:name'

7) 删除数据

删除某rowkey的全部数据:

hbase(main) > deleteall 'student','1001'

8) 清空表数据

hbase(main) > truncate 'student'

尖叫提示:清空表的操作顺序为先disable,然后再truncate。

9) 删除表

首先需要先让该表为disable状态:

hbase(main) > disable 'student'

检查这个表是否被禁用

hbase(main) > is_enabled 'hbase_book'

hbase(main) > is_disabled 'hbase_book'

恢复被禁用得表

enable 'student'

然后才能drop这个表:

hbase(main) > drop 'student'

尖叫提示:如果直接drop表,会报错:Drop the named table. Table must first be disabled

ERROR: Table student is enabled. Disable it first.

10) 统计表数据行数

hbase(main) > count 'student'

11) 变更表信息将info列族中的数据存放3个版本:

hbase(main) > alter 'student',{NAME=>'info',VERSIONS=>3}

查看student的最新的版本的数据

hbase(main) > get 'student','1001'

查看HBase中的多版本

hbase(main) > get 'student','1001',{COLUMN=>'info:name',VERSIONS=>10}

2.2.2 常用Shell操作

1) satus 例如:显示服务器状态

hbase> status 'bigdata111'

2) exists 检查表是否存在,适用于表量特别多的情况

hbase> exists 'hbase_book'

3) is_enabled/is_disabled 检查表是否启用或禁用

hbase> is_enabled 'hbase_book'

hbase> is_disabled 'hbase_book'

8) alter 该命令可以改变表和列族的模式,例如:

为当前表增加列族:

hbase> alter 'hbase_book', NAME => 'CF2', VERSIONS => 2

为当前表删除列族:

hbase> alter 'hbase_book', 'delete' => 'CF2'

9) disable禁用一张表

hbase> disable 'hbase_book'

hbase> drop 'hbase_book'

10) delete

删除一行中一个单元格的值,例如:

hbase> delete 'hbase_book', 'rowKey', 'CF:C'

11) truncate清空表数据,即禁用表-删除表-创建表

hbase> truncate 'hbase_book'

12) create

创建多个列族:

hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}

--------------练习------------------

1.创建一张表:person,有两个列簇(student,teacher)

create 'person','student','teacher'

2.第一个列簇的版本保留三份,第二个两份。

alter 'person', NAME => 'student', VERSIONS => 3
alter 'person', NAME => 'teacher', VERSIONS => 2

3.插入10行数据姓名,性别,年龄,成绩;姓名,所教科目等等。

put 'person','1001','student:name','Thomas'
put 'person','1001','student:sex','man'
put 'person','1001','student:age',17
put 'person','1001','student:result',87
put 'person','1001','teacher:name','Denny'
put 'person','1001','teacher:subject','English'

put 'person','1002','student:name','Janna'
put 'person','1002','student:sex','Weman'
put 'person','1002','student:age',18
put 'person','1002','student:result',91
put 'person','1002','teacher:name','Tom'
put 'person','1002','teacher:subject','Mathematics'

put 'person','1003','student:name','Winner'
put 'person','1003','student:sex','Weman'
put 'person','1003','student:age',19
put 'person','1003','student:result',89
put 'person','1003','teacher:name','Sherry'
put 'person','1003','teacher:subject','Chemistry'

4.扫描查看4到8行的数据。

scan 'person',{STARTROW => '1004', STOPROW => '1008'}

5.查看第10行数据。

scan 'person',{STARTROW => '1010'}

6.查看第7行数据的学生列簇的姓名。

get 'person','1007','student:name'

7.删除表。

disable 'person'
drop 'person'

---------------------------------------------------------

2.3、读写流程

2.3.1、HBase读数据流程

Hbase的regionserver的内存Memstore,block cache。Memstore作业主要是写,另一部分主要是读的。block cache用的是LRU,如果block cache达到上限,会启动淘汰机制。

  1.  HRegionServer保存着.META.的这样一张表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面找到.META.表所在的位置信息,即找到这个.META.表在哪个HRegionServer上保存着。
  2.  接着Client通过刚才获取到的HRegionServer的IP来访问.META.表所在的HRegionServer,从而读取到.META.,进而获取到.META.表中存放的元数据。
  3.  Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描(scan)所在HRegionServer的Memstore如果没有,扫描block cache(读数据的缓存),如果还没有去Storefile来查询数据,查到数据之后将数据读到block cache。
  4. 最后HRegionServer把查询到的数据响应给Client。

2.3.2、HBase写数据流程

  1.  Client也是先访问zookeeper,进而找到.META.表,并获取.META.表信息。
  2.  确定当前将要写入的数据所对应的RegionServer服务器和Region。
  3.  Client向该RegionServer服务器发起写入数据请求,然后RegionServer收到请求并响应。
  4.  Client先把数据写入到HLog,以防止数据丢失。
  5.  然后将数据写入到Memstore。
  6.  如果Hlog和Memstore均写入成功,则这条数据写入成功。在此过程中,如果Memstore达到阈值,会把Memstore中的数据flush到StoreFile中。
  7.  当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合并成一个大的Storefile。当Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,将Region一分为二。

尖叫提示:因为内存空间是有限的,所以说溢写过程必定伴随着大量的小文件产生。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值