HBase入门第一课:hbase基础概述&&基本架构&&读写流程&&HBase Shell

1、基础概述 

1、概述
    Apache HBase是一个构建在HDFS之上的分布式的、可扩展的、存储大数据数据库。
    当你需要基于海量数据随机实时读写操作的时候你可以使用HBase。
    HBase的目标是容纳包含数十亿计的行和数百万的列的大表。
    它是一个开源的、分布式的、版本化的非关系型数据库,它受谷歌的“BigTable”论文启发而逐渐成型。



2、特点
    a、海量数据:一个表可以有数十亿行,上百万列。
    b、列式存储:面向列族的存储和权限控制。
    c、极易扩展:添加regionserevr节点提高处理能力,添加hdfs节点提高存储能力。
    d、稀疏性:可以有任意多的可动态扩展的列,且没有数据的列不占存储空间。
    e、多版本:每个列中的数据有多个版本。
    f、高并发:高并发情况下单个regionserver节点的延迟并不会有明显的降低。

3.HBase对比RDBMS
    热点问题的解决:rowkey的设计
    数据量增大自动拆分,RDBMS不行。
    


4、HBase数据模型

A.行键rowkey:用来检索记录

  行键rowkey可以是任意的字符串,最大长度为64kb,按字典顺序存储,在HBase内部保存为字节数组
  访问HBase中的数据有三种方式:
     a.通过单个rowkey,查询一条数据
     b.通过rowkey的范围
     c.全表扫描

B.列族column family:
    列族在声明时定义,一个列族有多个列,列族是列的集合。
    面向列族的存储和权限控制及调优。
    同一列族数据存储在同一个目录下,由几个文件保存。
    

C.存储单元cell:
    HBase通过行和列及版本确定的一个cell,{row key,column,version}元祖就是一个cell。
    cell中数据以二进制形式存储,没有数据类型。

D.时间戳TimeStamp:
    在每一个列中保存了一份数据的多个版本,按时间倒序排序。
    在写入数据时,时间戳可以由HBase自动赋值(当前系统时间精确到毫秒),也可以自定义赋值(可能造成数据混乱)。
    时间戳对于hbase很重要。

F.命名空间namespace:
    相当于MySQL中的database,table从属于命名空间。
    常用于管理业务线上的各种表。
    

 2、HBase的架构

 

Zookeeper:
    HMaster的高可用。
    HRegionServer的监控并将异常信息发送给HMaster。   
    存储.meta.表的位置信息(或者说元数据信息)。

HMaster:
    为RegionServer分配region,维护整个集群的负载均衡。
    RegionServer宕机时负责region和HLog的的迁移。
    负责发送切分region和合并storefile合并的命令给从节点。

HRegionServer:
    叫RegionServer较多,HBase的从节点,内部有一个或多个region。
    处理来自客户端的读写请求,负责与hdfs底层进行交互。
    切分region和合并storefile。

    

HLog(write-ahead logfile):
    记录用户对于hbase的写操作。
    写操作时,数据并不直接写入磁盘,而要先写入内存,淡到了一定阈值再溢写到磁盘。
    但是在内存中中保存数据不安全,数据会先写入Hlog,再写入内存。
    所以系统出现故障时,可以通过HLog文件恢复数据。

Region:
    region对应于表,初始状态一个表对应一个region。
    随着数据的增加,一个region会分裂成两个region,分裂形成的新region在其他RegionServer上。
    region是根据rowkey范围横向分裂的,默认当region的一个store达到10GB时,region分裂,分裂点为rowkey的中点。
    由hbase.hregion.max.filesize控制。
    一个Region有一个或多个store。


store:
    store对应列族,初始状态store和列族一一对应,随着region的分裂多个store对应于一个列族。
    一个store由零个或多个storefile和一个menstore组成。

Memstore(写缓存):
     用户对hbase的操作首先记录HLog中,再写入memstore中,memstore满了128MB(老版本是64MB)才会写到磁盘形成storefile小文件。

StoreFile:
    当一个store内storefile小文件的数量超过3个后,系统会进行合并形成更大的全新的storefile文件。
    手动合并:
        先禁用表:disable 'student'
        再启用表:enable 'student'
    自动合并:
        一个store内storefile小文件的数量达到4个。
HFile:
    StoreFile在hdfs上的存储格式。

 读写流程

