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进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时 ...
随机推荐
- X明X源面试题《三》
本文转自自zhangxh_Doris 昨天(05.23)下午去参加了明源软件的暑期实习宣讲+笔试,第一次听说这个行业,行业和笔试风格完全不一样啊,5道行测智力题+1个问答+ 斐波那契数列 + 洗牌算法 ...
- [Spring Data Repositories]学习笔记--为repository添加通用的方法
如果想把一个方法加到所有的repository中,用前一篇提到的方法就不合适了. 英文原版,请看 http://docs.spring.io/spring-data/data-mongo/docs/1 ...
- 从ELK到EFK
https://my.oschina.net/itshare/blog/775466 http://blog.51cto.com/467754239/1700828 日志系统 日志就是程序产生的,遵循 ...
- WCF基础之事务
说到事务,我最先想到的是“回滚”. 百科:事务是恢复和并发控制的基本单位.事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性.好了,具体的就不多复制了. 我小试了一下 ...
- 巨蟒python全栈开发django13:中间件部分
1.回顾昨日内容 2.session认证装饰器 3.django整个流程 4.中间件简单应用 5.简单统计访问次数 6.中间件其他方法 7.orm单表内容回顾
- JavaWeb 三层框架
1. MVC 设计模式 Model: JavaBean; View: Jsp; Controller: Servlet; 2. JavaWeb 三层框架 所谓三层是表述层(WEB 层), 业务逻辑层( ...
- python中os模块函数方法详解最全最新
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 import os print(os.getcwd()) os.chdir("dirname") 改 ...
- centos系统时间相差8个小时解决方案
查看当前系统时间 [root@centos64 ~]# date 查看硬件时间 [root@centos64 ~]# hwclock --show 同步时间可以用:ntpdate us.pool.nt ...
- java中参数传递的问题
public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer(" ...
- Nginx学习(1)
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 ...