HBase and Schema Design

在Ian Varley的博士论文No Relation: The Mixed Blessings of Non-Relational Databases中,对各种non-rdbms数据存储模型的优缺点有详细的介绍。虽然有点过时,但是个不错的背景读物,如果你想花点时间了解HBase架构模型与RDBMS做法的区别。同样,读下keyvalue一节,了解Hbase内部如何存储数据。

The documentation on the Cloud Bigtable website, Designing Your Schema, is pertinent and nicely done and lessons learned there equally apply here in HBase land; just divide any quoted values by ~10 to get what works for HBase: e.g. where it says individual values can be ~10MBs in size, HBase can do similar — perhaps best to go smaller if you can — and where it says a maximum of 100 column families in Cloud Bigtable, think ~10 when modeling on HBase.

32. Schema Creation

HBase schema可以被创建或更新,通过Hbase shell或在Java api中使用管理员

当修改列族时,表必须先disabled,例如:

  1. Configuration config = HBaseConfiguration.create();
  2. Admin admin = new Admin(config); //这里是不是错啦,验证下,原文Admin admin = new Admin(conf);
  3. TableName table = TableName.valueOf("myTable");
  4. admin.disableTable(table);
  5. HColumnDescriptor cf1 = ...;
  6. admin.addColumn(table, cf1); //加入新的列族cf1
  7. HColumnDescriptor cf2 = ...;
  8. admin.modifyColumn(table, cf2); //修改存在的列族cf2
  9. admin.enableTable(table);

See client dependencies for more information about configuring client connections.

0.92.x 支持在线修改模式, 但 0.90.x 需要禁用表。

32.1. Schema Updates

当要改变表或列族时(如region size 或block zize),这些变化会在下次主compaction和storefile重写时生效。

33. Table Schema Rules Of Thumb 表的经验模式

有许多不同的数据集,带有不同的访问模式和服务水平期望。所以,经验模式只是一个概括。Read the rest of this chapter to get more details after you have gone through this list.

  • 计划region大小在10-50GB
  • 如果使用mob(Storing Medium-sized Objects),计划cells大小不要超过10MB,或50MB ?否则考虑将你的cell数据存于HDFS并存一个指针在HBase中
  • 一个典型的schema每个表有1到3个列族,Hbase表不应该仿照RDBMS表设计
  • 一个具有1或2个列族的表最好有50-100个regions。记住region时列族的连续分段
  • 列族名应该尽可能短,每个值的列族名都要被存储(The column family names are stored for every value ?)。它们不应该自我记录和描述像是在典型的RDBMS中。
  • 如果你在存储基于时间的机器数据或日志信息,它们的row key则基于设备ID或带时间的服务ID,你可以以这样的规则结束:在超过某个时间后,旧的数据区域不会再进行额外的写入。这样你可以得到少部分活跃区域和大部分不再有写入的较旧的区域。这时,你是可以忍受大量region的,因为资源消耗仅来自活跃的区域。
  • 如果只有一个列族忙于写操作,只有这个列族会增加内存。在分配资源时要注意写模式。