hbase总结

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,写更新还 是会收影响。    ---->  这个没看懂啊

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2279536