1.HBase介绍

1.1HBase简介

Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。

        利用Hadoop HDFS作为其文件存储系统,利用Zookeeper作为其分布式协同服务主要用来存储非结构化 和半结构化的松散数据(列存 NoSQL 数据库)。

1.2HBase优点

(1)容量大:Hbase单表可以有百亿列、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性。、

        (2)面向列:面向列的存储和权限控制,并支持独立检索,可以动态增加列,即,可单独对列进行各方面的操作 列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数量。

        (3)多版本:Hbase的每一个列的数据存储有多个Version,比如住址列,可能有多个变更,所以该列可以有多 个version

        (4)高可靠性:WAL机制,保证数据写入的时候不会因为集群异常而导致写入数据丢失 Replication(复制)机制,保证了在集群出现严重的问题时候,数据不会发生丢失或者损坏 Hbase底层使用HDFS,本身也有备份。

        (5)拓展性:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点服务(机器)就可以了。

        (6)高性能:底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase写入性能非常高。

2.HBase数据模型

HBase 是一个稀疏的、分布式、持久、多维、排序的映射,它以行键(row key),列簇(column Family),列名(Column Qualifier)和时间戳(timestamp)为索引。

2.1.NameSpace

命名空间是类似于关系数据库系统中的数据库的概念,它其实是表的逻辑分组。这种抽象为多租户相关功能奠定了基础。

命名空间是可以管理维护的,可以创建,删除或更改命名空间。

HBase有两个特殊预定义的命名空间:

  • default-没有明确指定名称空间的表将自动落入此名称空间
  • hbase-系统命名空间,用于包含HBase内部表

2.2.Table

Hbase的table由多个行组成。

2.3.RowKey

  • RowKey 是用来检索记录的主键,是一行数据的唯一标识
  • RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10- 100bytes),RowKey以字节数组保存。
  • 存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个 特性,将经常一起读取的行存储放到一起。

2.4.Column Family

  • 列族在物理上包含了许多的列与列的值,每个列族都有一些存储的属性可配置
  • 将功能属性相近的列放在同一个列族,而且同一个列族中的列会存放在同一个Store中
  • 列族一般需要在创建表的时候进行声明,而且一般一个表中的列族数不要超过3个(和后期的优化有关)
  • 列隶属于列族,列族隶属于表

2.5. Column Qualifier

  • 列族的限定词,理解为例的唯一标识,但是列标识是可以改变的,因此每一行可能有不同的列标识
  • 使用的时候必须 列族:列
  • 列可以根据需求动态添加或者删除,同一个表中不同行的数据列都可以不同

2.6. Timestamp

  • 通过rowkey和column family,column qualifier确定的一个存贮单元通过时间戳来索引
  • 每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面
  • 为了避免数据存在过多版本中造成管理 (包括存贮和索引)负担,HBASE 提供了两种数据版本回收方式。(一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天))。

2.7. Cell

  • Cell是由row,column family,column qualifier,version 组成的
  • Cell中的数据是没有类型的,全部是字节码形式存贮(因为HDFS上的数据都是字节数组)

3.HBase访问方式

3.1. HBase shell

我们可以先用Hbase提供的命令行工具,位于hbase的/bin/目录下

(1)进入退出

hbase shell(访问HBase)

exit(退出)

(2)查看帮助信息

help

(3)查询服务器状态

status

(4)查看hive版本

 version

3.1.1Shell实现DDL操作

1.创建一个表

语法:create '表命' , {NAME => , VERSIONS => }

例如:创建表t1,有两个family name:f1,f2,且版本数均为2例如:创建表t1,有两个family name:f1,f2,且版本数均为2

hbase(main)> create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}

还有一种非标准创建的语法,创建表member,列族是member_id,address,info,版本为1。如下: 

hbase(main):011:0>create 'member','member_id','address','info'

2.获得表的描述 

语法:describe

hbase(main):012:0>list

hbase(main):006:0>describe 'member'

 3.删除一个列族,alter,disable,enable

假设之前建了3个列族,但是发现member_id这个列族是多余的,因为他就是主键,所以我们要将其删除

hbase(main):003:0>alter 'member',{NAME=>'member_id',METHOD=>'delete'}

