使用MR编程操纵hbase
======================================
1、TableInputFormat输入K,V格式
ImmutableBytesWritable //相当于textInputFormat中的偏移量
Result //真实数据
使用conf设置table配置文件
conf.set(TableInputFormat.INPUT_TABLE,"ns1:t1"); //指定表名
//还需手动添加
conf.set("hbase.zookeeper.quorum","s102:2181,s103:2181"); //指定zk连接地址
2、TableOutputFormat输出K,V格式
ignore //当指定value时,此项可忽略,建议使用NullWritable
Put || Delete //hbase的put或delete
使用conf设置table配置文件
conf.set(TableOutputFormat.OUTPUT_TABLE,"ns1:wc"); //指定表名
//还需手动添加
conf.set("hbase.zookeeper.quorum","s102:2181,s103:2181"); //指定zk连接地址
布隆过滤器
=============================
是hbase的文件格式,以k/v形式存储,k/v均是字节数组
HFile包括以下内容:
读取或写入压缩块的存储空间。
每个块所指定的I/O操作的压缩编解码器
临时的key存储
临时的value存储
hfile索引,存在于内存,占用空间约为(56+AvgKeySize)*NumBlocks.
性能优化建议
**** 最小块大小,推荐在 8KB to 1MB之间
顺序读写推荐大块,但不便于随机访问(因为需要解压更多的数据)
小块便于随机读写,但是需要占用更多内存,但是创建起来更慢(因为块多,每次压缩都需要flush操作)
由于压缩缓存,最小块大小应该在20KB-30KB.
hfile中的索引,在每次加载region的时候会加载到内存
region:文件夹/cf:文件夹 --------> HFile
在进行查询时,会将cf文件夹中所有的hfile索引进行LSM树遍历查找(近似于二分查找),
所以在查找的时候会遍历所有的索引
布隆过滤器为了解决此问题,可以立刻判断此文件没有制定的rowKey。帮助过滤掉一些不需要扫描的文件
比块索引粒度粗
所以hbase在定位rowKey的时候,首先通过布隆过滤器排除一些肯定不存在的hfile
然后在剩下可能存在hfile的文件中通过块索引遍历数据。
布隆过滤器配置:BLOOMFILTER
NONE //不适用,不占用
ROW //推荐只扫描行级别的操作,占用资源不大
ROWCOL //推荐扫描行+列级别操作,占用资源稍大
alter 'ns1:t1', NAME => f1, BLOOMFILTER => ROWCOL
HBase调优:
=================================
1、调整新生代堆内存大小
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
2、配置减少垃圾回收产生的内存碎片
hbase.hregion.memstore.mslab.enabled ===> true
3、采用压缩 //只能在空表采用压缩
alter 'ns1:t1', NAME => 'f1', COMPRESSION => 'LZ4'
4、优化拆分和合并:
split:避免切割风暴 //region默认10G,当所有表同时增长到指定阈值,就会同时进行切割
//极大影响集群性能
//解决方案:1、设置超大值,进行手动切分
2、进行预切割
避免热点数据: //rowKey设计原则:在集群范围分散,在区域范围连续
1、组合键
2、调整组合键权重
3、进行盐析:随机加盐x hash加盐- 手动设计前缀:在集群范围分散,在区域范围连续
4、数字比较,使用MAX_VALUE-num 进行倒排
5、格式化数字串 DecimalFormat
手动移动区域:
merge:merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'
5、负载均衡: //超过半数region由一个regionServer管辖,导致压力过大
close_region //关闭区域
assign //注册区域
unassign //注销当前regionserver,并在其他节点重新注册
balancer //均衡器,unassign所有的region并重新注册
6、API
1、关闭自动刷写
table.setAutoFlush(false, false);
2、设置扫描缓存 || 批次
scan.setCaching()
3、限定扫描范围 //避免全表扫描
4、关闭resultScanner //影响性能问题
rs.close()
5、扫描设置快缓存 //默认true
将扫描结果缓存到客户端以便下次使用
6、设置过滤器:
RowFilter
FamilyFilter
QualifierFilter
ValueFilter
SingleColumnValueFilter
FilterList
7、put设置禁止写入WAL //不推荐 WAL的生命周期
put.setDurability(Durability.SKIP_WAL);
7、配置
1、增加处理线程
hbase.regionserver.handler.count
2、增加堆内存:hbase-env.sh
export HBASE_HEAPSIZE=1G //默认1G
3、调整快缓存大小
hfile.block.cache.size=0.4 //堆内存的40%
4、调整memstore大小
hbase.regionserver.global.memstore.size //最大memstore,默认堆内存40%
hbase.regionserver.global.memstore.size.lower.limit //最小memstore,默认最大memstore的95%