【Hive实战】Hive的压缩池与锁

文章目录

    • Hive的压缩池
      • 池的分配策略
        • 自动分配
        • 手动分配
        • 隐式分配
      • 池的等待超时
      • Labeled worker pools 标记的工作线程(自定义线程池)
      • Default pool 默认池
      • Worker allocation 工作线程的分配
    • Turn Off Concurrency
    • Debugging
    • Configuration
          • hive.support.concurrency
          • hive.lock.manager
          • hive.lock.mapred.only.operation
          • hive.lock.query.string.max.length
          • hive.lock.numretries
          • hive.unlock.numretries
          • hive.lock.sleep.between.retries
          • hive.zookeeper.quorum
          • hive.zookeeper.client.port
          • hive.zookeeper.session.timeout
          • hive.zookeeper.namespace
          • hive.zookeeper.clean.extra.nodes
          • hive.lockmgr.zookeeper.default.partition.name

Hive的压缩池

Compaction pooling

可以将压缩请求和工作线程分配到池中。 分配给特定池的工作线程将仅处理该池中的压缩请求。 没有分配池的工作线程和压缩请求隐式属于默认池。 池概念允许对处理压缩请求进行微调。 例如,可以创建一个名称为“高优先级压缩”的池,为其分配一些经常修改的表,并将一组工作线程专用于该池。 因此,即使默认队列中还有其他几个压缩请求(之前排队),这些表的压缩请求也将立即由专用工作线程获取。

池的分配策略

可以通过三种不同的方式将压缩请求分配给池。

自动分配

可以通过配置数据库、表和分区的属性的方式分配到压缩池:

hive.compactor.worker.pool={pool_name}

数据库/表属性。 如果该属性是在数据库级别设置的,则它适用于所有表和分区。 池也可以在表/分区级别上分配,在这种情况下,它会覆盖数据库级别值(如果设置)。

CREATE TABLE table_name (id                int,name              string
)
CLUSTERED BY (id) INTO 2 BUCKETS STORED AS ORC
TBLPROPERTIES ("transactional"="true",
);

如果设置了上述任何一项,则发起者在创建压缩请求期间将使用它。

手动分配

ALTER TABLE COMPACT table_name POOL 'pool_name';

还可以使用 ALTER TABLE COMPACT 命令将压缩请求分配给池(例如手动压缩)。 如果提供,该值将覆盖任何级别的 hive.compactor.worker.pool 值。

隐式分配

没有指定池名称的表、分区和手动压缩请求将隐式分配给默认池。

池的等待超时

如果压缩请求在预定义的时间内没有被任何标记池处理,它将回退到默认池。 超时时间可以通过设置

hive.compactor.worker.pool.timeout