将表enable

hbase(main):008:0> enable 'member'

4.列出所有的表

hbase(main):028:0>list 

 5.drop一个表

create 'temp_table','member_id','address','info'

hbase(main):029:0>disable 'temp_table'(删除表之前先将表禁用)

hbase(main):030:0>drop 'temp_table'

 6.truncate此命令将删除并重新创建一个表

truncate '表名'

3.1.2. Shell实现DML操作

1.插入几条记录

put'member','guojing','info:age','24'

put'member','guojing','info:birthday','1987-06-17' put'member','guojing','info:company','alibaba'

注:现在表的数据都存在内存中,并没有落地到磁盘,如果这时想要落地到磁盘可以执行命令手动落地

命令:flush 'tablename'--(flush '表名')

 2.更新一条记录 将scutshuxue的年龄改成99

hbase(main):004:0>put 'member','scutshuxue','info:age' ,'99'

3. 删除id为temp的值的‘info:age’字段

hbase(main):016:0>delete 'member','temp','info:age'

 4.删除整行

hbase(main):001:0>deleteall 'member','xiaofeng'

 5.查询表中有多少行

hbase(main):019:0>count 'member'

6.将整张表清空 

hbase(main):035:0>truncate 'member'

3.1.3Shell实现DQL操作

1.获取一个Id的所有数据

hbase(main):001:0>get 'member','linghuchong'

 2.获取一个id,一个列族的所有数据

hbase(main):002:0>get 'member','linghuchong','info'

 3.获取一个id,一个列族中一个列的所有数据

hbase(main):002:0>get 'member','linghuchong','info:age'

4全表扫描

hbase(main):013:0>scan 'member'

4. HBase架构模型

HBase有三个主要组成部分:客户端库,主服务器和区域服务器。

 4.1.Client

1.客户端负责发送请求到数据库,客户端连接的方式有很多种

  • hbase shell
  • 类JDBC

 2.发送的请求主要包括

  • DDL:数据库定义语言(表的建立,删除,添加删除列族,控制版本)
  • DML:数据库操作语言(增删改)
  • DQL:数据库查询语言(查询--全表扫描--基于主键--基于过滤器)

3.client维护着一些cache来加快对hbase的访问,比如regione的位置信息

4.2.HMaster

 1.HBase集群的主节点,HMaster也可以实现高可用(active--standby),通过Zookeeper来维护主副节点的切换。

        2.为Region server分配region并负责region server的负载均衡。

        3.管理用户对table的结构DDL(创建,删除,修改)操作。

        4.当HRegionServer下线的时候,HMaster会将当前HRegionServer上的Region转移到其他的 HRegionServer。

4.3.zookeeper

        1.保证任何时候,集群中只有一个master

        2.存贮所有Region的寻址入口,存储所有的的元数据信息。

        3.实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master

        4.存储Hbase的schema,包括有哪些table,每个table有哪些column famil

4.4. HRegionServer

        1.Region server属于HBase具体数据的管理者

        2.Region server维护Master分配给它的region,处理对这些region的IO请求

        3.会实时的和HMaster保持心跳,汇报当前节点的信息

        4.当接收到Hmaster命令创建表的时候,分配一个Region对应一张表

        5.Region server负责切分在运行过程中变得过大的region

        6.当客户端发送DML和DQL操作的时候,HRegionServer负责和客户端建立连接

        7.当意外关闭的时候,当前节点的Region会被其他HRegionServer管理

4.5.HRegion

1.HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布 在不同的 HRegion server上。

        2.HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据。

        3.每个表一开始只有一个region,一个Region只属于一张表,随着数据不断插入表,region不断增大。

        4.Region达到阈值10G的时候会被平分(逻辑上平分,尽量保证数据的完整性)。切分后的其中一个Region转移到其他的HRegionServer上管理。

        5.当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个 Regionserver 上。

        6.为了防止前期数据的处理都集中在一个HRegionServer,我们可以根据自己的业务进行预分区。

4.6.Store

