1、预分区
真正存储数据的是region要维护一个区间段段rowkey
startRow-endRowkey
1)手动设置与分区
create 'user_p', 'info', 'partition', SPLITS => ['101', '102', '103', '104']
存在-∞和+∞,所以会存在5个区间
第一个分区:-∞~101
第二个分区:101_102
~~~
第五个分区:104~+∞
2)生成16进制的预分区
create 'user_p2', 'info', 'partition', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
设置了NUMGREGIONS为15,所以会有15个区间,而不是16
3)按照文件中设置的规则设置与分区(文件需要在hbase终端目录下
vi splits.txt
a1
b2
c3
d4
create 'user_p', 'info', 'partition', SPLITS_FILE => 'splits.txt'
注:这里的partition只是列族,并不是分区的关键字,可以改成别的,不要瞎猜
2、rowkey设计
一条数据的唯一标识是rowkey,此rowkey存储在哪个分区取决于属于哪个预分区内。
为什么要设计rowkey?
为了防止出现数据倾斜
1、生成随机数/hash/散列值
2、字符串反转
3、字符串拼接
3、硬件优化
1)从内存优化
一般分配70%内存给HBase的java堆
不建议分配非常大的堆内存
一般设置为16-48G内存即可
设置:export HADOOP_FORMAT_OPTS = "-Xmx512m $HADOOP_PORTMAP_OPTS"
注意:etc/hadoop下 hadoop-env.sh
2)基础优化
优化DataNode
hdfs-site.xml
最大文件打开数
属性:dfs.datanode.max.transfer.threads
默认是:4096 设置大于4096
优化延迟高的数据操作等待时间
hdfs-site.xml
属性:dfs.image.transfer.timeout
默认是:60000ms 设置大于60000
数据写入效率
mapred-site.xml
压缩
属性:mapreduce.map.output.compress
值:org.apache.hadoop.io.compress.GzipCodec
优化hstore的文件大小
属性:hbase.hregion.max.filesize
默认值:10G
调小