HBase体系结构

l  Client

 -包含访问HBase接口并维护cache来加快对HBase的访问

l  ZooKeeper

-保障任务时候,仅有一个Master节点

-存储Region的寻址入口

-实时监控RegionServer的上线和下线信息。并实时通知Master

-存储HBase的schema和table的元数据信息,通过ls /hbase可以查看

l  Master(不存在单点问题,通过ZK提供主从备份)

-为RegionServer分配region

-负责RegionoServer的负载均衡

-发现失效的RegionServer并重新分配其上的的Region

-管理用户对table的操作

l  RegionServer

-维护region,处理对这些region的I/O操作

-负责切分在运行过程中变得过大的region

HBase行键设计原则(4)

写入要分散,减少region的热点问题。

例如: 历史交易订单,一般生成的订单号都是通过时间戳+随机的4位数字组成,可以让订单号倒序。这样rowkey是订单号的倒序存储,减少集中存储到某个region。

 

例如:用户上网流量存储到Hbase,一般是让手机号作为hbase的rowkey。由于手机号的后四位是随机的。可以让手机号倒序排序作为hbase的rowkey。

 

参考淘宝HBase使用方案

http://wenku.baidu.com/link?url=5M88SxStcPsVm71XaIOfpf_ELOqgS_VkwXMlBDQRrFplZmncg_8GNIVoWYmADcjLIerVwHx3hozMs3fP5gSrrHgYK4uQpWiEcOgikUntlWy

 

思考问题:

直接将时间戳作为行健, 在写入单个 region 时候会发生热点问题,为什么?

回答: 直接使用时间戳会引发单个region的热点问题。

HBase的rowkey在底层是HFile存储数据的,以<K,V>键值对存放到SortedMap中。并且region中的rowkey是有序存储,若时间比较集中。就会存储到一个region中,这样一个region的数据变多,其它的region数据很好,加载数据就会很慢。直到region分裂可以解决。

HBase列族设计原则(3)

(1)一般不建议设计多个列族。具体原因如下

假如HBase表的表设置两个两个列族,若已一个列族1000万行,另一个列族100行。当一个要求region分裂时候,会导致100行的列会同样分布到多个region中。这样就出现基数问题,会导致扫描列族A的性能低下。某个列族在flush的时候,它邻近的列族也会因关联效应出发flush,最终导致系统产生更多的I/O。

(2)数据块缓存配置

如果经常顺序访问或者很少访问,可以关闭列族的缓存,让BLOCKCACHE 参数设置false,列族缓存默认打开。

(3)激进缓存配置

可以选择一个列族赋予更高的缓存,该参数IN_MEMORY 设置true。列族默认的关闭的。

(4)布隆过滤器(BLOOMFILTER)设置

减少硬盘读取数据带来的开销。对存储的数据块做反向测试,占用额外的空间。

(5)生产时间配置

超过这个时间设置的就会在下一次大合并中被删除。TTL =>"18000"

(6)列族压缩

压缩可以节省空间,读写数据会增加CPU的使用率 LZO,SNAPPY,GZIP

(7)单元时间版本

默认为1个版本,可以通过指定多个版本,来保存历史数据

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