美文网首页
初识HBase

初识HBase

作者: 谭英智 | 来源:发表于2020-08-16 00:08 被阅读0次

如果HBase集群之间的时间差超过30s,则会导致regionServer无法启动

删除表必须先diable表

删除namespace必须先清空ns内的表

修改数据会增加一行,并带时间搓,查询的时候,取最大时间戳那条

删除会增加一行,并带时间戳,并标记为删除

如果修改或者删除时候带的时间错比最大的小,会导致修改无效

表可以指定版本,查询的时候带版本可以获取一个列的多个版本的数据,表示表可以为每条记录保留的版本数

内存达到一定阈值则开始刷写,但是不阻塞,达到阈值的上线,则阻塞客户端写操作,并直到刷写完毕,

触发刷写的条件

https://pan.baidu.com/s/1IcipwNjDDJqYWXvjatKumw#list/path=%2F

27gx

定义

HBase是一个分布式,可扩展,支持海量数据存储的NoSql数据库

数据模型

逻辑上,它跟关系型数据库类似,数据存放在一张表中,有行有列。但实际在底层物理存储结果,是以K-V来存的

逻辑结构

hbase-struct
  • 一张表由列族/列/rowkey组成
  • 不同的列族存放在不同的hdfs文件中
  • 根据配置的大小,表会按照rowkey水平切分为不同的region存放在不同的hdfs文件中
  • 列和value是表的数据,初始建表不需要指定列名

物理结构

hbase-store
  • 数据会存放到hdfs上
  • 每一行的每个列是在hdsf中式一行或者多行数据(历史数据)
  • 每一行中的每一列都有一个时间戳,在获取此cell数据时,会取时间戳最大的那个value
  • 如果cell被删除,那么也会往hdfs上新增一条数据,并标记为删除
  • 如果同一个cell含有多个行,会在major merge时把多行合并成一行

术语

Name Space

命名空间,类似于数据库名,hbase自带两个命名空间,hbase和default,hbase存放内置的表,default为用户默认使用的命名空间

Region

可以理解为以水平切割的一个分表,是按rowkey切分的一个表,初始时只有一个region,当大小达到阈值,会切分成多个region,用于加快检索速度

Row

表中每行都有一个rowkey,一个row有多个col,hdfs以rowkey的字典序存储,查询数据是必须用rowkey来定位数据。

Column Famliy

列族可以理解为以垂直切分的一个分表,需要在建表时指定,官方推荐使用每个表只使用一个列族,这样可以减少小文件的出现,例如每个列族的大小相差很大的时候,会出现有些列族的文件大,而某些列族的文件非常小

Column

列可以动态变化,每行可以拥有不同的col,不需要指定,它属于表中的数据

Time Stamp

代表每行数据的插入时间,hbase使用它来做版本控制,但同一个col有多行数据时,取时间戳最大的那一行,时间戳可以在客户端发put命令时指定,如果此时客户端指定的时间戳小于hbase的那行数据的时间,则会导致更新无效

Cell

是一行里面对应col的数据,没有类型,以字节方式存储,获取和写入时,需要序列和反序列化

架构图

hbase-overview

client

client通过hbase的接口访问Hbase,client会缓存集群的元素据来加速访问,元数据的信息有regionserver在集群对应表和ip的信息

Zookeeper

  • HMaster通过ZK来选举产生,提供HMaster的高可用
  • 监控RegionServer的状态,当RS出现异常,通知HMaster以方便HMaster进行RS的重新分配调度
  • 提供元数据的统一入口,元数据也是存放在HDFS上的

HMaster

  • 为RS分配Region
  • 负责整个集群的负载均衡
  • 通过操作ZK,维护集群的元数据
  • 当Region失效,则将失效的Region分配到正常的RS上
  • 当RS失效,则协调对应的HLog进行拆分
  • 进行DDL的操作
  • 不负责DML的操作

HRegionServer

  • 处理DML
  • 管理多个Region
  • 负责与HDFS的交互
  • 负责Region的拆分和StoreFile的合并
  • 维护HLog

HDFS

  • 存储HLog/WAL
  • 存储元数据
  • 存储表数据
  • 提供分布式存储,多副本,保证高可用

HLog

修改记录时,HBase并不是直接写入HDFS和磁盘,而是先追加到HLog,然后写入内存,在配置时间内再刷写到磁盘,如果这中间机器出现故障,可以通过HLog恢复

Store

Region中的Stroe代表一个列族一个Store

MemStore

内存存储,用于保存最近的数据操作

HFIle

HBase的物理存储文件,并存放在HDFS上

写流程

hbase-write
  • client问ZK meta的RS位置
  • client连接RS获取meta表并缓存
  • client查询根据rowkey,region,colFamily查询meta表获取RS位置
  • client向RS写入数据
  • RS写入HLog并更新memstore,然后返回
  • 在后面一定时间内,RS写入磁盘并同步到HDFS

读流程

