天天看点

小白学hadoop日记day14——hbase

1 hbase的来源

1、hdfs的数据读写延迟高

2、不能近实时更新删除局部数据

3、hive的数据必须要指定的列或者字段,必须要格式化的数据。

4、hbase来源于google的bigtable。

2 hbase的定义

Hbase是一个基于Hadoop的开源, 分布式的,多版本的,可扩展的,非关系型数据库,能够处理海量数据(数十亿行和百万列)。

Hbase特点

habse类似于:Redis、clickhouse、mongoDB、canssdra等。uid  <name:zs,age:18,score:22>

- HBase的表模型与关系型数据库的表模型不同:

- HBase的表没有固定的字段定义;

- HBase的表中每行存储的都是一些key-value对

- HBase的表中有列簇的划分,用户可以指定将哪些kv插入哪个列族

- HBase的表在物理存储上,是按照列簇来分割的,不同列簇的数据一定存储在不同的文件中

- HBase的表中的每一行都固定有一个行键,而且每一行的行键在表中不能重复

- HBase中的数据,包含行键,包含key,包含value,都是byte[ ]类型,HBase不负责为用户维护数据类型

- HBase对事务的支持很差

- HBase支持稀疏存储

HBase的表数据存储在HDFS文件系统中。

从而,hbase具备如下特性:存储容量可以线性扩展; 数据存储的安全性可靠性极高!

- hbase的表模型跟mysql之类的关系型数据库的表模型差别巨大

- hbase的表模型中有:行的概念;但没有字段的概念

- 行中存的都是key-value对,每行中的key-value对中的key可以是各种各样,每行中的key-value对的数量也可以是各种各样

3 hbase的表模型

1、一个表,有表名

2、一个表可以分为多个列簇(不同列簇的数据会存储在不同文件中)。列簇一般1-2个即可。

3、表中的每一行有一个“行键rowkey”,而且行键在表中不能重复(重复之后会覆盖,比如更新数据行键一定会重复)。类似于mysql中的主键。

4、表中的每一对kv数据称作一个cell

5、hbase可以对数据存储多个历史版本(历史版本数量可配置)

6、整张表由于数据量过大,会被横向切分成若干个region(用rowkey范围标识),不同region的数据也存储在不同文件中

7、hbase会对插入的数据按顺序存储:

 7.1要点一:首先会按行键排序

 7.2要点二:同一行里面的kv会按列簇排序,再按k排序

- hbase中只支持byte[]

- 此处的byte[] 包括了: rowkey,key,value,列簇名,表名

- HBase基于hadoop : HBase的存储依赖于HDFS

小白学hadoop日记day14——hbase

4 Hbase架构

架构图示

小白学hadoop日记day14——hbase

组件说明

- Client : hbase客户端,1.包含访问hbase的接口。比如,linux shell,java api。2.除此之外,它会维护缓存来加速访问hbase的速度。比如region的位置信息。

- Zookeeper : 1.监控Hmaster的状态,保证有且仅有一个活跃的Hmaster达到高可用。2.它可以存储所有region的寻址入口。如:root表在哪一台服务器上。3. 实时监控HregionServer的状态,感知HRegionServer的上下线信息,并实时通知给Hmaster。4. 存储hbase的部分元数据。

- HMaster : 1. 为HRegionServer分配Region(新建表等)。2. 负责HRegionServer的负载均衡。3. 负责Region的重新分配(HRegionServer宕机之后的Region分配,HRegion裂变:当Region过大之后的拆分)。4. Hdfs上的垃圾回收。5. 处理schema的更新请求

- HRegionServer :1. 维护HMaster分配给的Region(管理本机的Region)。2. 处理client对这些region的读写请求,并和HDFS进行交互。3. 负责切分在运行过程中组件变大的Region。

- HLog : 1. 对HBase的操作进行记录,使用WAL写数据,优先写入log(put操作:先写日志再写memstore,这样可以防止数据丢失,即使丢失也可以回滚)。

- HRegion : 1. HBase中分布式存储和负载均衡的最小单元,它是表或者表的一部分。

- Store : 1. 相当于一个列簇

- Memstore : 1. 内存缓冲区,用于将数据批量刷新到hdfs中,默认大小为128M

