1. 概述

1.1 HBase概述

HBase由master节点和region server节点组成。在100-105集群上,100和101是master节点,102-105是region server节点。

每个region server管理很多region,每个region只会属于一个region server。一个region的大小可以自己配置(100-105集群上一个region大小为100GB)。

在HBase中创建一张表时,刚开始默认是一个region,若表越来越大,超过一个region的大小,则会split成两个region。当然也可以在建表的时候预分区几个region,如果表的大小超过了预分区的region的大小也会split。

1.2 Phoenix分区

Phoenix在建表和建索引的时候可以指定SALT_BUCKETS数,即分区数,从而提高插入和查询性能。方式如下:

CREATE TABLE IF NOT EXISTS test1 (pk BIGINT PRIMARY KEY,ff1 DOUBLE,sf1 VARCHAR,if1 INTEGER) SALT_BUCKETS=20;

通过指定分区,可以将对一张表的操作分配给多个Region Server进行处理,从而提高效率。

但是官网上并没有对分区数应设为多少比较合适给出建议,网上有博客说应该指定为region server总CPU核数的0.5~1倍之间。测试集群region sever每个节点40核,4个节点共160核。

1.3 目的

测试并确定分区数对Phoenix插入和查询性能的影响,确定当前集群在表分区和索引分区数分别为多少的情况下性能最优,接下来Phoenix性能测试采用该最优方案。

2. 方案

2.1 方案设计

创建多张表,除了表和索引的分区数不同外其他条件均相同,分别执行插入和查询操作,对比插入和查询时间。

相同的条件有:

  • 用90*2线程执行插入
  • 用1个线程进行查询
  • 每轮查询执行42条查询语句,重复10次
  • 表的总记录数为1000万
  • 表的字段数和每个字段的类型
  • 每个表都建3个global index
  • CREATE TABLE IF NOT EXISTS test4 (pk BIGINT PRIMARY KEY,ff1 DOUBLE,ff2 DOUBLE,sf1 VARCHAR,if1 INTEGER,if2 INTEGER,if3 INTEGER,if4 INTEGER,if5 INTEGER,if6 INTEGER) SALT_BUCKETS=40;
    CREATE INDEX ind_l4 ON test4(pk) SALT_BUCKETS=20;
    CREATE INDEX ind_l4_1 ON test4(ff1,ff2,sf1) SALT_BUCKETS=20;
    CREATE INDEX ind_l4_2 ON test4(if1) SALT_BUCKETS=20;

    注:若只指定了表的分区数,未指定索引的分区数,则默认索引的分区数跟表分区数一样。

    2.2 测试用例

    用例编号表分区数索引分区数插入时间查询时间
  • CPU:Intel E5-2670v3 * 2(2.3GHz、L3 Cache 25M)vCore:40
  • 内存:16G DDR4 * 16 2133 MHz Cache 28G
  • 硬盘:SAS硬盘 2(300G、2.5吋、10K) SAS硬盘 12(3T、2.5吋、7200转)
  • 网卡: 曙光万兆双口光纤(含光模块) * 1
  • Centos 7
  • jdk-7u65-linux-x64
  • Phoenix 4.6
  • HBase 1.0.0
  • CPU:Intel E5-2670v3 * 2(2.3GHz、L3 Cache 25M)vCore:40
  • 内存:16G DDR4 * 16 2133 MHz Cache 28G
  • 硬盘:SAS硬盘 2(300G、2.5吋、10K) SAS硬盘 12(3T、2.5吋、7200转)
  • 网卡: 曙光万兆双口光纤(含光模块) * 1
  • Centos 7
  • jdk-7u65-linux-x64
  • HBase 1.0.0
  • CPU:Intel E5-2670v3 * 2(2.3GHz、L3 Cache 25M)vCore:40
  • 内存:16G DDR4 * 16 2133 MHz Cache 28G
  • 硬盘:SAS硬盘 2(300G、2.5吋、10K) SAS硬盘 12(3T、2.5吋、7200转)
  • 网卡: 曙光万兆双口光纤(含光模块) * 1
  • Centos 7
  • jdk-7u65-linux-x64
  • HBase 1.0.0
  • CPU:Intel E5-2670v3 * 2(2.3GHz、L3 Cache 25M)vCore:40
  • 内存:16G DDR4 * 16 2133 MHz Cache 28G
  • 硬盘:SAS硬盘 2(300G、2.5吋、10K) SAS硬盘 12(3T、2.5吋、7200转)
  • 网卡: 曙光万兆双口光纤(含光模块) * 1
  • Centos 7
  • jdk-7u65-linux-x64
  • Phoenix 4.6
  • HBase 1.0.0
  • 通过观察3.2结果中的数据,可得出以下结论:

    对比T1和其他可知, 有分区相对无分区在插入和查询上都有极大的性能提升。

    对比T3和T4,T8和T9可知, 在一定范围内,增大索引分区数使插入变慢,查询变快。

    对比T11和T12可知, 当索引分区达到一定大小后,再增加分区数已经无法提升查询性能。

    综合比较来看, 当前集群在表分区数和索引分区数均为40时插入和查询的综合性能最好。

    因此,Phoenix的性能测试中将采用表分区数和索引分区数均为40的方案。