文档章节

HBase数据模型与架构实现

为为02
 为为02
发布于 2017/03/24 23:10
字数 4036
阅读 861
收藏 34

HBase数据模型与架构实现

HBase是一个在HDFS上开发的面向列的分布式数据库,特别适合随机访问超大规模数据集.

传统的RDBMS在面向超大超大规模数据集时,会显得非常的无力.虽然部分关系型数据库可以使用 复制(repplication)和分区(partitioning)解决方案,让数据库可以由单个节点变为分布式的节点,但是这些技术都非常难以安装维护,并且这些技术会牺牲一些重要的RDBMS的特性.比如在一个扩展的RDBMS上,连接,复杂查询,触发器,视图以及外键约束这些功能要么运行开销大,要么根本无法使用. HBase则是从另一个方向来解决这个问题.它自底向上进行构建,能够简单的通过增减节点来达到线性扩展.HBase并不是关系型数据库,不支持SQL.但是在特定的问题空间里,它能够做RDBMS不能做的事:在廉价的硬件构成的集群上管理超大规模的稀疏表.

HBASE数据模型总览

在HBase中表由行和列组成,应用把数据存放在带有标签的表中.表格的"单元格"(cell)由行和列的坐标交叉决定,并且是有版本的.默认情况下,版本号是向单元格中插入数据时的时间戳.单元格的内容是未被解析的字节数组. 表中的键也是字节数组.理论上任何东西都可以通过表示成字符串或将二进制形式转化为长整型或直接对数据结构进行序列化,以此来作为键值.表中的行根据行的键值(也就是表中的主键)来进行排序.排序根据字节顺序进行,所有对表的访问都要通过表的主键. 行中的列被分为"列族"(column family).同一个列族的所有成员拥有相同的前缀.因此,像列 temperature:air 和 temperature:dew_point 都是列族 temperature的成员,而 station:identifier则属于station族.列族的前缀必须由可以打印的(printable)字符组成.而修饰性的结尾字符,即列族的修饰符,可以为任意字节. 一个表的列族必须作为表模式定义的一部分预先给出,但是新的列族成员可以随后按需要加入. 物理上所有的列族成员都一起存放在文件系统中,准确的说HBASE是一个面向列族的存储器.由于调优和存储都是在列族这个层次上进行的,所以最好使所有列族成员拥有相同的访问模式(access pattern)和大小特征. 简而言之,HBASE表和RDBMS中的表类似,单元格具有版本,行是排序的,而只要列族预先存在,客户端随时可以把列加到列族中去.

1. 区域

HBase 自动把表水平划分成区域(region),每个区域由表中行的子集构成,每个区域用它所属的表,它所包含的第一行及其最后一行(不包括这行)来表示.一开始一个表只有一个区域,但是随着区域开始变大,等到它超出设定的大小阀值,便会在某行的边界上把表拆分成两个大小基本相同的新分区.在第一次划分之前,所有加载的数据都放在原始区域所在的那个服务器上.随着表的不断变大,区域的个数也会增加.区域是在HBASE集群上分布数据的最小单位.用这种方式,一个因为太大无法放在单台服务器上的表会被放到服务器集群上,其中每个节点都负责管理表所有区域的一个子集.表的加载也是使用这种方法把数据分布到各个节点.在线的所有区域按次序排列就构成了表的所有内容.

2. 加锁

在HBase中对锁的概念是,无论对行进行访问的事物牵扯多少列,对行的更新都是原子的(atomic).这使得"加锁模型"(locking model)能够保持简单高效.

HBASE架构实现

HBase用有意master节点协调管理一个或多个regionserver从属机(如图).HBase主控(master)的负载很轻,其主要负责启动(bootstrap)一个全新的安装,把区域分配给regionserver,恢复regionserver的故障.regionserver负责零个或多个区域的管理以及响应客户端的读写请求.regionserver还负责区域的划分并通知master有了新的子区域(daughter region),这样主控机就可以把父区域设为离线,并用子区域替换父区域. HBase数据模型与架构实现 HBase依赖于ZooKeeper,默认情况下,它管理着一个ZooKeeper的实例以作为集群的"权威机构"(authority).ZooKeeper在HBase中负责根目录表(root catalog table)的位置和当前集群主控机地址等重要信息的管理.如果在区域分配的过程中由服务器宕机,就可以通过ZooKeeper来进行分配的协调.在ZooKeeper上管理分配事务的状态可以很方便的在恢复时能够从崩溃的服务器遗留的状态开始继续分配.在这种架构下客户端如果想知道集群的属性,则在客户端启动到HBase的连接时,必须拿到集群所所传递的ZooKeeper集合体(ensemble)的位置.只有这样客户端才能访问ZooKeeper的层次结构,从而了解集群的属性. HBase的从属节点列在HBase的conf/regionservers文件中.HBase的启动和结束服务的脚本使用基于SSH的机制运行远程命令,集群的站点配置(site-specific configuration)在HBase的 conf/hbase-site.xml和conf/hbase-env.sh文件中. HBase通过Hadoop文件系统API来持久化数据存储,而这个文件系统API提供多种文件系统的接口可供HBase使用:KFS,Amazon S3以及HDFS,大多数情况下都会选择使用HDFS作为存储来运行HBase.但是在默认情况下HBase会将存储写入本地文件系统.

