hbase性能优化初探

雨燕双飞 提交于 2020-02-07 01:37:17

表的设计

 1. 考虑提前设置多个region‘
 2.   列族尽量少
 3.   raw key的设计:尽量短,有利于业务需求,尽量散列开
  1. 考虑提前设置多个region‘
    默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。
  2. 列族尽量少
    不要在一张表里定义太多的column family。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候,它邻近的column family无论是否达到阀值,也会因关联效应被触发flush,最终导致系统产生更多的I/O,和更多的小文件,然后小文件增多再触发minor compaction
  3. raw key的设计:尽量短,有利于业务需求,尽量散列开
    在HBase中,row key可以是任意字符串,最大长度64KB,实际应用中一般为10~100bytes,存为byte[]字节数组,一般设计成定长的。row key是按照字典序存储,因此,设计row key时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为row key的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作为row key,这样能保证新写入的数据在读取时可以被快速命中。

写操作

考虑分布式多节点参与写
能批量写就批量写,只耗费一次网络IO
写缓存memstore,写缓存memstore关闭自动刷新
调整version的大小 
关闭自动major compaction
  1. 考虑分布式多节点参与写

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

  3. 写缓存memstore关闭自动刷新
    通过调用HTable.setAutoFlush(false)方法可以将HTable写客户端的自动flush关闭,这样可以批量写入数据到HBase,而不是有一条put就执行一次更新,只有当put填满客户端写缓存时,才实际向HBase服务端发起写请求。默认情况下auto flush是开启的。

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

  5. 关闭自动major compaction
    数据写流程:在HBase中,数据在更新时首先写入WAL 日志(HLog)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时, 系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了(minor compact)。
    major conpaction及split:StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行分割(split),等分为两个StoreFile。
    考虑手动major compaction:实际应用中,可以考虑必要时手动进行major compact,因为major compact会耗费很多IO,可以选择在系统不忙的时候进行。

读操作

考虑多线程读
批量读
调整读缓存blockcache大小与阀值
  1. 考虑多线程读

  2. 批量读
    通过调用HTable.get(Get)方法可以根据一个指定的row key获取一行记录,同样HBase提供了另一个方法:通过调用HTable.get(List)方法可以根据一个指定的row key列表,批量获取多行记录,这样做的好处是批量执行,只需要一次网络I/O开销,这对于对数据实时性要求高而且网络传输RTT高的情景下可能带来明显的性能提升。

  3. 调整读缓存blockcache大小与阀值

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!