配置属性。 该方法涵盖以下场景:

  • 请求被意外分配给不存在的池。 (例如:发出 ALTER TABLE COMPACT 命令时池名称中的拼写错误。
  • 发起者用来创建压缩请求的数据库或表属性中的拼写错误。
  • HS2(HiveServer2) 实例由于缩减或计划而停止,并且仍应处理其挂起的压缩请求。

可以通过将配置属性设置为 0 来禁用超时。

Labeled worker pools 标记的工作线程(自定义线程池)

标记的工作池可以通过以下方式定义

hive.compactor.worker.{poolname}.threads={thread_count} 

配置设置

Default pool 默认池

默认池负责处理未标记和超时的压缩请求。 在集群范围内,至少一个节点上的至少 1 个工作线程应分配给默认池,否则可能永远不会处理压缩请求。

Worker allocation 工作线程的分配

已经存在的 hive.compactor.worker.threads 配置值保存最大工作线程数。 工作线程分配如下:

  • 标记池以随机顺序按顺序初始化。
  • 每个池都会根据自己的工作线程数量减少可用工作线程的数量。
  • 如果可分配的worker数量少于配置的数量,则池大小将被调整(换句话说:如果请求的池大小为5,但只剩下3个worker,则池大小将减少到3)。
  • 如果可分配的worker数量为0,则池不会被初始化。
  • 标记池中未用完的所有剩余工作人员将分配给默认池。

可以为每个 HS2 实例配置工作线程分配。

Locking

并发支持(http://issues.apache.org/jira/browse/HIVE-1293)是数据库中必须的,并且它们的用例很好理解。 至少,我们希望尽可能支持并发读取器和写入器。 添加一种机制来发现当前已获取的锁将很有用。 不需要立即添加 API 来显式获取任何锁,因此所有锁都将隐式获取。

hive 中将定义以下锁定模式(注意不需要意向锁)。

  • Shared (S)
  • Exclusive (X)

As the name suggests, multiple shared locks can be acquired at the same time, whereas X lock blocks all other locks.

The compatibility matrix is as follows:

顾名思义,可以同时获取多个共享锁,而 X 锁会阻塞所有其他锁。

兼容性矩阵如下:
在这里插入图片描述

对于某些操作,锁本质上是分层的——例如,对于某些分区操作,表也被锁定(以确保在创建新分区时不能删除表)。

获取锁模式背后的原理如下:

对于非分区表,锁定模式非常直观。 读取表时,会获取 S 锁,而所有其他操作(插入表、更改任何类型的表等)都会获取 X 锁。

对于分区表来说,思路如下:

执行读取时,会获取表和相关分区上的“S”锁。 对于所有其他操作,都会在分区上获取“X”锁。 但是,如果更改仅适用于较新的分区,则在表上获取“S”锁,而如果更改适用于所有分区,则在表上获取“X”锁。 因此,可以读取和写入较旧的分区,同时将较新的分区转换为 RCFile。 每当一个分区被锁定在任何模式下时,其所有父分区都会被锁定在“S”模式下。

基于此,一个操作获取的锁如下:

Hive CommandLocks Acquired
select … T1 partition P1S on T1, T1.P1
insert into T2(partition P2) select … T1 partition P1S on T2, T1, T1.P1 and X on T2.P2
insert into T2(partition P.Q) select … T1 partition P1S on T2, T2.P, T1, T1.P1 and X on T2.P.Q
alter table T1 rename T2X on T1
alter table T1 add colsX on T1
alter table T1 replace colsX on T1
alter table T1 change colsX on T1
alter table T1 *concatenate*X on T1
alter table T1 add partition P1S on T1, X on T1.P1
alter table T1 drop partition P1S on T1, X on T1.P1
alter table T1 touch partition P1S on T1, X on T1.P1
alter table T1 set serdepropertiesS on T1
alter table T1 set serializerS on T1
alter table T1 set file formatS on T1
alter table T1 set tblpropertiesX on T1
alter table T1 partition P1 concatenateX on T1.P1
drop table T1X on T1

为了避免死锁,这里提出了一个非常简单的方案。 将所有需要锁定的对象按字典顺序排序,并获取所需的模式锁。 请注意,在某些情况下,对象列表可能未知 - 例如,在动态分区的情况下,正在修改的分区列表在编译时未知 - 因此,该列表是保守生成的。 由于分区数量可能未知,因此应该在表或已知的前缀上采用独占锁(但目前不是由于 HIVE-3509 bug)。

将添加两个新的可配置参数来决定锁定的重试次数以及每次重试之间的等待时间。 如果重试次数非常高,可能会导致活锁。 查看 ZooKeeper recipes 以了解如何使用 Zookeeper api 实现读/写锁。 请注意,锁定请求将被拒绝,而不是等待。 现有的锁将被释放,并且在重试间隔后将全部重试。

由于锁的分层性质,上面列出的方法将无法按指定方式工作。

表 T 的“S”锁指定如下:

  • 调用create()创建一个路径名为“/warehouse/T/read-”的节点。 这是协议后面使用的锁定节点。 确保设置序列和临时标志。
  • 在锁定节点上调用 getChildren( ) 而不设置监视标志。
  • 如果有一个子进程的路径名以“write-”开头且序列号比所获得的序列号低,则无法获取锁。 删除第一步创建的节点并返回。
  • 否则授予锁定。

表 T 的“X”锁指定如下:

  • 调用create()创建一个路径名为“/warehouse/T/write-”的节点。 这是协议后面使用的锁定节点。 确保设置序列和临时标志。
  • 在锁定节点上调用 getChildren( ) 而不设置监视标志。
  • 如果存在一个路径名以“read-”或“write-”开头且序列号低于所获取序列号的子进程,则无法获取锁。 删除第一步创建的节点并返回。
  • 否则授予锁定。

这种模式的写入器或因为读取陷入饥饿状态。如果读取的时间太长,那么写入会陷入饥饿状态。
默认的 Hive 行为不会改变,并且不支持并发。

Turn Off Concurrency

您可以通过将以下变量设置为 false 来关闭并发:hive.support.concurrency。

Debugging

您可以通过发出以下命令来查看表上的锁:

  • SHOW LOCKS <TABLE_NAME>;
  • SHOW LOCKS <TABLE_NAME> EXTENDED;
  • SHOW LOCKS <TABLE_NAME> PARTITION (<PARTITION_DESC>);
  • SHOW LOCKS <TABLE_NAME> PARTITION (<PARTITION_DESC>) EXTENDED;

EXPLAIN LOCKS

这对于了解系统将获取哪些锁来运行指定的查询很有用。

EXPLAIN LOCKS UPDATE target SET b = 1 WHERE p IN (SELECT t.q1 FROM source t WHERE t.a1=5)

可以支持JSON输出

EXPLAIN FORMATTED LOCKS <sql>

Configuration

锁的相关配置数据属性 Locking.

hive.support.concurrency
  • Default Value: false
  • Added In: Hive 0.7.0 with HIVE-1293

Hive 是否支持并发。 ZooKeeper 实例必须启动并运行,默认 Hive 锁管理器才能支持读写锁。

设置为true以支持INSERT … VALUES、UPDATE 和 DELETE 事务(Hive 0.14.0 及更高版本)。 有关打开 Hive 事务所需的参数的完整列表,请参阅 hive.txn.manager

hive.lock.manager
  • Default Value: org.apache.hadoop.hive.ql.lockmgr.zookeeper.ZooKeeperHiveLockManager
  • Added In: Hive 0.7.0 with HIVE-1293

hive.support.concurrency 设置为true时使用的锁管理器。

hive.lock.mapred.only.operation
  • Default Value: false
  • Added In: Hive 0.8.0

此配置属性用于控制是否仅对需要执行至少一个 Mapred 作业的查询进行锁定

hive.lock.query.string.max.length
  • Default Value: 1000000
  • Added In: Hive 3.0.0

要存储在锁中的查询字符串的最大长度。 默认值为 1000000,因为 znode 的数据限制为 1MB。

hive.lock.numretries
  • Default Value: 100
  • Added In: Hive 0.7.0 with HIVE-1293

您想要尝试获取所有锁的总次数。

hive.unlock.numretries
  • Default Value: 10
  • Added In: Hive 0.8.1

您想要进行一次解锁的总次数。

hive.lock.sleep.between.retries
  • Default Value: 60
  • Added In: Hive 0.7.0 with HIVE-1293

各种重试之间的睡眠时间(以秒为单位)。

hive.zookeeper.quorum
  • Default Value: (empty)
  • Added In: Hive 0.7.0 with HIVE-1293

要与之通信的 ZooKeeper 服务器列表。 仅读/写锁需要此操作。

hive.zookeeper.client.port
  • Default Value:
    • Hive 0.7.0: (empty)
    • Hive 0.8.0 and later: 2181 (HIVE-2196)
  • Added In: Hive 0.7.0 with HIVE-1293

要与之通信的 ZooKeeper 服务器的端口。 仅读/写锁需要此操作。

hive.zookeeper.session.timeout
  • Default Value:
    • Hive 0.7.0 to 1.1.x: 600000ms
    • Hive 1.2.0 and later: 1200000ms (HIVE-8890)``
  • Added In: Hive 0.7.0 with HIVE-1293

ZooKeeper 客户端的会话超时(以毫秒为单位)。 如果在超时时间内未发送心跳,则客户端将断开连接,并且所有锁都会被释放。

hive.zookeeper.namespace
  • Default Value: hive_zookeeper_namespace
  • Added In: Hive 0.7.0

所有 ZooKeeper 节点均在其下创建的父节点。

hive.zookeeper.clean.extra.nodes
  • Default Value: false
  • Added In: Hive 0.7.0

在会话结束时清理多余的节点。

hive.lockmgr.zookeeper.default.partition.name
  • Default Value: __HIVE_DEFAULT_ZOOKEEPER_PARTITION__
  • Added In: Hive 0.7.0 with HIVE-1293

ZooKeeperHiveLockManager 为 hive 锁管理器 时的默认分区名称。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java基础学习打卡20】运算符(下)

目录 前言一、关系运算符二、逻辑运算符1.逻辑与运算符2.逻辑或运算符3.逻辑非运算符4.逻辑异或运算符 三、三元运算符总结 前言 本文继续介绍运算符中的关系运算符、逻辑运算符&#xff0c;还有三元运算符。在 Java 编程中&#xff0c;运算符起着非常重要的作用&#xff0c;它…

QTDAY3

闹钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器事件处理函数 #include <QTime> //时间类 #include <QString> #include <QPushButton> #include <QTextToSpeech> #include …

C++模拟实现queue

1.前言 queue 遵循的原则是先进先出&#xff0c;那到底是用list 还是 vector呢&#xff1f;其实都可以&#xff0c;但是严格来讲vector是不可以的&#xff0c;因为他头删的效率太低了。所以vs官方是不允许用vector的&#xff1a; 因为底层的pop用的是pop_front(), vector是没有…

BDF和DHCP(第二十七课)

一、BFD 1、BFD概述 1)Bidirectional Forwarding Detection :双向转发检测 2)BFD技术背景 现网中存在的问题: -不能快速有效的发现网络设备或链路出现的故障 -不能以毫秒级的速度发现网络问题 -协议自身的报文检测机制一般都大于1秒 解决方案: -需要一种专门用于…

