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进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时 ...
随机推荐
- iOS cocos2d 2游戏开发实战(第3版)书评
2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...
- 对 pthread 做的一个简陋封装
参考自 pthreadcc 库的 ThreadBase 类 用法:继承该类,重写 execute 方法,调用父类的 launchThread 方法启动线程 Thread.h // // Thread. ...
- 【BZOJ2384】[Ceoi2011]Match KMP
[BZOJ2384][Ceoi2011]Match Description 作为新一轮广告大战的一部分,格丁尼亚的一家大公司准备在城市的某处设置公司的标志(logo).公司经理决定用一些整栋的建筑来构 ...
- 如何使用 stl 进行排列组合?
#include <iostream> #include <vector> #include <algorithm> //从 indexs 集合中选择 num 个元 ...
- Verilog HDL实用教程笔记
Verilog HDL实用教程笔记 DRC - Design Rule Check 几何规则检查ERC - Electrical Rule Check 电学规则检查自动参数提取LVS - Logic ...
- C++学习之旅get、getline的使用方法
C++学习之旅get.getline的使用方法 面向行的输入:cin.getline(). 该函数读取整行.它使用通过回车键输入的换行符来确定输入结尾.要调用这样的方法,能够使用cin.getline ...
- 卸载SQL Server 2008 (R2)
一.卸载SQL Server 2008 (R2) 1.找到控制面板,win8及win7都可以直接点解“开始”按钮找到. (Tip:win10系统的小盆友可以在“开始”菜单下点击“所有应用”,找到win ...
- app开发学习需要经历哪些流程
app开发学习需要经历哪些流程?如何零基础入门app开发?以下是知乎热心开发者的经验总结,对学习app开发有很好的参考意义 1.如果没有编程基础的,学习基础知识的过程肯定是必须的.2.有了一些基础 ...
- c语言复制文件程序
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 1024*1024* ...
- 从1到N中1的个数
示例1,2...9,10,11中有四个1 int getNumber(int n) { int count = 0; int factor = 1; int low = 0; int cur = 0; ...