Phoenix表和索引分区数对插入和查询性能的影响
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 测试用例
| 用例编号 | 表分区数 | 索引分区数 | 插入时间 | 查询时间 |
|---|---|---|---|---|
| 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表和索引分区数对插入和查询性能的影响的更多相关文章
- Phoenix表和索引分区优化方法
Phoenix表和索引分区,基本优化方法 优化方法 1. SALT_BUCKETS RowKey SALT_BUCKETS 分区 2. Pre-split RowKey分区 3. 分列族 4. 使用压 ...
- 主键乱序插入对Innodb性能的影响
主键乱序插入对Innodb性能的影响 在平时的mysql文档学习中我们经常会看到这么一句话: MySQL tries to leave space so that future inserts do ...
- mysql 优化海量数据插入和查询性能
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...
- day60——单表操作补充(批量插入、查询、表结构)
day60 批量插入(bulk_create) # bulk_create obj_list = [] for i in range(20): obj = models.Book( title=f'金 ...
- SQL Server覆盖索引--有无包含列对数据库查询性能的影响分析
“覆盖索引使您能够避免返回到表中以满足请求的所有列,因为所有请求的列都已经存在于非聚集索引中.这意味着您还可以避免返回到表中进行任何逻辑或物理的信息读取.” 然而,以上这不是我想要传达的全部意思,因为 ...
- day44——索引、explain、慢查询、数据备份、锁、事务
day44 索引介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还有一些复杂的查询操作 ...
- SQL Server查询性能优化——覆盖索引(二)
在SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索引等 ...
- SQL Server 查询性能优化——覆盖索引
覆盖索引又可以称为索引覆盖. 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引 ...
- 第十三章——表和索引分区(1)——使用Range Left进行表分区
原文:第十三章--表和索引分区(1)--使用Range Left进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时 ...
随机推荐
- coreData笔记
1. CDVehicle *vehicle = (CDVehicle *)[[NSManagedObject alloc] initWithEntity:entity insertIntoMan ...
- jqGrid 事件
jqGrid 事件 使用方法 var lastSel; jQuery("#gridid").jqGrid({ ... onSelectRow: function(id){ if(i ...
- JS探秘——那些你理解存在偏差的问题
Javascript的连续赋值运算 var a = {n:1}; a.x = a = {n:2}; alert(a.x); // --> undefined 看 jQuery 源码 时发现的这种 ...
- Linux安装mysql8.*
分别在Linux和windows上安装mysql8.* 环境 CentOS7 安装mysql8 步骤: window下的Navicat 连接MySql8: 第一部分 CentOS7安装mysql8 1 ...
- JavaScript正则中\1\2的作用
一.示例 1. 验证6个相同的数字 var reg = new RegExp(/^(\d)\1{5}/g); var a = '333333'; if(reg.test(a)) { alert('ri ...
- 基于Cpython的 GIL(Global Interpreter Lock)
一 介绍 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native t ...
- LinuxCentos系统安装Nginx过程记录
网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务就是Web网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web网络服务是一种被动访问的服务程 ...
- web测试策略
一.输入框 二.搜索功能 三.添加功能 四.修改功能 五.删除功能 六.注册.登陆模块 七.上传图片测试 八:文件导出 九.文件下载页面 十.查询结果列表 十一.cookie 一.输入框 1 字 ...
- 自定义gradle plugin
最近开始接触gradle 正好有个需求apidoc
- FSR薄膜压力传感器使用教程
FSR薄膜压力传感器教程 本店常用的外形有2种: 圆形: 长条形: 如果用单片机控制建议买带转换的,可以直接接单片机AD口或者数字IO去读取数值: 电压输出的AO接口是模拟量输出,可以接单片机的模拟口 ...