1.HRegion是表获取和分布的基本元素,由一个或者多个Store组成,每个store保存一个columns family。

        2.每个Store又由1个memStore和0或多个StoreFile组成。

        MemStore:当数据最开始优先写入到MemStore,当Flush的时候才会被写入到磁盘,默认情况下一个MemStore的大小为128M,当客户端向数据库插入数据的时候,当内存使用到128的时候,直接重新申请128M的空间,数据直接写入到新内存中,原来已经满的数据写到HDFS,称为HFile。

        StoreFile:数据存储文件的映射,对应HDFS上的HFile,一个Table对应多个Region,一个Region对应多个Store,一个Store对应一个MemStore和多个StoreFile,多个StoreFile内部有序,但是外部无序。集群会设置一些阈值,当达到阈值的时候开始将小文件合并成大文件。

4.7.Hlog

 1.一个HRegionServer只有一个Log文档 。

        2.WAL(Write After Log)做任何操作之前先写日志,日志也会存储到HDFS,以后MemStore丢失数据或者RegionServer异常都能通过日志进行恢复,一个RegionServer对应一个HLog.

5. HBase读写流程

5.1读取数据流程    

(1) Client访问zookeeper,获取hbase:meta所在RegionServer的节点信息。

(2) Client访问hbase:meta所在的RegionServer,获取hbase:meta记录的元数据后先加载到内存中,然后再从内存中根据需要查询的RowKey查询出RowKey所在的Region的相关信息(Region所 在RegionServer)

(3) Client访问RowKey所在的Region对应的RegionServer,发送数据读取请求

(4) RegionServer构建RegionScanner(需要查询的RowKey分布在多少个Region中就需要构建多少个RegionScanner),用于对该Region的数据检索

(5) RegionScanner构建StoreScanner(Region中有多少个Store就需要构建多少个StoreScanner, Store的数量取决于Table的ColumnFamily的数量),用于对该列族的数据检索

 (6) 多个StoreScanner合并构建最小堆(已排序的完全二叉树)StoreHeap:PriorityQueue

(7) StoreScanner构建一个MemStoreScanner和一个或多个StoreFileScanner(数量取决于 StoreFile数量)

(8) 过滤掉某些能够确定所要查询的RowKey一定不在StoreFile内的对应的StoreFileScanner或MemStoreScanner

(9) 经过筛选后留下的Scanner开始做读取数据的准备,将对应的StoreFile定位到满足的RowKey的 起始位置

(10) 将所有的StoreFileScanner和MemStoreScanner合并构建最小堆KeyValueHeap:PriorityQueue,排序的规则按照KeyValue从小到大排序

(11) 从KeyValueHeap:PriorityQueue中经过一系列筛选后一行行的得到需要查询的KeyValue。

5.2写入数据流程

(1) 首先客户端和RegionServer建立连接

(2) 然后将DML要做的操作写入到日志wal-log

(3) 然后将数据的修改更新到memstore中,然后本次操作结束(一个region由多个store组成,一个store对应一个CF(列族),store包括位于内存中的memstore和位于磁盘的storefie,写操作先写入memstore)

(4) 当memstore数据写到阈值之后,创建一个新的memstore

(5) 旧的memstore写成一个独立的storefile,regionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile,存放到hdfs。

(6) 当storefile文件的数量增长到一定阈值后,系统会进行合并

(7)在合并过程中会进行版本合并和删除工作,形成更大的storefile

(8) 当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由 hmaster分配到相应的regionserver服务器,实现负载均衡

(9) Store负责管理当前列族的数据

(10) 当我们进行数据DML的时候,以插入数据为例

  • 我们会将数据先存储到memstore中,当memstore达到阈值(128M)
  • 首先创建一个新的memstore
  • 然后会将memstore中的数据写成一个storefile,storefile会存储到hdfs上

(11) 随着时间的推移:

  • HFile中会存放大量的失效数据(删除,修改)
  • 会产生读个HFile
  • 等达到阈值(时间、数量)会进行合并,多个HFile合并成一个大的HFile,合并会触发连锁反应,相邻的store也会进行合并

(12) 在Hbase中,表被分割成多个更小的块然后分散的存储在不同的服务器上,这些小块叫做 Regions,存放Regions的地方叫做RegionServer。Master进程负责处理不同的RegionServer之间 的Region的分发。在Hbase实现中HRegionServer和HRegion类代表RegionServer和Region。 HRegionServer除了包含一些HRegions之外,还处理两种类型的文件用于数据存储。

