使用MR编程hbase和hbase调优-布隆过滤器
使用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%