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进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时 ...
随机推荐
- WPF中DPI的问题
先搞清楚一下几个概念: DPI:dots per inch ,每英寸的点数.我们常说的鼠标DPI,是指鼠标移动一英寸的距离滑过的点数:打印DPI,每英寸的长度打印的点数:扫描DPI,每英寸扫描了多 ...
- TestClass必须是public的
运行一个测试类遇到一下问题: namespace TestSample.Sample { [TestClass] class CynthiaTest { [Te ...
- git是一种思路,解决问题的算法
w 首先,弄清思路.算法:这是高效学习.高效产出的方法.
- Google 翻译如何获取 tk 参数值?
1.首先获取 TKK 参数,这个参数可以在 https://translate.google.com 网页获取, src:TKK=eval('((function(){var a\x3d2089517 ...
- 洛谷 P1462 通往奥格瑞玛的道路
洛谷 题意:要求在限定油耗内,求最小花费的最大值. 求最小值最大很容易想到二分答案.所以我们往二分的方向去想. 我们二分一个费用,然后要保证到终点时满足限定油耗,所以跑最短路. 不过松弛条件要改一下: ...
- 如何安装secureCRT8.1破解
安装地址 网盘: https://pan.baidu.com/s/1iGxi6BTCMC_jewCwcUHhgA 密码: u6jq 安装教程 1.点击安装 2.全部默认即可,安装完成之后再桌面上右击该 ...
- MySql存储过程、函数
存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句.而且,存储过程和函数是在MyS ...
- POJ 1470 Closest Common Ancestors【近期公共祖先LCA】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...
- make menuconfig 时出现 mixed implicit and normal rules: deprecated syntax
這是 make 的版本問題!不清楚為何要這樣限制? 將此行 config %config: scripts_basic outputmakefile FORCE改成 ...
- java switch case 枚举类型的反编译结果
package com.example.demo; import java.io.PrintStream; // Referenced classes of package com.example ...