vertica rebalance优化
本文翻译整理自:优化rebalancing
vertica rebalance的介绍内容分为两部分,其中对于rebalance的基础介绍,可参考之前的博文《vertica集群增加节点(扩容)》,该博文中的内容主要参考rebalance期间做了哪些工作。
开始rebalance过程
rebalance过程需要与正在进行的查询共享计算机资源,并且需要在短时间内独占访问资源或锁。为避免可能发生的并发问题,请在加载任务少的时候安排rebalance。
加载期间可能发生的并发问题是:
- 如果rebalance拥有COPY操作所需的锁,则COPY操作将超时。
- 如果COPY拥有锁,则rebalance会暂停直到COPY完成。
您可以使用Vertica文档中描述的三种方式中的任何一种来开始rebalance:
- 使用admintools工具重分布数据
- 使用管理控制台重分布数据
- 使用SQL函数重分布数据
监控rebalance
监视rebalance过程,以确保其顺利进行。以下各节介绍了用于监视重新平衡过程的技术。
监视表正在运行的rebalance
要监视Vertica重分布哪些表,请运行:
SELECT * FROM rebalance_table_status;
如果任何DML或DDL操作干扰了某些表的重新平衡,您会看到以下错误消息:
ERROR 3007: DDL statement interfered with this statement
监控Vertica系统表
rebalace期间,请检查以下系统表:
REBALANCE_TABLE_STATUS-对于每个数据库表,包含:
- 已分离的数据量
- 仍需要分离的数据量
REBALANCE_PROJECTION_STATUS-对于每个投影,包含:
- 已分离的数据量
- 仍需要分离的数据量
监视群集rebalance的查询
本节提供了示例查询,可帮助您监视群集上的rebalace操作。
监视正在运行的rebalance操作
以下查询提供有关当前正在运行的rebalance操作的信息:
- 正在运行rebalance的节点
- rebalance操作的会话ID
- rebalance开始的时间。这可以使您了解rebalance需要多长时间。
- 当前正在执行rebalance任务
=> SELECT node_name, session_id, session_start_timestamp, descriptionFROM system_sessionsWHERE session_type = 'REBALANCE_CLUSTER'AND is_active;node_name | session_id | session_start_timestamp | description
-----------+------------------+-------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------node001 | user-9956:0x2fb6 | 2016-02-11 21:36:16.045711-05 | Txn: a000000000b167 'RebalanceUnsegmentedTask'node001 | user-9956:0x2fb6 | 2016-02-11 21:36:16.045711-05 | Txn: a000000000b168 'CREATE PROJECTION public.dim7_node006 /*+basename(dim7),createtype(P)*/ ( a, b ) AS SELECT dim7.a, dim7.b FROM public.dim7 ORDER BY dim7.a, dim7.b UNSEGMENTED NODE node006; 'node001 | user-9956:0x2fc0 | 2016-02-11 21:36:16.13772-05 | Txn: a000000000b16b 'Refresh: Evaluating which projection to refresh'node001 | user-9956:0x2fc0 | 2016-02-11 21:36:16.13772-05 | Txn: a000000000b16c 'Refresh: (Table: public.dim7) (Projection: public.dim7_node006)'
监视rebalance操作的总体进度
以下查询监视每个当前正在执行的rebalance操作的进度并返回:
- 用于rebalance当前投影的方法。可能的值为:
- 刷新
- 复制
- ELASTIC_CLUSTER
- 该方法的状态
- 投影数
=> SELECT rebalance_method Rebalance_method, Status, COUNT(*) AS CountFROM ( SELECT rebalance_method,CASEWHEN (separated_percent = 100AND transferred_percent = 100) THEN 'Completed'WHEN (separated_percent <> 0and separated_percent <> 100)OR (transferred_percent <> 0AND transferred_percent <> 100) THEN 'In Progress'ELSE 'Queued'END AS StatusFROM rebalance_projection_statusWHERE is_latest) AS tabGROUP BY 1, 2ORDER BY 1, 2;Rebalance_method | Status | Count
------------------+-------------+-------ELASTIC_CLUSTER | Completed | 8ELASTIC_CLUSTER | In Progress | 2ELASTIC_CLUSTER | Queued | 2REPLICATE | Completed | 50
(4 rows)
监视未分段投影的rebalance活动
以下查询返回有关当前正在刷新的未分段投影的信息:
- 当前正在执行的rebalance操作的会话ID
- 正在刷新的未分段投影的名称
- 刷新操作的当前状态
- 用于刷新投影的方法
- 刷新进行了多长时间。可能的阶段是:
- 当前
- 历史的
=> SELECT session_id, projection_name, refresh_status, refresh_method, refresh_phaseFROM projection_refreshesWHERE refresh_method = 'rebalance'AND is_executing; session_id | projection_name | refresh_status | refresh_method | refresh_phase
------------------+-----------------+----------------+----------------+---------------user-9956:0x8cf0 | dim2_node004 | refreshing | rebalance | currentuser-9956:0x8d24 | dim2_node005 | refreshing | rebalance | historicaluser-9956:0x8d25 | dim2_node006 | refreshing | rebalance | historical
(3 rows)
监视分段投影的rebalance活动
以下查询返回有关当前正在刷新的分段投影的信息:
- 投影名称
- 用于刷新投影的方法
- 分离的ROS容器百分比
- 转移到目标节点的ROS容器的百分比
=> SELECT projection_name, rebalance_method, separated_percent, transferred_percentFROM rebalance_projection_statusWHERE rebalance_method = 'ELASTIC_CLUSTER'AND (separated_percent <> 0AND separated_percent <> 100)OR (transferred_percent <> 0AND transferred_percent <> 100)AND is_latest;projection_name | rebalance_method | separated_percent | transferred_percent
-----------------+------------------+-------------------+---------------------fact5_b1 | ELASTIC_CLUSTER | 100.00 | 13.23fact4_b1 | ELASTIC_CLUSTER | 78.77 | 0.00fact5_b0 | ELASTIC_CLUSTER | 100.00 | 13.63
(3 rows)
监视rebalance完成的投影所花费的时间
以下查询为您提供了rebalance每个投影所花费的时间的信息:
- 运行rebalance的节点
- schema名称
- 投影名称
- rebalance操作的开始时间
- rebalance该投影所花费的时间(以秒为单位)
rebalance和锁定竞争
如果在ETL作业运行时重新平衡群集,则可能存在争用锁的情况。此争用可能导致加载作业或重新平衡操作失败。
减少竞争
在重新平衡期间可能导致与元组移动器发生锁争用的数据库操作是:
- delete
- update
- DROP_PARTION
- SWAP_PARTITION_BETWEEN_TABLES
- MOVE_PARTITION_TO_TABLE
以下各节介绍了三种诊断,计划和管理重新平衡操作以最小化竞争的方式:
- 增加锁超时时间
- 优先考虑重新平衡和元组移动器操作
- 手动重新平衡表
增加锁超时时间
以下查询返回哪些特定事务持有锁定超过五分钟:
=> SELECT DISTINCT query_requests.transaction_id, statement_id, request
FROM dc_lock_releases JOIN query_requests USING (session_id)
WHERE time - grant_time > '5 min'
AND mode IN ('X','S')
AND object_name NOT LIKE 'ElasticCluster'
ORDER BY statement_id;
-[ RECORD 1 ]--+-----------------------------------------
transaction_id | 45035996273756069
statement_id | 1
request | UPDATE /*+label(UPDATE_u1), DIRECT*/ u1 SET c200 = c200 - 1 where C200 < 100;
-[ RECORD 2 ]--+-----------------------------------------
transaction_id | 45035996273756069
statement_id | 2
request | commit;
(2 rows)
为了避免竞争这些事务,您可以执行以下操作之一:
- 在与ETL作业不冲突的时间重新安排rebalance。
- 增加LockTimeout参数,以便在rebalance集群时ETL作业不会超时:
=> SELECT GET_CONFIG_PARAMETER('locktimeout');
GET_CONFIG_PARAMETER
----------------------300
(1 row)
=> SELECT SET_CONFIG_PARAMETER('LockTimeOut, 600)
SET_CONFIG_PARAMETER
----------------------------
Parameter set successfully
(1 row)
重新平衡完成后,请记住将LockTimeout参数重置为其先前的值。
优先考虑重新平衡和元组移动器操作
假设DML作业尝试访问重新平衡已锁定的表。默认情况下,DML操作获取到锁,取消再平衡。五分钟后,重新平衡将继续尝试访问表并完成重新平衡。
如果希望重新平衡不间断运行,请通过将DMLCancelTM配置参数设置为false来优先考虑重新平衡过程。使用此设置,DML作业无法获得正在进行的重新平衡的锁定。
要设置DMLCancelTM并开始重新平衡,请执行以下操作:
=> SELECT SET_CONFiG_PARAMETER('DMLCancelTM',false);
....
=> SELECT REBALANCE_CLUSTER();
....
如果您的DML任务很重要,请不要将DMLCancelTM的值更改为false以进行重新平衡。将DMLCancelTM设置为true可以运行DML作业。
考虑在与关键DML作业不冲突的时候运行重新平衡。重新平衡完成后,请始终将DMLCancelTM设置为true。
=> SELECT SET_CONFiG_PARAMETER('DMLCancelTM', true);
手动重新平衡表
如果您有很多表并且需要几个晚上或周末来重新平衡群集,则可以在每个晚上或周末手动重新平衡固定数量的表。
您可以一次手动重新平衡一个或多个表。为避免在手动重新平衡期间发生争用,请确保没有ETL作业正在运行。
要重新平衡表,请调用REBALANCE_TABLE函数:
=> SELECT REBALANCE_TABLE('t0');
要找出哪些表已重新平衡,正在处理中的平衡表或尚未重新平衡的表,请运行以下查询:
=> SELECT table_name,CASEWHEN separated_percent + transferred_percent = 200 THEN 'REBALANCED'WHEN (separated_percent + transferred_percent) < 200AND (separated_percent + transferred_percent) > 0THEN 'REBALANCING' ELSE 'NOT REBALANCED YET'END statusFROM rebalance_table_status WHERE is_latest;table_name | case
------------+----------------t0 | REBALANCEDt1 | NOT REBALANCED YETt2 | REBALANCING
(3 rows)
重新平衡期间的竞争错误
重新平衡期间可能会发生几种争用错误,其中包括以下内容,以下各节将对此进行讨论:
- DDL statement interfered with this statement. Unavailable: lock table for query - Locking failure
- Staging table and target table do not match: Projections definition mismatch
- Unavailable: [Txn 0xa0000000010113] S lock table - timeout error Timed out
更改架构
重新平衡过程中,其他作业可能执行以下操作:
- 添加或删除列
- 添加或删除投影
- 交换或移动分区
重新平衡时,您可能会看到锁定错误。当另一个作业尝试锁定已由重新平衡操作锁定的表时,将发生此错误:
ERROR 3007: DDL statement interfered with this statement
ERROR 5157: Unavailable: lock table for query - Locking failure: Timed out X locking
Table:public.t0. T held by [user condor (RebalanceElasticTask)]. Your current transaction isolation
level is SERIALIZABLE
交换分区
如果您尝试在两个表之间交换分区,一个已经重新平衡,另一个没有重新平衡,则会看到以下错误:
=> SELECT SWAP_PARTITIONS_BETWEEN_TABLES('t0', 1, 1, 't1');
ERROR 7121: Staging table and target table do not match: Projections definition mismatch
您只能在两个都已重新平衡或都没有重新平衡的表之间交换分区。
获取有关争用错误的信息
如果由于错误或锁争用导致重新平衡失败,则要获取有关错误的信息,请运行以下查询:
=> SELECT time, session_id, error_level, node_name, log_messageFROM dc_errors WHERE session_id IN(SELECT DISTINCT session_idFROM dc_session_startsWHERE session_type = 'REBALANCE_CLUSTER') ORDER BY time DESC;
-[RECORD 1]-------------------------------
time | 2016-03-05 10:47:08.517557-05
session_id | eng-g9-046.verticac-2421955:0xad43
error_level | 20
node_name | node001
log_message | Unavailable: [Txn 0xa0000000010113] S lock table - timeout error Timed out S locking
Table:public.t1. I held
重新平衡错误后重新启动
如果重新平衡由于错误而失败或被DML操作取消,Vertica将尝试在300秒(5分钟)后重新运行重新平衡。这意味着Vertica等待5分钟,然后尝试重新启动重新平衡。
=> SELECT LIST_SERVICES('TM');list_services
------------------------------------------------------------------------------------
Service: 'RebalanceCluster' is enabled , interval 300 second(s)
重新平衡后
重新平衡完成后,请检查以下内容:
- 重新平衡是否成功完成?
- K-safety正确吗?
- 基准性能是多少?
成功或失败
如果在重新平衡数据库时发生故障,则可以再次重新平衡。如果故障原因已解决,则重新平衡操作将从失败的地方继续。但是,失败的数据重新平衡可能导致Vertica无法自动删除过时的投影。
要找到任何此类投影,请查询V_CATALOG.PROJECTIONS系统表,如下所示:
=> SELECT projection_name, anchor_table_name, is_prejoin, is_up_to_dateFROM projections WHERE is_up_to_date = FALSE;
要删除过时的投影,请使用DROP PROJECTION SQL命令。
使用Vertica工具监控系统性能
Vertica提供了两种工具来监视系统性能。但是,它们会严重影响系统性能,因此不要在重新平衡期间运行它们:
- vioperf:测量硬盘驱动器的速度和一致性。
- vnetperf:测量节点之间的网络延迟和吞吐量。
添加节点后,请使用这些工具验证新扩展的群集的性能。
vertica rebalance优化相关推荐
- Vertica DBD 分析优化设计
DBD = Database Designer,是Vertica数据库优化中最主要的原生工具. 首先运行admintools工具,按下面步骤依次执行: 1.选择"6 Configuratio ...
- Vertica, MPP Database and Use Cases
本文转载自:http://wenda.chinahadoop.cn/question/1029 是一篇演讲文,而且时间比较早,2015年,当时vertica的最新版本是7.2,现在(2019年)已经出 ...
- 面向服务的大数据分析平台解决方案
近年来, 大数据处理与分析已经成为全球性问题,引起欧美各国政府和产业界高度重视,美国政府于2012年3月率先发布了<大数据研究与发展计划>, Google, Amazon. Faceboo ...
- Vertica系列:数仓优化
最近才开始接触数仓性能优化,好像走进迷宫,头上永远顶着两句话: 这个是啥,那个是啥 因为数仓好像没啥性能优化的,可能这是小白的一种自我良好认知 根据我们的业务,优化工具经常用到的有以下两个 1.和my ...
- Elasticsearch性能优化实战指南
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 0.背景 在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要的分析结果,需 ...
- 高并发系列:架构优化之从BAT实际案例看消息中间件的妙用
包含原理+BAT案例实践,看完需要5分钟 本文内容预览: 是什么?为什么? 1.1 什么是消息队列 1.2 为什么要使用消息队列 1.3 引入消息队列的带来了哪些问题 怎么样? 2.1 支撑七年双11 ...
- 京东Flink优化与技术实践
分享嘉宾:付海涛 京东 高级技术专家 编辑整理:赵明明 出品平台:DataFunTalk 导读:Flink是目前流式处理领域的热门引擎,具备高吞吐.低延迟的特点,在实时数仓.实时风控.实时推荐等多个场 ...
- Vertica数据库
Vertica是一款基于列存储的MPP(massively parallel processing)架构的数据库. [2] 它可以支持存放多至PB(Petabyte)级别的结构化数据.Vertica是 ...
- Vertica集群扩容实验过程记录
需求: 将3个节点的Vertica集群扩容,额外增加3个节点,即扩展到6个节点的Vertica集群. 实验环境: RHEL 6.5 + Vertica 7.2.2-2 步骤: 1.三节点Vertica ...
最新文章
- Web开发的历史发展技术演变
- POJ1204 Word Puzzles
- 《汇编语言》课程设计
- linux进程作为服务,将一个监视进程做成linux系统服务
- Bouncy Castle Crypto API c# port
- 让组件悬浮所有页面之上
- MATLAB常用三角函数
- Linux chapter 5
- GWR模型报错汇总(arcgis与GWR4)
- 松下plc编程线usb驱动
- SDL游戏开发之七-虚拟摇杆
- LEADBBS 不要验证码
- win10:为U盘设计图标
- Canvas: trying to draw too large bitmap 红米 k30 奔溃
- 2018年大连海事大学校赛(ACM竞赛高校联盟训练赛 第11场)题解
- [导读]7 Steps to Mastering Machine Learning With Python
- 制作 docker 精简 jre8 基础镜像
- 智联招聘数据Hbase数据分析+可视化
- Angular self study 4 - data entered by end user
- 畸变校正与极线校正(具体原理+Matlab代码)
热门文章
- java 协方差矩阵_协方差矩阵概念(易理解)
- Proximity sensor---Px318J
- Briarcliff Entertainment 购买了关于开创性的非裔美国 NBA 球员的电视剧“Sweetwater”(独家)
- Android 网络获取图片处理
- Hangfire Pro 2022-08-31 update
- 【因缘际会】知乎APP的简单的产品体验报告
- java.io.IOException: Attempted read from closed stream.
- 嵌入式学习的几种线路图
- 重磅!Waymo首席执行官离职,自动驾驶商业化打上“问号”
- 欣赏 Pianissimo!!! 钢琴演奏会