Hbase-之架构设计(schema design)
Hbase架构设计主要是你设计表和模型的时候要做的事,你得清楚~~
1 前言
当前主流的bigtable有多种,目前这里只举3个栗子
- Google Bigtable
- Hypertable(开源)
- Hbase(开源)
Hypertable和Hbase实际上都是在Google Bigtable基础上衍生出来的产物,其中Hypertable与Google Bigtable是十分相似的,除了存储所基于的文件系统不同其它基本一样,Hypertable基于HDFS或者KFS,而Google Bigtable则基于自身的GFS文件系统。都是基于C++开发的。
Hbase则是另外一种衍生产品,除了文件系统不同,开发的语言也不同,Hbase基于Java开发,对于很多开发者来说是非常友好的,而且Hbase提供了方便的Java API,而且同时能与大数据主流的开源文件系统HDFS、S5完美搭配,业界福音当之无愧。
Hbase除了框架基础本身,其它的事情都交给了开发者本身,如:table join、schema、rowkey、store等等,在灵活的同时也是显得有点狗蛋
2 如何创建Hbase schema
众所周知,Hbase的schema可以通过Hbase shell创建,也可以使用JavaAPI中的Admin实例创建,类似于RDBM中的DDL。
注意⚠️,在添加或修改Table的时候,一定得先disable Table。简单的代码如下,我就直接从官网复制粘贴了。
Configuration config = HBaseConfiguration.create();
Admin admin = new Admin(conf);
TableName table = TableName.valueOf("myTable");
admin.disableTable(table); //disable table
HColumnDescriptor cf1 = ...;
admin.addColumn(table, cf1); // adding new ColumnFamily(添加新的列簇)
HColumnDescriptor cf2 = ...;
admin.modifyColumn(table, cf2); // modifying existing ColumnFamily(修改已经存在的列簇)
admin.enableTable(table); //开启应用table
3 设计Schema时的优先准则
- 尽量让region size保持在10-50GB范围;
- 尽量不要让cell存储超过10M,如果需要存储MOB请不要超过50M
- 什么是MOB?
- MOB的英文为(Medium-sized Object),翻译为中型对象,Hbase可以存储任何数据,包括图像、文档等二进制数据,从技术上讲,Hbase可以处理Cell size> 100KB的对象,但是Hbase在读写的路径上对<=100KB的二进制值作了优化,假如一个二进制对象超过100KB比较多,那么这个对象就是MOB或者称为中型对象,假如Hbase同时处理大量的这样的对象,在split、compaction的时候就会降低性能。
- 尽量让MOB保持在100KB-10MB之间
- Hbase 2 添加了对MOB的特殊支持,能保证性能、一致性、较低的性能开销
- Hbase 2中还给用户提供了可配置的MOB配置,对用户来说是透明的
- 一般的shema创建的时候,column family的数量应该保持在1~3个,而不是越多越好;
- 对一个有1~2个column family的表来说,50-100个region的数量是非常好的选择,做好预分区,减少split的开销,一个region包含多个column family的一个持续段(一部分)
- 保证column family的名字尽可能的短,当然得得见明知意,言简意赅,因为Hbase默认将每个存储的值都存储了一份该列簇的名称;
- 当需要存储基于时间的
或者机器数据
,且此时的rowkey样式为日志信息
的时候,你可以使用一个pattern-模式来终止那些再也不会写入数据的old regions,这样你就能节省大量的资源开销因为所有的资源只提供给那个那些需要被写入数据的active regions。device id或者service id + time
- 如果只有1个column family忙于写操作,那么只有该列族会占用内存,分配资源时请注意write-pattern模