- HStoreFile : 1.不过是一个逻辑概念。HBase中的数据是以HFile存储在Hdfs上。

组件之间的关系

hmaster:hregionserver=1:*

hregionserver:hregion=1:*

hregionserver:hlog=1:1

hregion:hstore=1:*

store:memstore=1:1

store:storefile=1:*

storefile:hfile=1:1

小白学hadoop日记day14——hbase

术语

rowkey:行键,和mysql的主键同理,不允许重复。

columnfamily: 列簇,列的集合之意。

column:列

timestamp:时间戳,默认显示最新的时间戳,可用于控制k对应的多个版本值,默认查最新的数据

version:版本号,表示记录数据的版本

cell:单元格,kv就是cell

模式:无

数据类型:只存储byte[]

多版本:每个值都可以有多个版本

列式存储:一个列簇存储到一个目录

稀疏存储:如果一个kv为null,不占用存储空间

5 全分布式部署

系统版本:

centOS7.7

HBASE版本:apache-hbase-1.3.6

HADOOP版本:apache-hadoop-2.7.6

JDK版本:jdk-1.8.0_45

单机安装/伪分布式:1台服务器全分布式:3台服务器

全分布式

[[email protected] ~]# tar -zxvf /home/hbase-1.3.6-bin.tar.gz -C /usr/local/
[[email protected] ~]# vi /etc/profile
#my settings
export JAVA_HOME=/usr/local/jdk1.8.0_152/
export HADOOP_HOME=/usr/local/hadoop-2.7.6/
export HIVE_HOME=/usr/local/hive-2.3.7/
export SQOOP_HOME=/usr/local/sqoop-1.4.7/
export HBASE_HOME=/usr/local/hbase-1.3.6/
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$SQOOP_HOME/bin:$HBASE_HOME/bin:

[[email protected] ~]# source /etc/profile
[[email protected] ~]# which hbase
/usr/local/hbase-1.3.6/bin/hbase
           

配置hbase-env.sh

[[email protected] hbase-1.3.6]# vi ./conf/hbase-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_152/
           

配置hbase-site.xml

<configuration>
    <!-- 指定hbase在HDFS上存储的路径 -->      
    <property>   
        <name>hbase.rootdir</name>                            
        <value>hdfs://hadoop01:8020/hbase</value>            
    </property>
    <!-- 指定hbase是分布式的 --> 
    <property>
        <name>hbase.cluster.distributed</name>          
        <value>true</value>              
    </property>
    <!-- 指定zk的地址,多个用“,”分割 -->     
    <property>
        <name>hbase.zookeeper.quorum</name>           
        <value>hadoop01,hadoop02,hadoop03</value>
    </property>
</configuration>
           

配置regionservers

hadoop01
hadoop02
hadoop03
           

配置backup-masters

先创建backup-masters文件

决定你的其他备份的hmasteer启动在什么服务器上。可以写多个,多个换行即可。

hadoop02
           

分发到hadoop02和03上

[[email protected] hbase-1.3.6]# rm -rf ./docs/
[[email protected] hbase-1.3.6]# scp -r ../hbase-1.3.6/ hadoop02:/usr/local/
[[email protected] hbase-1.3.6]# scp -r ../hbase-1.3.6/ hadoop03:/usr/local/
[[email protected] hbase-1.3.6]# scp -r /etc/profile hadoop02:/etc/
[[email protected] hbase-1.3.6]# scp -r /etc/profile hadoop03:/etc/
[[email protected] ~]# source /etc/profile
[[email protected] ~]# source /etc/profile
           

i启动hbase

1、保证hadoop和zookeeper提前启动好

2、[[email protected] hbase-1.3.6]# start-hbase.sh

3、查看每台服务器的jps:

1888 QuorumPeerMain

2438 ResourceManager

2822 HMaster

2090 NameNode

2284 SecondaryNameNode

3373 Jps

2943 HRegionServer

4、查看hbase的hmaster的web端口 16010

http://hadoop01:16010

5、出错再habse的按照目录下的logs查看日志。

连接hbase

进入目录 /usr/local/hbase-1.3.6/bin 下

[[email protected] bin]# hbase shell