大数据,机器学习,人工智能@IT·大数据大数据

HBase代码优化

2019-06-30  本文已影响0人  山间浓雾有路灯

Compression压缩

HColumnDescriptor hcd = new HColumnDescriptor(familyName);   
hcd.setCompressionType(Algorithm.SNAPPY);

HBase数据表优化

1.预分区
2.RowKey优化
3.减少Column Family数量
4.设置最大版本数
HColumnDescriptor.setMaxVersions(int maxVersions) 

设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)

5.缓存策略(setCaching)
HColumnDEscriptor.setInMemory(true)

将表放到RegionServer的缓存中,保证在读取的时候被cache命中

6.设置存储生命周期
HColumnDescriptor.setTimeToLive(int timeToLive)

设置表中数据的存储生命周期,过期数据将自动被删除

写表操作

1.多个HTable并发写
2.HTable参数设置

放弃写WAL日志,以提高数据写入的性能

3.多线程并发写

在客户端开启多个HTable写线程,每个写线程复制一个HTable对象的flush操作,这样结合定时flush和写buffer(writeBufferSize),可以既保证在数据量小的时候,数据可以在较短时间内被flush(如1秒内),同时又保证在数据量大的时候,写buffer一满就及时进行flush。

4.批量写

通过调用

HTable.put(Put)

可以将一个指定的rowkey记录写入HBase,同样HBase提供了另一个方法,通过调用

HTable.put(List)

可以将指定的rowkey列表,批量写入多行记录,这样做的好处是批量执行,只需要一次网络I/O开销,这对于数据实时性要求高的场景下带来明显的性能提升

读表操作

多个HTable并发度

创建多个HTable客户端用于读操作,提高读数据的吞吐量

HTable参数设置
批量读

通过调用

HTable.get(Get) 

可以根据一个指定的row key获取一行记录,同样HBase提供了另一个方法:通过调用

HTable.get(List)

方法可以根据一个指定的rowkey列表,批量获取多行记录,这样做的好处是批量执行,只需要一次网络I/O开销,这对于对数据实时性要求高可能带来明显的性能提升

多线程并发度

在客户端开启多个HTable读线程,每个读线程负责通过HTable对象进行get操作

缓存查询结果

对于频繁查询HBase的应用场景,可以考虑在应用程序中缓存,当有新的查询请求时,首先在缓存中查找,如果存在则直接返回,不再查询HBase;否则对HBase发起读请求查询,然后在应用程序中将查询结果缓存起来。至于缓存的替换策略,可以考虑LRU等常用的策略

BlockCache

HBase的RegionServer的内存分为两部分,一部分作为memStore,主要用来写;另一部分作为BlockCache,主要用于读。
写请求会先写入memStore。RegionServer会给每个region提供一个memStore,当memStore满64M以后,会启动flush刷新到磁盘。当memStore的总大小超过限制时
(heapsize * hbase.regionserver.global.memstore.upperlimit * 0.9),会强行启动flush进程,从最大的memStore开始flush直到低于限制。
读请求先到BlockCache中查,查不到就去memStore中查,再查不到就会到磁盘上读,并把读的结果放入BlockCache。由于BlockCache采用的是LRU策略,由此BlockCache达到上限(heapsize * hfile.block.cache.size * 0.85)后,会启动淘汰机制,淘汰掉最老的一批数据。
一个RegionServer上有一个BlockCache和N个memStore,它们的大小之和不能大于等于heapsize * 0.8,否则HBase不能启动。默认BlockCache为0.2,而memStore为0.4。对于注重读响应时间的系统,可以将BlockCache设大些,以加大缓存的命中率

上一篇下一篇

猜你喜欢

热点阅读