ssh2-sftp-client实现前端项目自动部署

首先要npm安装插件 npm i ssh2-sftp-client 项目中新建一个js文件 npm run build 之后在终端中 执行这个js文件就可以直接将文件上传到 服务器 import Client from ssh2-sftp-client; import { join } from path;const sftp new Client();const deploy async () > {try…

【iOS】iOS持久化

1 持久化目的 快速展示&#xff0c;提升体验 已经加载过的数据&#xff0c;用户下次查看时&#xff0c;不需要再次从网络&#xff08;磁盘&#xff09;加载&#xff0c;直接展示给用户 节省用户流量&#xff08;节省服务器资源&#xff09; 对于较大的资源数据进行缓存&#x…

小创业公司死亡剧本

感觉蛮真实的&#xff1b;很多小创业公司没有阿里华为的命&#xff0c;却得了阿里华为的病。小的创业公司要想活无非以下几点&#xff1a; 1 现金流&#xff0c;现金流&#xff0c;现金流&#xff1b; 2 产品&#xff0c;找痛点&#xff0c;不要搞伪需求&#xff1b; 3 根据公司…

【学习笔记】视频检测方法调研

目录 1 引言2 方法2.1 视频目标跟踪2.1.1 生成式模型方法2.1.2 判别式模型方法2.1.2.1 基于相关滤波跟踪2.1.2.2 基于深度学习跟踪 2.2 视频异常检测2.2.1 基于重构方法2.2.2 基于预测方法2.2.3 基于分类方法2.2.4 基于回归方法 2.3 深度伪造人脸视频检测2.3.1 基于RNN时空融合…

MQ公共特性介绍 (ActiveMQ, RabbitMQ, RocketMQ, Kafka对比)

本章介绍 本文主要介绍所有MQ框架都具备的公共特点&#xff0c;同时对比了一些目前比较主流MQ框架的优缺点&#xff0c;给大家做技术选型作参考。 文章目录 本章介绍MQ介绍适用场景异步通信案例一案例二 系统解耦削峰填谷广播通信总结 缺点MQ对比APQP历史AMQP是什么 MQ介绍 M…

【Docker】Docker 部署 Mysql 并设置数据持久化

文章目录 1. Docker持久化MySQL2. 测试删除MySQL容器后新建容器&#xff0c;数据还在不在3. 参考资料 我们使用Docker的目的就是图它方便下载部署&#xff0c;不用常规的经历下载、配置、安装等等繁琐的步骤。但是与此同时Docker也存在一些缺点&#xff0c;像删除容器后数据就都…

C/C++开源库推荐

C/C开源库推荐 主要都是平常用到的&#xff0c;包含windows开发、android开发、后台开发、音视频开发、深度学习等等最后还附带几个其他语言开发的比较好的项目 GUI开发 qt 跨平台开发库&#xff0c;内部封装了各种跨平台工具&#xff0c;但是大多数情况下都被用作开发跨平台…

WEB 典型安全功能说明

WEB 典型安全功能 认证Authentication 认证是指通过验证用户的身份来确认用户是否有权访问某个系统或资源。在Web安全中&#xff0c;认证是非常重要的一环&#xff0c;它可以防止未经授权的访问&#xff0c;保护用户的数据和系统的安全。 登录 登录是用户认证的常见方式之一…

SpringBoot 快速实现 IP 地址解析

在spring boot 项目中获取请求的ip与详细地址&#xff0c;很多网站app 中都已经新增了ip 地址显示&#xff0c;大家也可以用在自己的开发中&#xff0c;显得更高级。 引入 如果使用本地ip 解析的话&#xff0c;我们将会借助ip2region&#xff0c;该项目维护了一份较为详细的本…

【小尘送书-第三期】Python机器学习:基于PyTorch和Scikit-Learn 》

大家好&#xff0c;我是小尘&#xff0c;欢迎关注&#xff0c;一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的实习&#xff01; 本文目录 一、前言二、作者简介三、内容简介四、抽奖方式 一、前言 近年来&#xff0…

数字身份、分布式存储、跨链技术等将如何推动Web3数据的发展?

Web3数据是基于区块链技术、去中心化、可信任的数据&#xff0c;具有较高的安全性和可信度。随着Web3.0时代的到来&#xff0c;Web3数据将会在金融、物联网、医疗、教育、政务等领域发挥重要的作用。其中&#xff0c;数字身份、分布式存储、跨链技术等将会是Web3数据发展的重要…

linux-imx 内核下载

1. 源码路径 https://github.com/nxp-imx/linux-imx 2. 下载方法 2.1 克隆 linux-imx 到自己的 github 账号&#xff1b; 2.2 登录 https://coding.net/ 注册一个账号&#xff1b; 2.3 在 coding 平台创建一个项目&#xff1b; 在项目中的「代码仓库」中添加一个…

sonarqube PHP编码规范检查

一、PSR规范整理 PHP 已有的编码规范如下 https://blog.csdn.net/qq_40876291/article/details/103848172 1.1 基本编码规范&#xff1a;PSR1 官网规范链接 https://www.php-fig.org/psr/psr-1/ 文件只能使用<?php和<?标记。文件必须仅使用UTF-8&#xff0c;而不使…

BMapGL -- 生成多个maker,获取指定标识的maker,并清除他们

需求描述: 在使用 Baidu Map JavaScript API 创建多个标记时,可以为每个标记设置一个唯一的标识符(identifier),以便在以后可以根据标识符获取特定的标记,并清除它们。 代码: // 创建地图实例 var map = new BMapGL.Map("container");// 创建标记1 var poin…

创造型模式-原型模式(场景体验-》方案解决===代码图解)

创造型模式-原型模式 创建重复对象-场景体验解决方案&#xff08;原型模式&#xff09;原型模式定义 创建重复对象-场景体验 今天来一个大客户&#xff0c;他要求帮他下100个订单。每个订单除了用户ID&#xff0c;和用户名不同之外&#xff0c;其他个人信息完全相同。 订单类 …

【后端面经】微服务构架 (1-5) | 限流:濒临奔溃?限流守护者拯救系统于水火之中!

文章目录 一、前置知识1、什么是限流?2、限流算法A) 静态算法a) 漏桶b) 令牌桶c) 固定窗口d) 滑动窗口B) 动态算法3、限流的模式4、 限流对象4、限流后应该怎么做?二、面试环节1、面试准备2、基本思路3、亮点展现A) 突发流量(针对请求个数而言)B) 请求大小(针对请求大小而言)…