全部产品

schema设计原则

更新时间:2017-09-04 15:54:48   分享:   

Schema 创建

可以使用HBase Shell或者java API的HBaseAdmin来创建和编辑HBase的Schema

当修改列族时,建议先将这张表下线(disable):

  1. Configuration config = HBaseConfiguration.create();
  2. HBaseAdmin admin = new HBaseAdmin(config);
  3. String table = "Test";
  4. admin.disableTable(table); // 将表下线
  5. HColumnDescriptor f1 = ...;
  6. admin.addColumn(table, f1); // 增加新的列族
  7. HColumnDescriptor f2 = ...;
  8. admin.modifyColumn(table, f2); // 修改列族
  9. HColumnDescriptor f3 = ...;
  10. admin.modifyColumn(table, f3); // 修改列族
  11. admin.enableTable(table);

更新

当表或者列族改变时(包括:编码方式、压力格式、block大小等等),都将会在下次marjor compaction时或者StoreFile重写时生效

表模式设计经验

  • region规模大小再10到50g之间;
  • 单个cell不超过10mMB,如果超过10MB,请使用mob(目前 ApsaraDB for HBase不支持,2.0会支持),再大可以考虑直接存在OSS中
  • 一个典型的表中含有1-3个列族,hbase表不应该设计成类似RDBMS的表
  • 一个表大约 50到100个 region,1或者2个列族。记住:每个列族内是连续的,不同列族之间是分割的
  • 尽量让你的列族名端,因为存储时每个value都包含列族名(忽略前缀编码, prefix encoding )
  • 如果在基于时间的机器上存储数据这和日志信息,row key是由设备ID加上时间得到的,那最后得到这样的模式:除了某个特定的时间段,旧的数据region没有额外的写。这样的情况下,得到的是少量的活跃region和大量没有新写入的旧region。这时由于资源消耗仅仅来自活跃的region,大量的Region能被接受

列族的数量

现在HBase并不能很好的处理两个或者三个以上的列族,所以尽量让列族数量少一些。

目前, flush 和 compaction 操作是针对一个region。所以当一个列族操作大量数据的时候会引发一个flush。那些邻近的列族也有进行flush操作,尽管它们没有操作多少数据。

compaction操作现在是根据一个列族下的全部文件的数量触发的,而不是根据文件大小触发的。

当很多的列族在flush和compaction时,会造成很多没用的I/O负载(要想解决这个问题,需要将flush和compaction操作只针对一个列族) 。

尽量在模式中只针对一个列族操作。将使用率相近的列归为一列族,这样每次访问时就只用访问一个列族,提高效率。

列族的基数

如果一个表存在多个列族,要注意列族之间基数(如行数)相差不要太大。 例如列族A有100万行,列族B有10亿行,按照行键切分后,列族A可能被分散到很多很多region(及RegionServer),这导致扫描列族A十分低效。

版本的数量

行的版本的数量是HColumnDescriptor设置的,每个列族可以单独设置,默认是3。这个设置是很重要的,因为HBase是不会去覆盖一个值的,它只会在后面在追加写,用时间戳来区分、过早的版本会在执行major compaction时删除,这些在HBase数据模型有描述。这个版本的值可以根据具体的应用增加减少。

不推荐将版本最大值设到一个很高的水平 (如, 成百或更多),除非老数据对你很重要。因为这会导致存储文件变得极大。

最小版本数

和行的最大版本数一样,最小版本数也是通过HColumnDescriptor 在每个列族中设置的。最小版本数缺省值是0,表示该特性禁用。 最小版本数参数和存活时间一起使用,允许配置如“保存最后T秒有价值数据,最多N个版本,但最少约M个版本”(M是最小版本数,M<N)。 该参数仅在存活时间对列族启用,且必须小于行版本数。

支持数据类型

HBase通过Put和Result支持 bytes-in/bytes-out 接口,所以任何可被转为字节数组的东西可以作为值存入。输入可以是字符串、数字、复杂对象、甚至图像,它们能转为字节。

存在值的实际长度限制 (如:保存10-50MB对象到HBase可能对查询来说太长); 搜索邮件列表获取本话题的对话。HBase的所有行都遵循HBase数据模型包括版本化。设计时需考虑到这些,以及列族的块大小。

存活时间

列族可以设置TTL秒数,HBase在超时后将自动删除数据,HBase里面TTL时间时区是UTC

存储文件仅包含有过期的行(expired rows),它们可通过minor compaction删除。将 hbase.store.delete.expired.storefile设置为false,可禁用此功能;将最小版本数设置成非0值也可达到同样的效果。

HBase的最新版本还支持将设定的时间存放在每个结构单元。TTL单元通过Mutation#setTTL作为更变请求(Appends, Increments, Puts, etc.)的一个属性提交,如果TTL的属性被设定了,它将会应用到由于该更变操作更新的所有单元上。cell TTL handling和ColumnFamily TTLs间有两个显著的差别:

1.Cell TTLs的数量级是毫秒而不是秒;

2.一个cell TTL不能超出ColumnFamily TTLs设置的有效时间。

本文导读目录
本文导读目录
以上内容是否对您有帮助?