Hadoop-HBase相关推荐

  1. Hadoop + HBase (自带zookeeper 也可单独加) 集群部署

    Hadoop+HBase搭建云存储总结 PDF http://www.linuxidc.com/Linux/2013-05/83844.htm HBase 结点之间时间不一致造成regionserve ...

  2. 【异常】org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions:

    [异常]org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions: ...

  3. ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing 解决方案

    ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing 解决方案 参考文章: (1)ERROR:org.ap ...

  4. 学习搭建Hadoop+HBase+ZooKeeper分布式集群环境

    一.环境配置 由于集群至少需要三台服务器,我就拿上次做的MongoDB Master, Slave, Arbiter环境来做Hadoop集群.服务器还是ibmcloud 免费提供的.其中Arbiter ...

  5. hbase 单机连接hadoop_随手搭hadoop+hbase(mac单机)

    摘要 单机搭hadoop+hbase流程记录 引用学习: 1.hadoop 2.7.4 单机版安装 2.HBase环境搭建 安装程序准备: hadoop-2.7.7 : https://mirrors ...

  6. hadoop +hbase +zookeeper 完全分布搭建 (版本一)

    hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA.YARN等.最新的hadoop-2.6.0又增加了YARN HA 注意:apache提供的hadoop-2.6.0的安装包是 ...

  7. Exception in thread “main“ org.apache.hadoop.hbase.client.RetriesExhaustedException: Can‘t get the l

    看尚硅谷视频,在windows上运行集群上的hbase时 package org.example;import org.apache.hadoop.hbase.HBaseConfiguration; ...

  8. 启动HBase抛出org.apache.hadoop.hbase.ClockOutOfSyncException异常:hmaster正常,节点hregionserver启动失败

    启动HBase抛出org.apache.hadoop.hbase.ClockOutOfSyncException异常 原因 节点间时间不一致,时间同步出了问题: 解决 进行时间同步: [root@cm ...

  9. hbase报错:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing

    报错 hbase(main):002:0> status 1 active master, 0 backup masters, 2 servers, 0 dead, 0.0000 average ...

  10. ERROR: org.apache.hadoop.hbase.PleaseHoldException:Master is initializing

    http://blog.csdn.net/wuzhilon88/article/details/18408149 今天想操作HBase的CRUD,启动HBase没有问题,但是使用hbase shell ...

最新文章

  1. 构建Docker镜像(三)
  2. java task多线程_JAVA语言-多线程实现的四种方式
  3. HDU5982. Relic Discovery
  4. C#——《C#语言程序设计》实验报告——泛型与集合——“画树”程序
  5. 【Boost】boost库中thread多线程详解13——线程标识符
  6. Eclipse MicroProfile:您需要了解的5件事
  7. Java基础提升高级API
  8. shell export 命令
  9. JDK10、JDK11、JDK12新特性
  10. 消防信号总线原理_消防设施操作员关键技能之八:能通过总线式消防联动控制器启动警报等装置...
  11. 关于Ajax的一揽子工程(2)
  12. Rails的静态资源管理
  13. 一文搞懂软件测试,完整总结软件测试基础知识
  14. 分享一波恋爱社交APP源码,真好~
  15. Spring Boot(二):Spring Boot中的Starter介绍
  16. wan端口未连接怎么弄_路由器WAN口未连接解决方法,WAN口未连接怎么办
  17. 通用计算机按其规模速度和功能,电脑基础知识详解
  18. windows 介绍
  19. platform创建说明
  20. Linux学习笔记——Nginx安装部署

热门文章

  1. 用Python截图(顶级理解)
  2. 小书虫app日记——(2)
  3. Windows驱动中的电源管理
  4. 阿贝云免费虚拟主机使用体验
  5. 「经典阅读」在职场,多少人输在了处关系上
  6. 三网手机实名制认证API,实名认证接口文档
  7. 化学结构命名软件对比
  8. 欢迎来辩到底要不要用黄金分割?
  9. OSChina 周五乱弹 —— 想找类似的女孩就要调用同一个父类
  10. 为MATLAB添加深度学习工具箱