Hbase概念原理扫盲

1、Hbase简介

一、什么是Hbase

Hbase的原型是google的BigTable论文,收到了该论文思想的启发,目前做为hadoop的子项目来开发维护,用于支持结构化的数据存储。html

Hbase是一个高可靠性(存储在hdfs上,有副本机制),高性能,面向列,非关系型的数据库(相似redis),可伸缩的分布式存储系统(由于是存储在hdfs上),利用hbase技术可在廉价PC server上搭建大规模结构化的数据库存储集群。java

Hbase的目标是存储并处理大型的数据,更具体来讲仅需使用普通的硬件,就可以处理由成千上万行和列所组成的大型数据。node

Hbase是基于hdfs构建的分布式存储框架,可是Hbase在hdfs上实现随机的读写改,解决了hdfs不支持的东西python

 

二、Hbase的特色

A、海量存储mysql

B、列式存储web

这里的列式存储其实说的是列族存储,Hbase是根据列族来存储数据的,列族下面能够有很是多的列,列族在建立表的时候必须指定redis

Hbase中的列和mysql的列不是一个东西,Hbase的列就是他的数据sql

C、极易扩展shell

Hbase的扩展性主要体如今两个方面,一个是基于上层的梳理能力的扩展(RegionServer,至关于datanode,处理读写请求),一个是基于存储的扩展(hdfs)数据库

经过横向添加RegionServer的机器,进行水平扩展,提高Hbase上层的处理能力,提高Hbase服务更多的Region的能力。

备注:RegionServer的做用是管理Region)(相似mysql中的表的概念),承接客户端的读写请求的访问,这个后面会详细的介绍经过横向添加datanode的机器,进行存储层的扩容,提高Bhbase的存储能力和提高后端存储的读写能力

D、稀疏

稀疏主要是针对于hbase列的灵活性,在列族中,你能够指定任意多的列,在列数据为空的状况下,是不会占用存储空间的,这里和mysql等数据库不同,mysql若是每一个字段没有值,那这个字段的值为null,不为空,且会占用存储空间

 

三、Hbase的架构

Hbase的架构示意图以下

 

 

 

Hbase由HMaster和HRegionServer组成,HMaster的高可用也依赖于zk,相似于hdfs中的Namenode;

HRegionServer至关于hdfs中的datanode,实际处理读写请求的节点;

 

a、Zookeeper

HBase经过zk来作Hmaster的高可用,RegionServer的监控,元数据的入口以及集群配置的维护等工做,具体工做入下

经过zk来保证集群中只有一个master在运行,若是master异常,会经过竞争机制产生新的master提供服务

经过zk来监控RegionServer的状态,当RegionServer有异常的时候,经过回调的形式通知master,RegionServer上下线的信息

经过zk存储元数据的统一入口地址;

 

b、HMaster

为RegionServer分配Region

维护集群的负载均衡,就是分配Region

维护集群的元数据信息

发现失效的Region,并将失效的Region分配到正常的RegionServer上

当RegionServer失效的时候,协调对应的Hlog和hdfs的block进行数据恢复

 

C、HRegionServer

HRegionServer直接对接用户的读写请求,是真正的干活的节点,他的功能归纳以下

管理master为其分配的Region

处理来自客户端的读写请求

负责和底层hdfs的交互,存储数据到hdfs中

负责Region变大后的拆分

负责Storefile的合并工做

 

D、HDFS

Hdfs为hbase提供最终的底层数据存储服务

提供元数据和表数据的底层分布式存储服务

数据的多副本,保证高可靠和高可用

 

E、Hlog

一个HRegionServer中只有一个Hlog,Hlog至关于hdfs中的edits文件,保存Hbase的修改记录,当对Hbase写数据的时候,数据不是直接写进磁盘,他会在内存中保留一段时间(时间i将数据量的阈值能够设定)。但把数据保存在内存中可能有更高的几率引发数据丢失,为了解决这个问题,数据会先写在一个叫作Hlog的文件中,Hlog存储在磁盘上,也位于hdfs上,而后在写入内存,因此在系统出现故障或者内存丢失的时候,数据能够经过这个日志文件进行重建

 

F、Region

Region至关于mysql中的表,一个HRegionServer能够有多个Region,一个HRegionServer会有多个Region;若是表的数据太大,会进行拆分,按照数据量平均切分,全部HBase中的一张表会对应一个或者多个Region,当表的内容很小,一张表就对应一个Region,若是表很大的话,则这个Region会切分,切分Region会同时拆分这个Region的全部Store。

 

G、Store

Store至关于列族,通俗的讲就是列的家族,在hbase中,想建立一个列,必需要指定列族,也就是一个列必须属于某个列族。一个表中能够有多个列族,一个store对应一个列族,hbase官方不建议多个列族,一个列族就能够搞上百个列,足够用了。可是若是一个HRegion被切分的话,是切分列族,因此就算一个HRegion只有一个列表,切分后一个Region也会对应多个Store,多个strore会被分配到其余的HRegionServer节点进行存储

 

