HBase 和 Schema 设计
一份关于各种非关系型数据库的优点和缺点的通用介绍,就是 Ian Varley的博士论文, No Relation: The Mixed Blessings of Non-Relational Databases。它的作成时间距今有一点长,但如果你有时间去了解HBase schema建模方式和RDBMS有什么不同的话,它可以作为很好的背景知识阅读材料。也可阅读 keyvalue 和 schema.casestudies,了解HBase如何内部保存数据。
在Cloud Bigtable website上的文章,Designing Your Schema,写的很不错,并且在那里列出的要学习的课程和这里关于HBase的应用相同,只是引用的数值要除以10才能在HBase上工作。
例如,那里说个体值可以在 10MB,Cloud Bigtable的最大列族数为100,要想HBase可以做的和Cloud Bigtable一样,考虑HBase的列族数在10以内
33. 模式创建Schema Creation
HBase模式(schema)可以由The Apache HBase Shell 或Java API Admin 创建或更新。
当修改列族时,表必须禁用,例:
Configuration config = HBaseConfiguration.create(); Admin admin = new Admin(conf); TableName table = TableName.valueOf("myTable"); admin.disableTable(table); //禁用表 HColumnDescriptor cf1 = ...; admin.addColumn(table, cf1); // adding new ColumnFamily HColumnDescriptor cf2 = ...; admin.modifyColumn(table, cf2); // modifying existing ColumnFamily admin.enableTable(table);
参考client dependencies,获取更多配置客户端连接的信息。
0.92.x支持在线修改模式,但是0.90.x则需要禁用表。 |
33.1. 模式更新Schema Updates
当表或列族改变时(如 region size, block size), 这些改变在主紧缩(major compaction)执行及存储文件(StoreFiles)重写后才起作用。
参考 store 获取StoreFiles的更多信息。
34. 表模式经验法则 Table Schema Rules Of Thumb
有很多带有不同的访问方式和服务期望的不同的数据集,因此这些经验法则只是一个概括。阅读本章剩余内容可以在你看过这个列表后获得更多细节。
- 把Region的大小设定在10到50GB
- 不让单元大于10MB,或者如果使用mob(中等大小对象) 则不让单元大于50MB。否则,就考虑把单元数据存到HDFS中,只把数据的存储指针存到HBase中。
- 一个典型的模式是每个表有1到3个列族。HBase表不应该被设计成仿效关系型数据库表的表。
- 对于一个有1个或2个列族的表来说,region数在50到100左右是一个很好的数字。记住一个region是一个列族的一个连续分段。
- 列族名尽可能短。对于每个value(忽略前缀编码),列族名会存储一次。列族名不应该像RDBMS里的列名一样可以自我描述。
- 如果你存储的是基于时间的机器数据或日志信息,且row key行键是基于 设备ID或服务ID+时间的话,你可以以一种模式使老数据的分区不再接收超过一定时间的数据的写入。在这种情况下,你最终得到的是少量的激活状态下的region和大量的没有新数据写入的老region。这种情况下,你可以容忍大量的region因为你的资源消费只是由激活状态下的region驱动。
- 如果仅有1个列族忙着写,则只有那个列族在占用越来越多的内存。在分配资源时要注意写模式。