写流程:
    1、客户端访问zk,获取meta表位置信息。
    2、客户端访问meta表所在节点,获取存储表信息的regionserver节点。
    3、客户端访问表所在节点,获取表对应的region及对应的store。
    4、往store中写入信息时,先向HLog中写入操作,再向menstore中写数据。
    5、数据成功写入menstore,则返回给客户端写入成功的信息。
        

   #### 由于成功写入内存即结束写流程,所以hbase的写入比读取要快。
   #### hmaster挂了不影响写入,除非写入造成了region的分裂或storefile的合并,这两个操作都需要hmatser发送指令。
   ####没有hmaster的指令,region就不分裂,storefile不合并,可能造成数据的倾斜。
   
   #### meta表中存储的是某个范围的rowkey对应数据在哪个节点上这一信息。
        所以说,写入操作只要不涉及到region的分裂,就不会更新meta元数据表。
    


读流程:
    1、客户端访问zk,获取meta表位置信息。
    2、客户端访问meta表所在节点,获取存储表信息的regionserver节点。
    3、客户端访问表信息所在节点,获取表对应的region及对应的store。
    4、在store的menstore(写缓冲)中找数据,找不到再去blockcache(读缓存)中找,再找不到则进行
storefile的变量查找。
    5、找到了之后会将数据先放到blockcache块中方便下次查找,然后返回数据。

    ##### hmaster挂了不影响读取数据,在0.98版本前还有一个-root-表 。
    ##### 一个Regionserver上有一个BlockCache和N个Memstore。

====================================================================================
====================================================================================
====================================================================================

补充flush和storefile合并:

flush流程:
    flush操作针对的是当前regionserver的所有memstore,flush操作会阻碍客户端读写。
    内存角度:
        默认在regionserver内所有store的所有memstore占用当前节点总堆内存的40%触发。
        该值由hbase.regionserevr.global.memstore.size控制。
    时间角度:
        默认当文件在内存中保存3600000毫秒(1h)的时候触发flush。
        该值由hbase.regionserevr.optionalcacheflushinterval控制。    
    单个memstore:
        默认单个memstore到达128MB触发flush操作。
        该值由hbase.hregion.memstore.flush.size控制。

  
storefile合并:
    默认当一个store内部storefile超过3个的时候,就会触发storefile合并。
    由参数hbase.hstore.compactionThreshold控制。
    




   

HBase Shell常用操作

0、hbase shell  进入hbase shell客户端

1、help [命令]/version/status/whoami   帮助/版本/集群状态/登录用户

2、list(支持通配符)/desc      所有数据库/表结构

3、create 'default:student','info'....      建表,不指定命名空间则表建在default下  

4、put 'student','1','info:name','zhang3'      插入数据
    ####如果删除操作给定时间戳晚于插入数据时间戳,则数据不会插入
        put '表名', '行键', '列族名:列名', '列值

5、get 'student','1' [,'info:name']        单行查询/单条查询
    
    get 'student','1',{COLUMN=>'info:name',VERSIONS=>'3'} 单条版本查询

6、scan 'default:student' [,{STARTROW => '1' [,STOPROW => '10']}] 
    全表扫描[指定起[止]范围],default可以不写,别的命名空间要写,前闭后包


7、delete 'student','1','info:name'  删除一列数据
    deleteall 'student','1'    删除一个roowkey的所有数据

8、删除表:disable 'student'/drop 'student'  先禁用,再删除
        以上两步骤等价于truncate 'student'

9、count 'student'   返回表记录的条数,即rowkey的数目

10、flush 'default:student'     刷新表数据
    #####写数据先写入menstore,只有menstore达到128MB才会溢写形成storefile小文件。
    #####手动刷新表数据可以触发溢写。

11、list_namespace/create_namespace 'bigdata'  列出所有命名空间/创建命名空间

12、drop_namespace 'bigdata'  删除命名空间(没有表才可以删除)

13、alter 'student',{NAME=>'info',VERSIONS =>3}设置版本号



======================================================================
[root@Linux005 ~]#hbase hfile -p -f hdfs://Linux005:9000/hbase/data/default/student/a66a069ff35efb353cd6558e9ecafcbd/info/abb651f3c099491fa3b1cf4f851784ef

####查看hbase表文件内容。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值