Hbase总结

简要

1、Mysql里面的高表宽表在Hbase里面可以用横向切分和纵向切分。横向切分是放在多个Region里面的,纵向切分是放在多个文件夹里面的,Region我们称之为切片。

2、列名、表名等元数据信息放在HMaster里面,数据放在RegionServer里面。分区按照RowKey的规则来进行分区。逻辑上分为RowKey、Column Family、Column Qualifier、TimeStamp、Type、Value

3、为了追求效率,删除和修改时会新增一条数据,查询的时候会得到时间戳最大的数据。数据最终还是存储在HDFS上的

基本架构

1、HMaster:存储表空间、表、列名等元数据,若HMaster挂掉了,数据的增删改查还可以做,但是表级别的操作是不能操作的。

2、RegionServer:一个RegionServer节点上有多个Region,一个Region有多个Store File,格式是HFile,一个StoreFile存储的是一个列族的数据。

3、Zookeeper:维护HMaster信息,高可用时,HMaster会注册到Zookeeper上。作为与客户端操作的连接,DML主要跟ZK交互,

节点服务器间的时间,默认不能相差超过30000MS

写数据

1、客户端连上ZK,向ZK获取RegionServer信息(在ZK的 /hbase/meta-region-server),缓存到Client本地

2、根据返回的RegionServer,连上具体的RegionServer。

3、写到wal日志,wal日志写到内存(实际上代码是先构建wal日志,这个时候没有真正写到磁盘,构建完以后写到内存,然后再同步到wal日志,若发生异常,回滚内存),返回Client

4、数据先放到内存,再刷到磁盘,刷一次产生一个文件。

所以文件会有一个合并成大文件的过程,合并有小合并和大合并,默认大于三个小文件时会触发一次大合并。

小合并不会删除数据,大合并会删除数据。默认7天大合并一次,会使用大量资源。最好手动合并。

大文件大到配置的阈值(默认10G)后,会将文件按照RowKey切分,

不建议使用多个列族,如果有些列族数据少,会产生大量小文件。

flush 'stu'刷磁盘;compact合并文件

读数据

1、读取磁盘放到BlockCache,同时读取内存,将两者数据合并后返回客户端。

get 'stu', '1001', {COLUMN=>'......', VERSIONS=>'......', ......}

2、数据倾斜

大量的请求到一个节点上,需要预分区来解决。

RowKey设计

根据散列性、唯一性、长度三个原则设计。主要是根据业务需求来设计。

比如如果RowKey是递增的,可以用SPLITS =>{1,2,3,4,5,6,7,8,9}

比如手机号,可以用手机号除以分区数取模

预分区

每个区维护着StartRow与EndRow,数据会根据预分区规则存入对应的分区。

手动预分区:create 'stu', 'info', SPLITS => {'1000', '2000', '3000', '4000'}

按位比较,12345就放到'1000'这个区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值