HBase运行机制

HBase内部保留-ROOT-和.MATA.的特殊目录表(catalog table),用于维护当前集群上所有区域的列表,状态和位置.-ROOT-表包含.MATA.表的区域列表. .MATA.表包含所用用户空间区域(user-space region)的列表.表中的项使用区域名作为键.区域名由所属的表名,区域的起始行,区域的创建时间以及其整体进行的MD5哈希值组成.又因为行的键是有序的,因此在查找一个特定的行所在的区域时只需要在目录表中找到第一个大于或等于给定行的键的项就可以了.当区域发生分裂,禁用/启用,删除,为负载均衡重新部署区域或由于regionserver崩溃而重新部署区域等变化时,目录表就会进行相应的更新.这样集群上所有区域的状态信息就能保持是最新的. 新连接到ZooKeeper集群上的客户端首先查找-ROOT-的位置.然后客户端通过-ROOT-获取所请求行所在范围所属 .MATA. 区域的位置.客户端接着查找.META.区域来获取用户空间区域所在的节点及其位置.接着,客户端就可以直接和管理那个区域的regionserver进行交互.每个行操作可能要访问三次远程节点.为了节省这些代价客户端它们遍历-ROOT-时获取的信息和 .MATA. 位置以及用户空间区域的开始行和结束行.客户端在碰到错误之前会一直使用所缓存的项.当发生错误时,客户端会再去查看 .MATA.的获取区域的新位置.如果 .MATA. 也被移动了,客户端会再去查看 -ROOT-. 到达regionserver的写操作首先被追加到"提交日志"(commit log)中,然后会被加入内存中的memstore.如果memstore满,它的内容会被刷入(flush)文件系统. 提交日志存放在HDFS中,因此即使一个regionserver崩溃,提交日志仍然可以.不能访问(通常因为服务器的znode在 ZooKeeper 中过期)主控机会根据区域对死掉的regionserver 的提交日志进行分割.重新分配后,在打开并使用死掉的regionserver上的区域之前,这些区域会找到属于它们的从被分割提交日志中得到的文件,其中包含还没有被持久化存储.这些更新会被重做(replay)以使区域恢复到失败前的状态. 在读的时候首先查看区域的memstore.如果在memstore中找到了需要的版本,查询就结束了.否则,需要按照次序从新到旧检查"刷新文件"(flush file),直到找到满足查询的版本,或所有刷新文件都处理完为止. 有一个后台进程负责在刷新文件个数到达一个阀值时压缩它们.它把多个文件重新写入一个文件.这是因为读操作检查的文件越少,它的执行效率越高.在压缩(compaction)时,进程会清理掉超出模式所设最大值的版本以及删除单元格或标识单元格已过期.在regionserver上,另外一个独立的进程监控这刷新文件的大小,一旦文件大小超出预先设定的最大值,便对区域进行分割.

HBase测试驱动

要启动在分布式环境下运行的 HBase 首先要启动hadoop,这样才能让hbase工作到 HDFS 之上.上面说过,分布式的hbase需要 zookeeper做协调.故而我们需要首先安装zookeeper.zookeeper 的配置文件如下 conf/zoo.cfg

    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial 
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between 
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just 
    # example sakes.
    dataDir=/tmp/zookeeper/data
    dataLogDir=/tmp/zookeeper/log
    # the port at which the clients will connect
    clientPort=2181
    server.1=master:2888:3888
    server.2=slave1:2888:3888
    server.3=slave2:2888:3888

