HBase一些知识提醒

本文深入探讨了HBase的部署架构,包括HMaster、RegionServer和ZooKeeper的角色。介绍了HBase的存储结构,如行键、列族、列和版本。详细阐述了HBase的shell操作及客户端API的使用,包括Put、Get、Delete、Scan等。此外,还讨论了HBase的缓存、WAL、Region分裂和合并、HFile以及MemStore的管理策略。文章还涉及了HBase的过滤器、协处理器以及JVM调优等方面,为理解HBase提供了全面的知识指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

部署架构---->HMaster负责协调工作,负责建表、删表、移动Region、合并操作等。RegionServer是负责做数据存储的,以及客户端的CRUD等都是通过ZooKeeper来与RegionServer交互的。ZooKeeper管理了HBase所有的RegionServer信息,包括具体的数据段存放在哪个RegionServer上。

存储架构:一个列或者多个列组成一个行。每个行拥有唯一的行键,一个列有多个版本,多个列可以被归为一个列族。行键是根据字典进行排序的。

表的很多属性,比如过期时间、数据块缓存以及是否压缩等都是定义在列族上,而不是定义在表上或者列上。同一个表里的不同列族可以有完全不同的属性配置,但是同一个列族内的所有列都会有相同的属性,因为他们都在一个列族里面,而属性都是定义在列族上的。在HBase中一个列的名称前面总是带着它所属的列族。比如cf:age。
一个Region就是多个行的集合。Region中行是根据行键来排序的。

HBase shell操作:
create–创建表–create 表名称 列族名称
list–查看库中有哪些表
describe–查看表的属性–describe 表名称
put–插入数据/修改某个列的数据–put 表名称,行键,列族:列,列的值
scan–查看表的多条数据–scan 表名称,{STARTROW=>行键,ENDROW=>行键}
get–获取表的一个单元格数据–get 表名称,行键,列族:列/get 表名称,行键,{COLUMN=>列族:列,VERSIONS=>版本数}
delete–删除数据–delete 表名称,行键,列族:列
deleteall–删除整行数据–deleteall 表名称,行键
disable–停用表–disable 表名称
drop–删除表–drop 表名称

客户端API:
使用Table接口。官方建议大家先手动获取Connection,然后再从Connection中获取Table接口(注意:不是HTable类,而是Table接口)。具体的操作是由HTable类来实现的。

在HBase中所有数据都是bytes。在HBase中数据最终都会被序列化为bytes[]保存,所以一切可以被序列化为bytes的对象都可以作为rowkey。

Put对象的构造方法:
在这里插入图片描述
Put操作:
put操作
Put提供了一个语法糖,每一个addColumn返回的都是Put对象自己,所以可以把所有的列添加方法连接起来。
在这里插入图片描述
checkAndPut方法:
checkAndPut(byte[] row, byte[] family, byte[] qualifier,
byte[] value, Put put)
checkAndPut(byte[] row, byte[] family, byte[] qualifier,
CompareFilter.CompareOp compareOp, byte[] value, Put
put)
类似与Java并发中的原子操作,先比较和之前的值是否相同,若相同则修改并返回true,若不相同,则返回false。

Put.has方法:检查数据是否存在。
在这里插入图片描述
Append方法:
append方法不会创建或者修改行或列,它只做往列上的字节数组添加字节。
在这里插入图片描述
使用append来添加数据有两种方式,一种是提供列族、列和值,比
如我想在mycf:name尾部添加字符串Wang,可以这样写:
在这里插入图片描述
Append.add的另一种调用方式是直接提供一个单元格对象,比如:
在这里插入图片描述
Increment方法:数据库中某个列的数字加法操作。
Increment(byte[] row)
Increment(byte[] row, int offset, int length)
Increment(Increment i)
在这里插入图片描述
Get方法:
在这里插入图片描述
Result类:用户调用get之后,HBase会把查询到的结果封装到Result实例中。
Cell接口:在一些早期的教程中经常提到HBase API返回的最小数据单位
KeyValue类,这个类现在 已经被废弃了,转而采用Cell接口。
用getColumnCells方法获取到这个列的多个版本值(早期的
getColumn()方法已经被废弃):
在这里插入图片描述
在这里插入图片描述
exists方法:Table接口还提供了exists方法来快速查询某个数据是否存在,而
不需要获取该数据的所有值:boolean exists(Get get)
该方法的传参同样也是一个Get对象,但是exists方法不会返回服
务端的数据。不过使用这个方法并不会加快查询的速度,但是可以节省
网络开销。不过在你查询一个比较大的列的时候,可以有效地缩短网络
传输的时间。

Delete方法:删除指定的内容。
除了把整行删除掉,还可以更细粒度地删除数据,只需要在Delete对象上调用相应的方法,比如
addFamily(byte[] family):删除指定的列族。
addFamily(byte[] family, long timestamp):删除指定的列族中所有版本号等于或者小于给定的版本号的列。
addColumns(byte[] family, byte[] qualifier):删除指定列的所有版本。
addColumns(byte[] family, byte[] qualifier, long
timestamp):删除指定列的等于或者小于给定的版本号的所有版本。
addColumn(byte[] family, byte[] qualifier, long
timestamp):删除指定列的特定版本。
addColumn(byte[] family, byte[] qualifier):删除指定列的最新版本。

checkAndDelete方法:检查之前的列的内容是否改变,若没有改变则执行删除操作返回true,否则不执行删除操作返回false。
checkAndDelete(byte[] row, byte[] family, byte[] qualifier, byte[] value, Delete delete)
checkAndDelete(byte[] row, byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, byte[]
value, Delete delete)

mutation方法
根据前面提到的方法,如果我们想在一行中添加一列的时候同时删
除另一列(Column),只能构建一个Put来新增列然后新建一个Delete
对象来删除另一列,这两个操作要分两步执行,而且这两步肯定不属于
一个原子操作,这样既麻烦又危险。Table接口提供了一个方法
mutateRow可以把这两个操作放到同一个原子操作内。
实际上这个方法可以放入任意多个操作,这些操作都可以放在一个
原子操作内完成。
在这里插入图片描述
checkAndMutate方法:与之前的check方法类似。

批量操作:在这里插入图片描述
在这里插入图片描述
批量put操作:
在这里插入图片描述
插入失败的重试
对于插入失败的数据,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值