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进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时 ...
随机推荐
- tsinsen A1333. 矩阵乘法(梁 盾)
A1333. 矩阵乘法(梁 盾) 时间限制:2.0s 内存限制:256.0MB 总提交次数:515 AC次数:211 平均分:54.14 将本题分享到: 查看未格式化 ...
- HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...
- 初步认识dubbo--小案例
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...
- influxDB---数据库操作SQL
查询 查询不能只查tag标签,一定要加上fields. 如:select val,"班组" FROM "测试表" WHERE dev = 'cs123' and ...
- Magic Cast Method in Java Magic Trick In Java
https://www.atlassian.com/blog/archives/magic_trick_in_java https://www.gamlor.info/wordpress/2010/1 ...
- 【转】Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...
- Java源码之Object
本文出自:http://blog.csdn.net/dt235201314/article/details/78318399 一丶概述 JAVA中所有的类都继承自Object类,就从Object作为源 ...
- PhpStorm2017.1版激活方法、汉化方法以及界面配置
本教程仅对2017.1版有效!!!!!! PhpStorm激活和汉化文件下载网址(提取密码:62cg) PhpStorm的介绍 PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提高用户效率, ...
- python面试题(六)
1 异常处理写法以及如何主动跑出异常(应用场景) try: """执行语句""" except: #异常类型 ""&qu ...
- Ubuntu14.04下Nginx反向代理Odoo域名
安装nginx sudo apt-get install -y nginx 修改配置文件 vi /etc/nginx/nginx.conf #注释掉下面这行代码 #include /etc/nginx ...