将三台服务器的 zookeeper 的 conf/zoo.cfg 都更改为以上的配置,注意配置文件所指明的 dataDir 和 dataLogDir 都需要手动创建. 对于配置项 server.1=master:2888:3888 其中的 server.1 代表编号为1的服务器,而 master 为主机名或主机ip地址.2888为该server和集群中的leader交换消息所使用的端口. 3888为选举leader时所使用的端口. 然后我们还需要在 ${dataDir}目录下创建一个名为 myid 的文件,文件内容就是当前服务器的编号,如 server.1 就应该在 ${dataDir}/myid 文件中写入 1.然后执行 ${zookeeper}/bin/zkServer.sh 脚本以启动zookeeper.

    root[@master](https://my.oschina.net/u/48054):/usr/lib/apache/zookeeper-3.4.9# zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /usr/lib/apache/zookeeper-3.4.9/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED

输入 jps 查看java程序的运行情况.

    root[@master](https://my.oschina.net/u/48054):/usr/lib/apache/zookeeper-3.4.9# jps
    1410 SecondaryNameNode
    1877 Jps
    1829 QuorumPeerMain
    1195 NameNode
    381 ResourceManager

1829 QuorumPeerMain就代表这zookeeper进行 1829 时进程号.接下来再去HBase的安装目录 ${hbase} 配置 HBase.

  1.  conf/hbase-site.xml 配置

    <?xml version="1.0"?>

    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

    <configuration> <property> <name>hbase.rootdir</name> <value>hdfs://master:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/tmp/zookeeper/data</value> </property> <property> <name>dfs.support.append</name> <value>true</value> </property> </configuration>

hbase.rootdir为 hdfs 中作为hbase跟路径的目录 hbase.zookeeper.quorum 则用来指定zookeeper服务器,多个服务器中间使用,隔开.hbase.zookeeper.property.clientPort 则用来指定 zookeeper 客户端口. 2. conf/hbase-env.sh

    # The java implementation to use.  Java 1.7+ required.
    # export JAVA_HOME=/usr/java/jdk1.6.0/
    export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_111
    # Extra Java CLASSPATH elements.  Optional.
    # export HBASE_CLASSPATH=
    
    
    # Extra Java runtime options.
    # Below are what we set by default.  May only work with SUN JVM.
    # For more on why as well as other possible settings,
    # see http://wiki.apache.org/hadoop/PerformanceTuning
    export HBASE_OPTS="-XX:+UseConcMarkSweepGC"
    
    # Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
    export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
    export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

    export HBASE_MANAGES_ZK=false

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_111为系统jdk的路径,export HBASE_MANAGES_ZK=false 的意思时关闭hbase自带的zookeeper使用自定义的zookeeper当使用自己的zookeeper时,这个选项必不可少.然后输入 ${hbase}/bin/start-hbase.sh

    root[@master](https://my.oschina.net/u/48054):/usr/lib/apache/hbase-1.2.4# start-hbase.sh
    starting master, logging to /usr/lib/apache/hbase-1.2.4/logs/hbase--master-master.out
    slave1: starting regionserver, logging to /usr/lib/apache/hbase-1.2.4/bin/../logs/hbase-root-regionserver-slave1.out
    slave2: starting regionserver, logging to /usr/lib/apache/hbase-1.2.4/bin/../logs/hbase-root-regionserver-slave2.out
    master: starting regionserver, logging to /usr/lib/apache/hbase-1.2.4/bin/../logs/hbase-root-regionserver-master.out

至此hbase就成功的在分布式集群上运行了.使用 jps命令进行查看

    root[@master](https://my.oschina.net/u/48054):/usr/lib/apache/zookeeper-3.4.9# jps
    1410 SecondaryNameNode
    1829 QuorumPeerMain
    2198 HRegionServer
    1195 NameNode
    2043 HMaster
    381 ResourceManager
    2255 Jps

进程号为 2043 的进程集为 hbase master节点的实例.要管理hbase的实例,键入以下命令启动hbase shell环境.

    hbase shell

这将启动一个加入了一些HBase 特有命令的 JRuby IRB 解释器.输入 help 可以查看已分组的 shell 命令列表.输入 help COMMAND_GROUP 可以查看某一类命令的帮助,而输入 help COMMAND 则能获得某个特定命令的帮助信息和用法示例.命令使用 Ruby 的格式来指定列表和目录.

要新建一个表,必须先为你的表起一个名字,并为其定义模式.一个表的模式包含表的属性和列族的列表.列族本身也有属性,可以在定义模式时依次定义它们.例如,列族的属性包括列族是否应该在文件系统中被压缩存储,一个单元格要保存多少个版本等等.模式可以被修改,需要修改时把表设为"离线"(offline)即可.在外壳环境中使用 disable 命令可以把表设为离线,使用 alter 命令可以进行必要的修改,而 enable 命令则可以把表重新设为 "在线" (online). 要想新建一个名为 test 的表,使其只包含一个名为 data 的列,表和列族属性都为默认值,则键入以下命令:

    hbase(main):001:0> create 'test','data'
    0 row(s) in 2.6780 seconds

为了验证新表是否创建成功,运行 list 命令.这会输出用户空间中的所有的表:

    hbase(main):002:0> list
    TABLE                                                                                                                   
    test                                                                                                                    
    1 row(s) in 0.0370 seconds

要在列族 data 中三个不同的行和列上插入数据,然后列出表的内容,输入如下:

    hbase(main):003:0> put 'test','row1', 'data:1' , 'value1'
    0 row(s) in 0.1320 seconds
    
    hbase(main):004:0> put 'test','row2', 'data:1' , 'value2'
    0 row(s) in 0.0060 seconds
    
    hbase(main):005:0> put 'test','row1', 'data:3' , 'value3'
    0 row(s) in 0.0380 seconds
    
    hbase(main):006:0> scan 'test'
    ROW                             COLUMN+CELL                                                                             
     row1                           column=data:1, timestamp=1490367514104, value=value1                                    
     row1                           column=data:3, timestamp=1490367554494, value=value3                                    
     row2                           column=data:1, timestamp=1490367528373, value=value2                                    
    2 row(s) in 0.0360 seconds
    
    hbase(main):007:0> put 'test','row3', 'data:3' , 'value3'
    0 row(s) in 0.0040 seconds
    
    hbase(main):008:0> put 'test','row4', 'data:4' , 'value4'
    0 row(s) in 0.0050 seconds
    
    hbase(main):009:0> scan test
    ArgumentError: wrong number of arguments (0 for 2)
    
    hbase(main):010:0> scan 'test'
    ROW                             COLUMN+CELL                                                                             
     row1                           column=data:1, timestamp=1490367514104, value=value1                                    
     row1                           column=data:3, timestamp=1490367554494, value=value3                                    
     row2                           column=data:1, timestamp=1490367528373, value=value2                                    
     row3                           column=data:3, timestamp=1490367628850, value=value3                                    
     row4                           column=data:4, timestamp=1490367642886, value=value4                                    
    4 row(s) in 0.0150 seconds

为了移除这个表,首先要把它设为禁用,然后删除:

    hbase(main):011:0> disable 'test'
    0 row(s) in 4.3680 seconds
    
    hbase(main):012:0> drop 'test'
    0 row(s) in 8.3250 seconds
    
    hbase(main):013:0> list
    TABLE                                                                                                                   
    0 row(s) in 0.0050 seconds

通过运行以下命令来关闭 HBase 实例:

© 著作权归作者所有

为为02
粉丝 51
博文 44
码字总数 99356
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

f
flag_7
很清楚!
看完以后顿时感觉明了了
hbase 数据库简介安装与常用命令的使用

一:hbase 简介与架构功能 二:hbase 安装与配置 三:hbase 常见shell 命令操作 一:hbase 简介与架构功能 1.1 为什么要使用hbase 数据库 1.2 hbase 简介: 1.3 HBase与Hadoop的对比 1.4 HB...

flyfish225
2018/04/12
0
0
HBase原理深入解析(一)----HBase架构总览

前言:掌握Hbase的重要性不言而喻,掌握Hbase的设计原理更是重中之重。本文是对HBase原理进行讲解系列文章的开篇,本文尽量详细的从整体上介绍HBase的架构,并对每个部分的名词进行初步解释,...

小北觅
2018/08/26
0
0
分布式数据库HBase的架构设计详解

本文根据DBAplus社群第99期线上分享整理而成。 讲师介绍 主题简介: 1、传统数据库回顾 2、分布式基础理论 3、HBase特征 4、HBase底层架构 5、HBase设计要点 近些年来,各种互联网+的公司如雨...

陈鸿威
2017/05/15
0
0
小米分布式 Key-Value 存储系统 - Pegasus

Pegasus 是小米云存储团队开发的一个分布式 Key-Value 存储系统,最初的动机是弥补 HBase 在可用性和性能上的不足。Pegasus 系统的 Server 端完全采用 C++ 语言开发,使用 PacificA 协议支持...

匿名
2017/10/19
7.4K
7
Apache旗下顶级盛会HBaseConAsia2019将于7月20日在北京举行

Apache HBase介绍 Apache HBase是基于Apache Hadoop构建的一个高可靠性、高性能、可伸缩的分布式存储系统,它提供了大数据背景下的高性能的随机读写能力,HBase是Google Big table的开源实现...

正研
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
7
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部