表创建
HBase的表创建可以通过hbase shell
和Java API
。另外如果需要对列簇进行修改的时候,需要先去disable表。
通过Java API修改列簇例如
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);
表设计关键点
因为数据集千差万别,有很多不同的期望,所以根据官网的这些经验只是作为一个参考。
- 每个region的size保持在10--50G
- 每个cell最好不要超过10MB,如果使用HBaseMob,不要超过50MB。否则,直接存储数据到HDFS上,然后存储一个指标索引到HBase中。
- 一个典型的表设计在1--3个列簇。
- 一张表中region数量最好在50--100个,一个region上存储的是列簇数据的连续段。
- 保证列簇的名字尽可能的短,列簇名在每个value中都有存储,不要认为它类似于RDBMS表中的列名一样,具备解释说明的含义。
- 如果说rowkey的设计是基于时间线或者日志信息来设计的,对表操作的读写,基本会落在新region上,较旧的数据不会进行太多读写操作,这时候可以允许多region的存储。
- 如果只有一个列簇有比较大规模的写入请求,且只有写入请求占用内存,这时候可以调配内存资源在写入模式上。
RegionServer的设计关键点
Personally I would place the maximum disk space per machine that can be served exclusively with HBase around 6T, unless you have a very read-heavy workload. In that case the Java heap should be 32GB (20G regions, 128M memstores, the rest defaults).
— Lars Hofhansl
从这段指导原则来看,我们在搭建HBase集群的时候,尽可能的使用大机器来做regionserver。对于写操作而言,每个region 20G大小,可以设置128M的memstores。
列簇的设计
对于列簇而言,设计原则是尽可能的少,如果是有两个列簇,尽可能的保证数量size一致。因为如果一个列簇A行有100万,列簇B行有10亿。这时候因为列簇A分配在多个region上,会导致其scan的效率过低。
rowkey的设计
rowkey的设计关键点就是防止热点数据的产生,也就防止把数据都集中在少数的region上,导致读写效率的问题。要设计一个好的rowkey,就需要给rowkey进行Salting,通用的方式就是使用散列算法添加前缀。例如:
a-foo0003
b-foo0001
c-foo0003
c-foo0004
d-foo0002
关于rowkey的设计还有很多需要注意的地方,在此不做展开讨论。
版本的设计
不建议将最大版本数设置为过高的水平(例如,数百个或更多),除非非常需要那些旧值,因为这会大大增加StoreFile的大小。
网友评论