大数据组件-Hbase

举报
芝士味的椒盐 发表于 2022/04/23 10:41:52 2022/04/23
【摘要】 ​ ​👨🏻‍🎓博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家🌟🌈擅长领域:Java、大数据、运维、电子🙏🏻如果本文章各位小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏,相应的有空了我也会回访,互助!!!🤝另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!! 目录​概念特点分布式hb...

 


👨🏻‍🎓博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家🌟
🌈擅长领域:Java、大数据、运维、电子
🙏🏻如果本文章各位小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏,相应的有空了我也会回访,互助!!!
🤝另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!!
 


目录

概念

特点

分布式

hbase原理

hbase架构

Hbase Shell操作

基本操作

表的操作

hbase数据结构

HBase原理

数据flush过程

数据合并过程


概念

  • HBase是一个基于HDFS口的非关系型面向列的分布式数据库。这是一个NoSQL开源数据库,其中的数据存储在行和列中。单元格是行和列的交集。
  • 每个单元格值都包含一个"版本”属性,该属性仅是唯一标识该 单元格的时间戳。映射中的每个值都是不间断的字节数组

特点

  • 海量存储
    • Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正式因为Hbase良好的扩展性,才为海量数据的存储提供了便利
  • 列存储
    • 这里的列式存储其实说的是列族(ColumnFamily)存储,Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定
  • 极易扩展
    • Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。 通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。
    • 备注:RegionServer的作用是管理region、承接业务的访问,这个后面会详细的介绍通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。
  • 高并发
    • 由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。
  • 稀疏
    • 稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

分布式

  • 分布式用户



    • 为了解决分布式用户下集群上session类的用户数据进行更好的进程之间通信,减少程序进程之间的通信消耗演变而来的——Spring
  • 分布式系统



  • 客户负载均衡


    • 并发:指的是线程的并发,抢占资源
    • s并行:指的是进程的并行,多核cpu,同时进行
    • 去中心化,无需负载均衡的引导,都会知道数据的流向,这就是Redies无需负载均衡器中心,结点互相保留了信息

    hbase原理


hbase架构



  • Region:分区
  • HLog:预写日志
  • Stor:列族
  • ZK:zookeeper高可用,检测节点心跳
  • HMaster:Hbase的集群master
  • Men Store:Cache缓存

Hbase Shell操作


基本操作

1.进入HBase客户端命令行

hbase shell
  1. 查看帮助命令
hbase(main):001:0> help
  1. 查看当前数据库中有哪些表
hbase(main):002:0> list

表的操作

1.创建表

hbase(main):002:0> create 'student','info'

2.插入数据到表

hbase(main):003:0> put 'student','1001','info:sex','male'

hbase(main):004:0> put 'student','1001','info:age','18'

hbase(main):005:0> put 'student','1002','info:name','Janna'

hbase(main):006:0> put 'student','1002','info:sex','female'

hbase(main):007:0> put 'student','1002','info:age','20'

3.扫描查看表数据


hbase(main):008:0> scan 'student'

hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW => '1001'}

hbase(main):010:0> scan 'student',{STARTROW => '1001'}
  • {STARTROW => '1001', STOPROW => '1001'}:查看的是startrow(开始行)从1001(包含边界值),到stoprow(不包含边界值),比较的方式一类似ASCII码的逐位比较大小,若没有一位大于stoprow值则视为比其小。

4.查看表结构

hbase(main):011:0> describe 'student'

5.更新指定字段的数据

hbase(main):012:0> put 'student','1001','info:name','Nick'

hbase(main):013:0> put 'student','1001','info:age','100'
  • 覆盖原有的达到更新

6.查看“指定行”或“指定列族:列”的数据

hbase(main):014:0> get 'student','1001'

hbase(main):015:0> get 'student','1001','info:name'

7.统计表数据行数

hbase(main):021:0> count 'student'

8.删除数据

删除某rowkey的全部数据:

hbase(main):016:0> deleteall 'student','1001'

删除某rowkey的某一列数据:

hbase(main):017:0> delete 'student','1002','info:sex'

9.清空表数据