H、MemStore

MemStore就是列族中的数据放在内存中,写数据来了,会写到内存中,只要内存写入成功,则就返回。

 

I、StoreFile

StoreFile,数据放在内存不安全,并且有大小限制,因此须要把内存中的数据写到磁盘中,以Hfile的格式存储在hdfs上。每次memstore刷一次,造成一个storefile,因此storefile会不少,可是很小,由于内存自己就不大,后面storeFile也会合并,可是这个合并也仅仅是一个列族内部的StoreFile进行合并,不会跨列族合并的

 

J、HFile

这是磁盘上保存的原始数据的实际的物理文件,是实际的存储文件,storefile是以Hfile的形式存储在hdfs中

 

2、Hbase安装

一、首先要安装zk

二、 而后要安装hdfs

三、 最后在安装hbase

四、 解压,修改配置文件

这里重点说下修改配置文件,前面的就不说了,由于我在实际使用过程当中使用ambari工具来进行安装

首先修改hbase-env.sh 

配置java的环境变量

 

 

 

export JAVA_HOME=/usr/lib/jvm/java

  

配置zk,Hbase也是强依赖于zookeeper的,是否要启用本身的zookeeper。若是用则为true,若是用外部的zookeeper,则为false

 

 

 

export HBASE_MANAGES_ZK=false

  

配置hbase-site.xml 

 

 

 

<property>
      <name>hbase.rootdir</name>
      <value>/apps/hbase/data</value>
    </property>

  

配置hbase是否启用集群

 

 

 

<property>
      <name>hbase.cluster.distributed</name>
      <value>true</value>
    </property>

  

设置Hbase的服务的端口号,不是 web的端口号,web的端口号是16010

 

 

 

<property>
      <name>hbase.master.info.port</name>
      <value>16010</value>
    </property>

  

 

 

 

<property>
      <name>hbase.master.port</name>
      <value>16000</value>
    </property>

  

配置要链接的zk

 

 

 

<property>
      <name>hbase.zookeeper.quorum</name>
      <value>abdi1,abdi2,abdi3</value>
    </property>

  

Zk存储数据的父目录,主要是为了区分多个hbase集群

 

 

 

<property>
      <name>zookeeper.znode.parent</name>
      <value>/hbase-unsecure</value>
    </property>

  

配置regionservers文件

指定RegionServer的节点

 

 

 

因为hbase是强依赖于hdfs的,须要拷贝hdfs的配置文件到hbase的conf目录

咱们通常状况会这样操做,建立一个软连接,连接到hdfs的core-site.xml和hdfs-site.xml中,就是让hbase知道我要链接哪一个hadoop集群

 

 

 

可是在ambari安装的hbase的配置文件中没有找到相应的配置,可是在hbase启动的时候有加载hdfs的环境变量

 

 

 

启动hbase,能够看到有Hmaster和HRegionServer的java进程

 

 

ambari的web页面显示效果以下

 

 

 

 

 

 

注意:Hbase的Master和RegionServer安装是同样的,只是看咱们是否要启动master

Hbase的web页面,采用16010端口

 

 

 

3、Hbase的简单shell操做

一、进入hbase shell

[root@abdi2 bin]# /usr/hdp/current/hbase-client/bin/hbase shell

  

二、查看当前有哪些表:list

hbase(main):003:0> list
TABLE                                                                                                                                                                                                                                                                         
0 row(s)
Took 0.2713 seconds                                                                                                                                                                                                                                                           
=> []
hbase(main):004:0>

  

三、建立表操做。这里的列族是必需要指定的,就是和mysql的列同样:create "student","info"

hbase(main):004:0> create "student","info"
Created table student
Took 1.3445 seconds                                                                                                                                                                                                                                                           
=> Hbase::Table - student
hbase(main):005:0> 
hbase(main):006:0> list
TABLE                                                                                                                                                                                                                                                                         
student                                                                                                                                                                                                                                                                       
1 row(s)
Took 0.0055 seconds                                                                                                                                                                                                                                                           
=> ["student"]

  

 

 

 

 

 

 

四、插入数据。Hbase中的数据没有什么类型,好比字符串,hash等,所有是字节:put "student","1001","info:name","laowang"

hbase(main):007:0> put "student","1001","info:name","laowang"
Took 0.1217 seconds                                                                                                                                                                                                                                                           
hbase(main):008:0> put "student","1001","info:age","18"
Took 0.0038 seconds                                                                                                                                                                                                                                                           
hbase(main):009:0> put "student","1001","info:sex","male"
Took 0.0049 seconds                                                                                                                                                                                                                                                           
hbase(main):010:0> put "student","1002","info:name","laoluo"
Took 0.0036 seconds                                                                                                                                                                                                                                                           
hbase(main):011:0> put "student","1002","info:age","20"
Took 0.0035 seconds

  

 

 

 

