最近需要学习hbase的使用,并设计一个简单的hbase的表,看了很多资料,看到了一篇很好的文章,在这里分享一下:http://blog.csdn.net/ymh198816/article/details/51244911
对一些感觉非常有用的注意点做了笔记,流程记录一下:
Hbase表设计需要注意的问题:
- rowkey的结构该如何设置,而rowkey又该包含什么样的信息
- 表中该有多少个列簇
- 列簇中要存储什么样的数据
- 每个列簇中存储多少列的数据
- 列的名字是什么,因为在我们用API存入数据和查询数据时是需要这些信息的
- 单元cell中应该存储什么样的信息。
- 每个单元中存储多少个版本信息
要真实的考虑到这张表会出现什么样的读写场景,并且要考虑到hbase数据库的一些特性:
- hbase中的索引是通过key来实现的
- 在表中是通过rowkey的字典序来对一行行的数据进行排序的,表中的每一块区域的划分都是通过开始rowkey和结束rowkey来决定的。
- 所有存储在hbase表中的数据都是二进制的字节,并没有数据类型。
- 原子性只在行内保证(对该行的修改要么完全成功要么完全失败),hbase表中并没有多行事物。
- 列簇在表创建之前就要定义好
- 列簇中的子列名称可以在表完全创建完以后动态插入数据时添加。
注意:hbase是不支持事务处理的,列簇和子列的名称尽可能的短,每次返回数据都会返回列簇的名称,长的话会影响到I/O的性能
总结:
- rowkey的设计是非常重要的环节,他的好坏直接影响程序和hbase交互的效率和数据存储的性能。
- hbase的表结构比传统关系型数据库更灵活,能够存储任何的二进制数据在表中,而且无关数据类型。
- 在相同的列族中所有的数据都具有相同的接入模式。
- 主要是通过rowkey来建立索引。
- 以纵向为主设计的表结构能够快速简单的获取数据,但牺牲了一定的原子性,而以横向扩张为主设计的表结构,也就是列簇中有很多列,能在行中保持一定的原子性。
- Hbase不支持事务所以一定要在一次API的请求操作中获取到结果。
- 对Rowkey的hash分化能获得固定长度的rowkey并使数据分布更均匀一些,而不是集中在一台服务器上,但是也牺牲了一定的数据排序和读取性能。
- 可以利用列标识(子列名称)来存储数据。
- 子列名称的长度和列簇名称的长度都会影响到I/O的读写性能和发送到客户端的数据量,所以他们的命名要够简洁。