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 方案设计

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

相同的条件有:

  1. 用90*2线程执行插入
  2. 用1个线程进行查询
  3. 每轮查询执行42条查询语句,重复10次
  4. 表的总记录数为1000万
  5. 表的字段数和每个字段的类型
  6. 每个表都建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 测试用例

用例编号 表分区数 索引分区数 插入时间 查询时间
T1 0 0    
T2 12 12    
T3 20 1    
T4 20 20    
T5 40 20    
T6 40 40    
T7 60 60    
T8 80 12    
T9 80 40    
T10 80 80    
T11 120 40    
T12 120 120  

3. 结果

3.1 软硬件环境

  • Master服务器

    • IP:192.168.20.100,192.168.20.101
    • 硬件:
      • 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
  • Region服务器
    • IP:192.168.20.102, 192.168.20.103, 192.168.20.104, 192.168.20.105
    • 硬件:
      • 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
  • 客户端服务器
    • IP:192.168.20.100,192.168.20.102
    • 硬件:
      • 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
  • Phoenix客户端
    • IP:192.168.20.101
    • 硬件:
      • 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 0 0 779 4490
T2 12 12 303 735
T3 20 1 203 1200
T4 20 20 319 697
T5 40 20 380 592
T6 40 40 369 531
T7 60 60 441 587
T8 80 12 384 714
T9 80 40 522 653
T10 80 80 478 623
T11 120 40 512 764
T12 120 120 526 753

插入时间和查询时间单位均为秒。
查询时间为执行42个查询每个查询10次的总时间。

4. 分析

通过观察3.2结果中的数据,可得出以下结论:

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

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

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

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

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

Phoenix表和索引分区数对插入和查询性能的影响的更多相关文章

  1. Phoenix表和索引分区优化方法

    Phoenix表和索引分区,基本优化方法 优化方法 1. SALT_BUCKETS RowKey SALT_BUCKETS 分区 2. Pre-split RowKey分区 3. 分列族 4. 使用压 ...

  2. 主键乱序插入对Innodb性能的影响

    主键乱序插入对Innodb性能的影响 在平时的mysql文档学习中我们经常会看到这么一句话: MySQL tries to leave space so that future inserts do ...

  3. mysql 优化海量数据插入和查询性能

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...

  4. day60——单表操作补充(批量插入、查询、表结构)

    day60 批量插入(bulk_create) # bulk_create obj_list = [] for i in range(20): obj = models.Book( title=f'金 ...

  5. SQL Server覆盖索引--有无包含列对数据库查询性能的影响分析

    “覆盖索引使您能够避免返回到表中以满足请求的所有列,因为所有请求的列都已经存在于非聚集索引中.这意味着您还可以避免返回到表中进行任何逻辑或物理的信息读取.” 然而,以上这不是我想要传达的全部意思,因为 ...

  6. day44——索引、explain、慢查询、数据备份、锁、事务

    day44 索引介绍 为何要有索引? ​ 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还有一些复杂的查询操作 ...

  7. SQL Server查询性能优化——覆盖索引(二)

    在SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索引等 ...

  8. SQL Server 查询性能优化——覆盖索引

    覆盖索引又可以称为索引覆盖. 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引 ...

  9. 第十三章——表和索引分区(1)——使用Range Left进行表分区

    原文:第十三章--表和索引分区(1)--使用Range Left进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时 ...

随机推荐

  1. EasyDSS流媒体服务器软件支持HTTPS-启用https服务申请免费证书

    EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作. 其中,点播功能主要包含:上传.转码.分发.直播功能,主要包含:直播.录像, 直播支持RTMP ...

  2. EasyNVR摄像机网页无插件直播使用过程中问题的自我排查-设备不在线问题的自我排查

    系列背景 由于EasyNVR的受众越来越多,时长会遇到很对类似的问题咨询,之前虽然有写过很多的博文进行技术的或者使用问题的解答,随着客户询问的增多,我发现,要想然客户了解问题和解决问题,往往引导和给一 ...

  3. 巨蟒python全栈开发linux之centos6

    1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...

  4. the core of Git is a simple key-value data store The objects directory stores all the content for your database

    w https://git-scm.com/book/en/v1/Git-Internals-Plumbing-and-Porcelain Git is a content-addressable f ...

  5. TGraphicControl(自绘就2步,直接自绘自己,不需要调用VCL框架提供的函数重绘所有子控件,也不需要自己来提供PaintWindow函数让管理框架来调用)与TControl关键属性方法速记(Repaint要求父控件执行详细代码来重绘自己,还是直接要求Invalidate无效后Update刷新父控件,就看透明不透明这个属性,因为计算显示的区域有所不同)

    TGraphicControl = class(TControl) private FCanvas: TCanvas; procedure WMPaint(var Message: TWMPaint) ...

  6. Verilog HDL实用教程笔记

    Verilog HDL实用教程笔记 DRC - Design Rule Check 几何规则检查ERC - Electrical Rule Check 电学规则检查自动参数提取LVS - Logic ...

  7. python基本数据类型之操作

    python注释 当行注视:# 被注释内容多行注释:""" 被注释内容 """ 字符串操作 # 代表单行注释                ...

  8. 数据库之MySQL(四)

    数据库中的范式: 第一范式(1NF): 数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性. 例如: userInfo: '山东省烟台市 1318162008' 依照第一范式 ...

  9. java 抽象类实现接口

    1.抽象类肯定可以实现接口:  2.这不是有没有意义的事情,是一种思想,当你自己写的类想用接口中个别方法的时候(注意不是所有的方法),那么你就可以用一个抽象类先实现这个接口(方法体中为空),然后再用你 ...

  10. open-falcon 前端代码在windows上运行

    1: 下载代码git clone https://github.com/open-falcon/dashboard.git 2:在代码\dashboard-0.2.0 的根目录下安装 python虚拟 ...