hbase-read
  • client向ZK请求meta的RS
  • client向RS请求meta
  • 根据rowkey找到RS
  • 向RS请求du
  • RS获取内存数据,磁盘数据和HDFS的数据,并做合并,最终把结果返回client

Flush

每次在客户端输入Flush ‘tableName’都会在HDFS生成一个文件,内容为memstore合并后的内容

如果RegionServer memstore的内存使用达到配置内存的上限,则会阻塞写操作,直到刷写完到磁盘,其他情况的刷写,不会阻塞写操作

触发条件

  • 整个RegionServer的内存达到regionserver的下限
  • 整个RS在一定时间内无写操作
  • 某个RS的memstroe大小达到配置的大小
  • 当hlog的个数达到上限,一个hlog的大小为128m或配置值

Region合并

由于某些Region删除了大量的数据,导致Region内的HFile过小,那么此时就有必要通过合并Region来减少小文件

冷合并

前提时HMaster和HRegionServer都停掉,否则会报错,不适用于生产环境

hbase org.apache.hadoop.hbase.util.Merge table_name\
table_name,a,147608089478.39erijidsfd8s098fen32j3i8d9. \
table_name,b,148893879502.48jfidnxoskd023843257822j3i.

热合并

不需要停机

 merge_region '39erijidsfd8s098fen32j3i8d9','48jfidnxoskd023843257822j3i'

HFile Compaction

由于每次Flush都会从memstroe产生一个HFile,时间长了,会导致HDFS上出现很多小文件,此时有可能同一个cell会有多个版本出现在不同的HFile中,如果此时查询就需要遍历所有的Hfile才可以找到对应的rowkey,所以为了清理过期和删除的数据,就需要进行对HFile合并

Minor Compaction

会把若干个小文件单纯的合并成一个文件,而不会清理过期和删除的数据

Major Compaction

会把Store下的所有HFile合并成一个大HFile,并清理过期和删除数据

触发条件

  • HFIle超过阈值的最小值,一次最多合并配置的最大值,会触发Minor compact
  • 当HFIle超过配置的最大数,会阻塞客户端写
  • 当Major Compaction的最大周期到达,会做全量合并,建议设置为0,手工触发,在低峰时候执行
  • 当HFile文件数超过阈值,会触发Major Compaction

Region Split

当1个Region的某个store下所有的StoreFile的总大小超过min(R^2*memstore.size,maxSize),会进行split,R为当前table的个数

可以看出这有可能越往后切割的文件会越来越大,直到到达10G。

DDL&DML

进入命令行

Hbase shell

查看有哪些表

list

建表

create 'tableName' 'colFamilyName'

插入/更新数据

put 'tableName','rowkey','colFaimilyName:colName','value'

查看所有记录

scan 'tableName'
scan 'tableName', {startrow=>'rowkey', stoprow=>'rowkey'}

查看表结构

describe 'tableName'

查看某行

get 'tableName','rowKey'
get 'tableName','rowKey','colFamily:col'

表行数

count 'tableName'

删除某rowkey的全部数据

deleteall 'tableName','rowkey'

删除某列

delete 'tableName','rowkey','colFamily:col'

清空表

disable 'tableName'
truncate 'tableName'

删除表

disable 'tableName'
drop 'tableName'

改变表存放的版本数

alter 'tableName',{NAME=>'colFamily',versions=>3}
get 'tableName','rowKey',{column=>'colFamily:col',versions=>3}

相关文章

  • 初识Hbase

    1.1海量数据与NoSQL 1.1.1 关系型数据库的极限 表会被并发地进行插入、编辑以及删除操作。一个大中型网站...

  • 初识 HBase

    HBase简介 对大数据领域有一定了解的小伙伴对HBase应该不会陌生,HBase是Apache基金会开源的一个分...

  • 初识HBase

    如果HBase集群之间的时间差超过30s,则会导致regionServer无法启动 删除表必须先diable表 删...

  • NoSQL-Hbase-Hbase初识

    一、引言 在之前的文章行式存储VS列式存储中,我们通过对比学习的方式,了解了什么是列式存储。也通过NoSQL-HD...

  • Hbase运行机制

    本文思路 Hbase是什么 Hbase的优劣 Hbase架构 Hbase容错 Hbase使用总结 HBase是什么...

  • 数据存储-Hbase基础

    Outline 什么是Hbase 为什么需要Hbase Hbase的基础概念 Hbase的架构 Hbase的读写操...

  • HBase集群的搭建

    HBase集群搭建 HBase官网:http://hbase.apache.org/[http://hbase.a...

  • 2018-07-09 HBase shell commands

    HBase shell commands As told in HBase introduction, HBase...

  • HBase基础

    HBase简介 HBase是Apache顶级项目HBase: Hadoop database HBase内部管理的...

  • HBase读写数据流程

    hbase的系统表 hbase:namespace 存储了hbase中的所有namespace的信息 hbase...

网友评论

      本文标题:初识HBase

      本文链接:https://www.haomeiwen.com/subject/jzgwcktx.html