Hbase表(Schema)设计要点
金蝶云社区-艾贺521
艾贺521
82人赞赏了该文章 782次浏览 未经作者许可,禁止转载编辑于2018年12月19日 17:49:40

只要是数据库都存在,模式设计的问题,关系型中有模式设计的范式,Hbase作为列式存储数据库,其模式设计也非常重要。

设计时需要关注的属性,如何设计这些属性等


Hbase与关系型数据库对比


image.png


Hbase设计时要考虑的因素

Hbase关键概念:表,rowkey,列簇,时间戳

- 这个表应该有多少列簇

- 列簇使用什么数据

- 每个列簇有有多少列

- 列名是什么,尽管列名不必在建表时定义,但读写数据是要知道的

- 单元应该存放什么数据

- 每个单元存储多少时间版本

- 行健(rowKey)结构是什么,应该包含什么信息


 设计要点

 行健设计

关键部分,直接关系到后续服务的访问性能。如果行健设计不合理,后续查询服务效率会成倍的递减。

- 避免单调的递增行健,因为Hbase的行健是有序排列的,这样可能导致一段时间内大部分写入集中在某一个Region上进行操作,负载都在一台节点上。可以设计成: [metric_type][event_timestamp],不同的metric_type可以将压力分散到不同的region上

- 行健短到可读即可,因为查询短键不必长键性能好多少,所以设计时要权衡长度。

- 行健不能改变,**唯一可以改变的方式是先删除后插入**


列簇设计

列簇是一些列的集合,一个列簇的成员有相同的前缀,以冒号(:)作为分隔符。

- 现在Hbase不能很好处理2~3个以上的列簇,所以尽可能让列簇少一些,如果表有多个列簇,列簇A有100万行数据,列簇B有10亿行,那么列簇A会分散到很多的Region导致扫描列簇A的时候效率底下。

- 列簇名的长度要尽量小,一个为了节省空间,另外加快效率,比如d表示data,v表示value


列簇属性配置


- HFile数据块,默认是64KB,数据库的大小影响数据块索引的大小。数据块大的话一次加载进内存的数据越多,扫描查询效果越好。但是数据块小的话,随机查询性能更好

```

> create 'mytable',{NAME => 'cf1', BLOCKSIZE => '65536'}

```

- 数据块缓存,数据块缓存默认是打开的,如果一些比较少访问的数据可以选择关闭缓存

```

> create 'mytable',{NAME => 'cf1', BLOCKCACHE => 'FALSE'}

```

- 数据压缩,压缩会提高磁盘利用率,但是会增加CPU的负载,看情况进行控制

```

> create 'mytable',{NAME => 'cf1', COMPRESSION => 'SNAPPY'}

```

 最后

Hbase表设计是和需求相关的,但是遵守表设计的一些硬性指标对性能的提升还是很有帮助的,这里整理了一些设计时用到的要点。


 参考

- [HBase企业级开发实战]

- [HBase参考文档](

https://hbase.apache.org/book.html#quickstart)




注:

本文独家发布自金蝶云社区

赞 82