五、扫描查看数据:scan “student”

 

 

六、扫描查看数据,指定起始和截止Rowkey,前闭后开

 

 

七、查看指定Rowkey

 

 

 

八、查看指定行的指定列

 

 

 

九、更新数据

 

 

 

十、查看表结构

重点关注列族和版本便可,这里的版本是个数的意思,就一条数据存储几个版本

 

 

 

十一、修改列族的版本信息

 

 

 

多更新几回数据

 

 

 

能够查看到有多个版本,这里的意思查看3个版本的数据,因此有三条,下面的命令是查看2个版本的数据,因此有两条

 

 

 

 

十二、删除操做

删除某个Rowkey的指定列,能够看到其余列的数据还在,删除还能够指定时间戳,该时间戳以前的数据都会被删除

 

 

 

 

 

 

删除Rowkey对应的全部数据

 

 

 

 

 

1三、统计条数

统计条数,Rowkey有几个,条数就有几条

 

 

 

1四、清空表

 

 

1五、删除表

 

 

 

 

1六、命名空间(namespace)操做

命令空间,至关于数据库中的database

全部的表都是命名空间的成员,若是不指定,则默认在default的命名空间中

 

命名空间能够设置权限,好比定义访问控制列表,例如建立表,读取表,删除,更新操做,权限用的不多

 

Shell命令查看namespace、建立namespace

 

 

 

 

 

Hbase就是存储元数据的命名空间,是系统本身用的,不能给用户使用

在指定命名空间下建表

 

 

 

 

 

 

 

 

 

4、Hbase的数据结构

一、Rowkey

Rowkey是用来检索记录的主键,访问Hbase table中的行,只有三种方式

A、经过单个Rowkey访问

B、经过Rowkeyrange访问

 

C、全表扫描

设计Rowkey很是重要也是Hbase里最重要的一门学问,数据会按照Rowkey的字典序排序进行存储,因此设计Rowkey要利用这个特性,把常常一块儿读取的行存储在一块儿,学习Hbase,Rowkey设计是学习的重点

 

二、Column Family

列族,Hbase表中的每一个列,都会属于某个列族,列族是表的结构的一部分,列族在建表的时候必需要指定。列名都是以列族作为前缀。

 

在建立表的时候须要指定列族,列族能够指定多个

 

三、Cell

 

Rowkeycolumn Familycolumnversion惟一肯定的单元,cell中的数据是没有类型的,所有都是字节的形式存储

 

 

四、Time Stamp

时间戳,每一个cell都保存着同一份数据的多个版本,版本经过时间戳来索引。时间戳能够由系统生成,也能够本身指定。每一个cell中,不一样版本的数据按照时间倒序排列,即最新的数据在最前面

 

经过时间戳不一样来肯定版本的

 

5、Hbase的原理

Hbase的写比读还快

 

一、读流程,hmaster没有关系,hmaster挂掉后,不影响读流程

 

 

a、先获取meta表的位置,也就元数据这张表存储的位置

b、meta表所在位置获取meta表的信息,meta表存储的内容大体入下

Student 0 ----10000 rs1

Student 100001---20000 rs2

Stff        0---10000  rs3

Stff       10000—200000 rs4

 

c、而后在去对应的regionserver获取对应的数据

d、获取数据,先去内存中获取,若是内存中没有,到blockcache中获取,若是blockcash没有,则去磁盘获取,这里为何先去内存获取数据?

 

e、返回数据的时候,先把数据写到blockcache中,而后在返回给client

 

 

Meta表的位置

 

 

Zk上查看meta表的存储位置

 

 

查看meta表的内容

 

 

二、写流程,和Hmaster没有关系

 

a、clientzk获取meta表的位置

b、Zk返回meta表的位置

c、Zkregionserver读取meta表的内容

d、Regionservermeta表的内容返回

e、去对应的regionserver开始执行写操做,先写Hlog文件,而后写到memstore,成功后,马上返回,写入流程完成

 

由于先写到内存中,那么何时会刷到硬盘中呢

 

 

a、Regionserver的使用的总内存达到堆内存的40%

 

 

b、知足一个小时的条件,会刷memstore到硬盘中

 

 

c、单个region里的全部的Memstore加起来达到128MB,则会刷memstore到硬盘中

 

 

这样就会有不少小文件刷到hdfs中,可是hdfs不适合存储不少的小文件

 

默认是7天作一次合并

 

 

 

 超过7天合并storefile文件

超过3storefile文件,会进行合并

这个是合并一个列族的的storefile,不一样列族的storefile文件不会进行合并的

 

 三、高可用

Hmaster是Activestandby模式

 

 

 

 高可用配置

 

 

 

扫描查看数据

原文出处:https://www.cnblogs.com/bainianminguo/p/12110077.html

相关文章
相关标签/搜索