? ? ? ?在对HBase集群进行调整之前,你需要先知道它的性能如何。因此,我们将使用Yahoo! Cloud Serving Benchmark(YCSB,雅虎云服务基准)来测量HBase集群的性能(基准性能测试)。
? ? ? ?HBase集群基本上可按负载类型分为两类:写密集的集群和读密集的集群。每种类型的调优选项不同。许多调优方案都需要在写性能和读性能之间作出权衡。我们将介绍几种调整HBase集群以获得更好写入性能的方法,同时我们也将介绍几种调整读密集HBase集群的方法。这些方法包括服务器端配置、客户端配置和表模式选择。
? ? ? ?没有一种调整能够适用于所有的情形。你需要仔细考虑你的系统的性能要求,然后调整集群以获得写入性能和读取性能之间的最佳平衡。
一、使用YCSB对HBase集群进行基准测试
? ? ? ?测量HBase集群的性能(或对集群进行基准性能测试)与集群调优本身一样重要。HBase集群需要测量的性能特性至少包括以下这些内容:
- ? ? ? ?集群的总体吞吐量(每秒的操作数)
- ? ? ? ?集群的平均延迟时间(每个操作的平均时间)
- ? ? ? ?最小延迟
- ? ? ? ?最大延迟
- ? ? ? ?操作延迟的分布情况
? ? ? ?YCSB是一个很棒的工具,可对HBase集群进行基准性能测试。YCSB支持以并行方式运行可变的负载测试,可以评估系统的插入、更新、删除和读取性能。因此,对于写密集和读密集HBase集群都可以使用YCSB来进行基准性能测试。每个测试都可以配置其要加载的记录数、要执行的操作次数、读写比以及许多其他属性,这样就可以很容易地使用YCSB来测试集群的不同负载情形。
? ? ? ?YCSB也可以用于对许多别的键-值存储进行性能评估。YCSB的常见用途就是对多个系统进行基准测试,然后对它们的性能进行比较。
? ? ? ?HBase带有一个自己的性能评价(PE)的工具,它也可以用来对HBase进行基准测试。
?
二、增加RegionServer的处理线程数
? ? ? ?RegionServer要保持一定数量的线程处于运行状态,以此来响应传入的对于用户表的请求。为了防止RegionServer在运行时耗尽内存,该线程数默认都设得非常低。在很多情况下,尤其是在有大量并发客户端的时候,为了能处理更多请求,你需要将该值调高。
vi $HBASE_HOME/conf/hbase-site.xml <property> <name>hbase.regionserver.handler.count</name> <value>40</value> </property>? ? ? ?hbase.regionserver.handler.count属性可控制RPC侦听程序的线程数。该属性的默认值为10。这是一个相当低的值,这样设置的目的是防止RegionServer在某些情况下出现耗尽内存的情况。
? ? ? ?如果RegionServer上的可用内存较少,就应该将该属性设为一个较低的值。较低的值也适用于需要大量内存才能对请求进行处理的情形(比如将大值写入HBase或在大型缓存中扫描数据)。将hbase.regionserver.handler.count属性设为较高值意味着可以有更多的并发客户端,这可能会消耗掉很多RegionServer的内存,甚至有可能会用光所有的内存。
? ? ? ?如果每个请求只需要一点点内存,但每秒的交易次数(TPS)却很高,那么就应该将该属性设为一个较大的值,以使RegionServer可以处理更多的并发请求。
? ? ? ?在调整该属性的同时,建议启用RPC级的日志记录功能,然后监控每个RPC请求的内存使用情况和GC状态。
?
三、使用自定义算法预创建区域
? ? ? ?当我们在HBase中创建一张表时,该表一开始只有一个区域。插入该表的所有数据会保存在这个区域中。随着数据的不断增加,当该区域的大小达到一定阀值时,就会发生区域分割(Region Splitting)。这个区域会分成两半,以便使该表可以处理更多的数据。
? ? ? ?在写密集的HBase集群中,区域分割会带来以下几个需要解决的问题。
- ? ? ? ?分割/合并风暴问题。
? ? ? ?如果数据均匀地增长,大部分区域就会在同一时间发生分割,从而导致大量的磁盘I/O和网络流量。
- ? ? ? ?只有在分割出了足够多个区域之后,负载才会均衡。
? ? ? ?尤其是在表刚创建时,所有请求都会发给首个区域所在的那台RegionServer。
? ? ? ?对于第一个问题,可以参考“HBase基本性能调整”的“管理区域分割”一节,可通过手动分割的方法来解决。
? ? ? ?对于第二个问题,可以参考“在数据移入HBase前预创建区域”一节,可通过在创建表时预先创建好一些区域的方法来避免这一问题。使用HBase的RegionSplitter工具来预创建区域的方法。
? ? ? ?在默认情况下,RegionSplitter实用工具会使用MD5算法来生成MD5校验和,以此来作为区域的开始键。键值的范围是“00000000”到“7FFFFFFF”。这种算法(HexStringSplit)适用于很多情况,但在有些情况下,你可能更需要使用一种自己的算法来生成键值,以使负载能在集群中分散开来。
? ? ? ?HBase的行键完全由向HBase写入数据的应用程序所控制,在很多情况下,(由于这样或那样的原因)行键的范围和分布情况是可以预测的。因此,可以先计算出各区域的分割键,然后再使用这些分割键来创建预分割区域。
? ? ? ?我们将使用一组记录在文本文件中的区域开始键来创建表的预定义区域。
? ? ? ?1.创建一个split-keys文件。在该文件中输入一组区域分割键,每个键一行。假设该文件包含有如下一些开始键:
$ cat split-keys a0000 affff b0000 bffff
? ? ? ?2.创建Java类FileSplit,用它来实现org.apache.hadoop.hbase.util.RegionSplitter.SplitAlgorithm接口。
import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.RegionSplitter.SplitAlgorithm; public class FileSplit implements SplitAlgorithm {