1 hbase行健设计
遵循规则: 唯一 ,有序, 可识别性 ,读写性能的最佳优化
这种优化级别从左到右,逐渐递减。
同时,rowkey基本是由多个字段共同构建而成,可以根据业务需求,将这些字段用不同分隔符来间隔
比如用 a|b:c
比如电商的这个:
产品编码+用途:_ : 多种分隔符
时间戳_userID:djy
时间戳_userID:yhj
时间戳决定唯一有序, useID决定可识别,djy代金卷/yhj优惠卷 决定读写速度,因为用字母简写方式替代真实数据这样组成的rowkey会剪短,在大数据量下查询势必会减少IO.
rowkey补充:
rowkey是以字典顺序排序的。而存储的字节码,字典排序,我们知道,如果是字 母,那就是字母的顺序,比如,有两个rowkey,rowkey1:aaa222,rowkey2:bbb111,那么rowkey1是排在 rowkey2前面的,因为按字典,a排在b前面,如果rowkey2的第一位也是a,那么就根据第二位来比较,如果还相同,则比较第三为,后面同样.
我们在根据rowkey范围查询的时候,我们一般是知道startRowkey,如果我们通过scan只传startRowKey : d开头的,那么查询的是所有比d大的都查了,而我们只需要d开头的数据,那就要通过endRowKey来限制。我们可以通过设定endRowKey为:d 开头,后面的根据你的rowkey组合来设定,一般是加比startKey大一位。比如说rowkey设计为:用户ID-日期,那么查某个用户某天的数 据,startKEY为3231-20121212,endKey为:3231+201213,那么你查到的就是用户为3231在20121212这一天 的数据。
2 1 region有三个要素:
属于哪张表
它所包含的第一行(第一个region没有首行)
它所包含的最后一行(末一个region没有末行)
这个首行末行在 hadoop3:60010/table
3 region 分配不均匀:
提问:region分配不均匀,总是分配到少数节点上,这样读写并发效率会较低??
回答:
当表初写数据时,此时表只有一个region ,当随着数据的增多,region 开始变大,等到它达到限定的阀值大小时,变化把region 分裂为两个大小基本相同的region,
而这个阀值就是storefile 的设定大小(参数:hbase.hregion.max.filesize 新版本默认10G),---->
,在第一次分裂region之前,所有加载的数据都放在原始区域的那台服务器上,随着表的变大
region是属于单一的regionserver,除非这个regionserver宕机或者挂掉,或者执行balance时,才会将这部分的region信息转义到其他机器上。
4 行加锁:
HBase的锁 是行锁,无论对行进行访问的事物有多少列,那对此行的更新都会是原子操作,要么成功,要么失败,不会存在部分成功的情况。
即:如果只更新一个行1000个列中的一个列,那也会对正行加锁。
5 ZK的作用
协调和服务于分布式应用程序的服务。
zk存储 -ROOT-表的地址, Hmaster地址, Hregionserver地址
zk通过选举方式避免 hmaster单节点
6 Hmaster
htable ddl操作 + region分配
7 Hregionserver
响应clent请求,和hdfs交互,
一个表在行级别上可以分为多个region,
每个region在进行进一步封装就成了一个个的Hregion对象。
1个hregion = W个hstore = W个列族(列族个数和hstore个数一一对应) ---> 相同属性数据应该放在同一列族中,这样存储时候会放在同样hstore下,这样client访问时
就不需要跨hstore,减少磁盘寻址。
Hstore = memstore + storefile组成,
memstore: store memory buffer, 客户端写入数据到memstore到阈值(默认128M)后flush到storefile后存储在硬盘中。
在flush时,regionserver flush将请求添加到队列,模拟生产-消费模式来异步处理,当队列来不及消费,产生大量积压请求时,会导致内存徒增,最坏出现OOM.
在一个Region下 每个Column Family 一个HStore ,那多个Column Family 这样问题出来了,如果一个HStore数据量大,而另外一个HStore 仅有几条数据,会同时 flush吗? 对
这个特性告诉我们: Hbase表设计的时候尽量设置单一ColumnFamily的表,否则Hbase不能很好的处理上面类似的问题.
hbase.regionserver.global.memstore.upperLimit 默认 0.4 也就是40%为了防止MemStore占用总内存过大,当RegionServer所有Region达到总heap内存的40%,
Hbase会Block所有的更新,来flush所有的MemStore,并释放MemStore占用的内存
hbase.regionserver.global.memstore.lowerLimit 默认是 0.35 也就是 35%,当该RegionServer 下所有的MemStore达到 总Heap 内存的35%时
触发flush个别占用内存大的MemStore,这是会做block,写更新还 是会收影响。 ----> 这个没看懂啊