HBase和架构设计
可以在Ian Varley的硕士论文“ No Relation: The Mixed Blessings of Non-Relational Databases”中找到有关各种非rdbms数据存储的优缺点建模的很好的介绍。 如果您有一点时间了解HBase模式建模与RDBMS中的建模方法有何不同,那么现在它有点过时了,但是请阅读大量的背景知识。 另外,请阅读有关HBase如何在内部存储数据的keyvalue,以及有关schema.casestudies的部分。
Cloud Bigtable网站上的文档“ Designing Your Schema”是相关的,并且做得很好,并且在那里获得的经验教训同样适用于HBase。 只需将所有引用的值除以〜10即可获得适用于HBase的内容: 它表示单个值的大小约为10MB,HBase可以做类似的事情-如果可能的话,最好减小它-并指出Cloud Bigtable中最多100个列族,在HBase上建模时认为约为10个。
另请参阅Robert Yokota的HBase应用程序原型(其他HBasers完成的工作的更新),以对在HBase模型基础上表现出色的用例进行有用的分类。
1.模式创建(Schema Creation)
可以使用The Apache HBase Shell或Java API中的Admin创建或更新HBase模式。
进行ColumnFamily修改时,必须禁用表,例如:
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代码库要求禁用该表。
1.1.架构更新(Schema Updates)
当对Tables或ColumnFamilies进行更改(例如,区域大小,块大小)时,这些更改将在下次进行重大压缩时生效,并且StoreFiles将被重写。
有关StoreFiles的更多信息,请参见store。
2.表架构的经验法则(Table Schema Rules Of Thumb)
有许多不同的数据集,具有不同的访问模式和服务级别期望。 因此,这些经验法则只是一个概述。 阅读完此列表后,请阅读本章的其余部分以获取更多详细信息。
- 目标区域的大小在10到50 GB之间。
- 旨在使单元格不超过10 MB,如果使用 mob,则不超过50 MB。否则,请考虑将单元数据存储在HDFS中,并将指向数据的指针存储在HBase中。
- 典型的架构每个表具有1到3个列族。 HBase表不应设计为模仿RDBMS表。
- 对于具有1或2个列族的表,大约50-100个区域是一个不错的数字。请记住,区域是列族的连续段。
- 列的姓氏应尽可能短。将为每个值存储列族名称(忽略前缀编码)。它们不应像典型的RDBMS中那样具有自我说明性和描述性。
- 如果要存储基于时间的机器数据或日志记录信息,并且行键是基于设备ID或服务ID加上时间的,则您可能会遇到一种模式,即较旧的数据区域在特定时间范围内永远不会进行其他写入。在这种情况下,最终会出现少量活动区域和大量较旧的区域,而这些区域没有新的写入操作。对于这些情况,您可以容忍更多区域,因为资源消耗仅由活动区域驱动。
- 如果只有一个列族忙于写操作,则只有该列族会占用内存。分配资源时要注意写模式。