hbase(main):018:0> truncate 'student'
  • 提示:清空表的操作顺序为先disable,然后再truncate。

10.删除表

首先需要先让该表为disable状态:

hbase(main):019:0> disable 'student'

然后才能drop这个表:

hbase(main):020:0> drop 'student'
  • 提示:如果直接drop表,会报错:ERROR: Table student is enabled. Disable it first.

11.变更表信息

将info列族中的数据存放3个版本:

hbase(main):022:0> alter 'student',{NAME=>'info',VERSIONS=>3}
hbase(main):022:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
  • VERSIONS:可以指定保存版本数量,put真正表示的新增,只不过展示数据的只展示最新的那条,想看之前的数据可以通过保存版本数据量之内的数据,结合TimeStamp时间戳进行判断。
  • scan 't1',{RAW ⇒true,VERSION ⇒ 10}可以查看已经删除,但还没有被被真正的删除的隐藏起来找时机删除的信息

12.查看命名空间列表

hbase(main):007:0> list_namespace

13.创建命名空间

hbase(main):008:0> create_namespace 'infomation'

14.删除命名空间

hbase(main):009:0> drop_namespace 'infomation'

15.往创建的命名空间里添加表

hbase(main):010:0> create 'infomation:emp','info'

hbase数据结构

  • RowKey

    RowKey用于检索记录的主键,访问HBase table中的行有三种方式:

    1. 通过单个RowKey访问(get)
    2. 通过RowKey的range(正则)(like)
    3. 全表扫描(scan)

    RowKey行键可以是任意字符串(最大长度64KB,实际长度为10~100byte)RowKey保存为字节数组(字节压缩的能力更大,更好利用空间),存储时按照RowKey(byte order)的字典顺序存储。设计Rowkey时,要充分利用排序存储这个特性,将经常一起读取的行存储到一起(位置相关性)。

  • Column Family

    列族:HBase表中的每个列,都属于某个列族。列族是schema的一部分(列不是),必须在使用表定义之前定义。列名都以列族作为前缀,例如:course:history,course:math属于course这个列族。

  • Cell

    由{rowkey,column Family:column,version}唯一确定的单元。cell中的数据时没有类型的,全是字节码形式存储。(无类型、字节码)

  • Time Stamp

    HBase中通过Rowkey和Columns确定的为一个存储单元称为cell。每个cell都保管着同一份数据的多个版本。

  • Name Space(命名空间)



    1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。

    **2) RegionServer group:**一个命名空间包含了默认的RegionServer Group。

    **3) Permission:**权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。

    **4) Quota:**限额,可以强制一个命名空间可包含的region的数量。

HBase原理

  • 读流程



    1)Client先访问zookeeper,从meta表读取region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息;

    2)根据namespace、表名和rowkey在meta表中找到对应的region信息;

    3)找到这个region对应的regionserver;

    4)查找对应的region;

    5)先从MemStore找数据,如果没有,再到BlockCache里面读;

    6)BlockCache还没有,再到StoreFile(HFile)上读(为了读取的效率);

    7)如果是从StoreFile(HFile)里面读取的数据,不是直接返回给客户端,而是先写入BlockCache,再返回给客户端。

  • 写流程数据flush过程



    1)Client向HregionServer发送写请求;

    2)HregionServer将数据写到HLog(write ahead log)。为了数据的持久化和恢复;

    3)HregionServer将数据写到内存(MemStore);

    4)反馈Client写成功。

    数据flush过程

    1)当MemStore数据达到阈值(默认是128M,老版本是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog(预写日志)中的历史数据;

    2)并将数据存储到HDFS中;

    3)在HLog(预写日志)中做标记点。

    数据合并过程

    1)当数据块达到3块,Hmaster触发合并操作,Region将数据块加载到本地,进行合并;

    2)当合并的数据超过256M,进行拆分,将拆分后的Region分配给不同的HregionServer管理;

    3)当HregionServer宕机后,将HregionServer上的hlog(预写日志)拆分,然后分配给不同的HregionServer加载,修改.META.;

    4)注意:HLog(预写日志)会同步到HDFS。


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。