Hbase优化

表的设计

1,预先创建空的region,当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。

2,rowkey一般设计成定长的

3,rowkey按字典序排序,将最近可能读取的数据放在一块,可以使用timestamp作为rowkey保证数据可以快速命中。

4,rowkey的设计,大小越小越好,值根据需要决定,散列原则

5,一张表不需要太多column family,建议2-3个

6,创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放到RegionServer的缓存中,保证在读取的时候被cache命中。

7,创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以置setMaxVersions(1)。

8,创建表的时候,可以通过HColumnDescriptor.setTimeToLive(int timeToLive)设置表中数据的存储生命期,过期数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置setTimeToLive(2 * 24 * 60 * 60)。

9,实际应用中,可以考虑必要时手动进行major compact,将同一个row key的修改进行合并形成一个大的StoreFile。同时,可以将StoreFile设置大些,减少split的发生。

10,合并小的storeFile成大的storeFile.在hbase中,主要存在两种类型的compaction:minor compaction和major compaction。

写表操作:

1多个HTable客户端用于写操作,提高写数据的吞吐量

2,通过调用HTable.setAutoFlush(false)方法可以将HTable写客户端的自动flush关闭,这样可以批量写入数据到HBase,

3,Write Buffer

4,对于相对不太重要的数据,可以在Put/Delete操作时,通过调用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函数,放弃写WAL日志,从而提高数据写入的性能。

5,通过调用HTable.put(List)方法可以将指定的row key列表,批量写入多行记录,这样做的好处是批量执行,只需要一次网络I/O开销,这对于对数据实时性要求高,网络传输RTT高的情景下可能带来明显的性能提升。

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

读表操作:

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

2,Scanner Caching

3,scan时指定需要的Column Family,可以减少网络传输数据量

4,通过scan取完数据后,记得要关闭ResultScanner,否则RegionServer可能会出现问题(对应的Server资源无法释放)。

5,批量读

6,多线程并发读

7,缓存查询结果

8,HBase上Regionserver的内存分为两个部分,一部分作为Memstore,主要用来写;另外一部分作为BlockCache,主要用于读。

HTable:

  1. 规避HTable对象的创建开销

  2. HTable对象不是线程安全的

  3. HTable对象之间共享Configuration,避免重新去zookeeper中去查找查找-ROOT-和.META.表

HTablePool:

HTablePool可以解决HTable存在的线程不安全问题,同时通过维护固定数量的HTable对象,能够在程序运行期间复用这些HTable资源对象。

你可能感兴趣的:(Hbase优化)