一个系统上线之后,开发和调优将会一直伴随在系统的整个生命周期中,HBase也不例外。下面我们要学习如何进行HBase读写性能调优,以获取最大的读写效率。
HBase写入优化
客户端优化
批量写
采用批量写,可以减少客户端到RegionServer之间的RPC的次数,提高写入性能。批量写请求要么全部成功返回,要么抛出异常。
HTable.put(List<Put>);
异步批量提交
如果业务可以接受异常情况下丢失少量数据,可以使用异步批量提交方式提交请求。
用户提交写请求之后,数据会先写入客户端缓存,并返回用户写入成功(此时数据并为提交到RegionServer),当客户端缓存达到阈值(默认2M,可通过hbase.client.write.buffer配置)时才会批量提交给RegionServer。需要注意的是,在某些情况下客户端异常的情况下缓存数据有可能丢失。
HTable.setWriteBufferSize(writeBufferSize); // 设置缓存大小
HTable.setAutoFlush(false);
多线程并发写
客户端开启多个HTable写线程,每个写线程负责一个HTable对象的flush操作,这样结合定时flush和写buffer,可以即保证在数据量小的时候,数据可以在较短时间内被flush,同时又保证在数据量大的时候,写buffer一满就即使进行flush。
使用BulkLoad写入
在HBase中数据都是以HFile形式保存在HDFS中的,当有大量数据需要写入到HBase的时候,可以采用BulkLoad方式完成。
使用MapReduce或者Spark直接生成HFile格式的数据文件,然后再通过RegionServer将HFile数据文件移动到相应的Region上去。
写数据表设计调优
COMPRESSION
配置数据的压缩算法,这里的压缩是HFile中block级别的压缩。对于可以压缩的数据,配置压缩算法可以有效减少磁盘的IO,从而达到提高性能的目的。但是并不是所有数据都可以进行有效压缩,如图片,因为图片一般是已经压缩后的数据,所以压缩效果有限。常用的压缩算法是SNAPPY,因为它有较好的压缩和解压速度和可以接受的压缩率。
IN_MEMORY
配置表的数据优先缓存在内存中,这样可以有效提升读取的性能。适合小表,而且需要频繁进行读取操作的。
预分区
在HBase中数据是分布在各个Region中的,每个Region都负责一个起始RowKey和结束Rowkey的范围,在向HBase中写数据的时候,会根据RowKey请求到对应的Region上,如果写请求都集中在某一个Region或某几个Region上的时候,性能肯定不如写请求均匀分布在各个Region上好。默认情况下,创建的HBase的只有一个Region分区,会随着数据量的变大ÿ