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

news2024/9/25 1:15:46

文章目录

    • 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.coloradmin.cn/o/798196.html

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

相关文章

超详细的74HC595应用指南(以stm32控制点阵屏为例子)

74HC595是一款常用的串行输入/并行输出&#xff08;Serial-in/Parallel-out&#xff09;移位寄存器芯片&#xff0c;在数字电子领域有着广泛的应用。它具有简单的接口和高效的扩展能力&#xff0c;成为了许多电子爱好者和工程师们的首选之一。本文将深入介绍74HC595芯片的功能、…

019 - STM32学习笔记 - Fatfs文件系统(一) - FatFs文件系统初识

019 - STM32学习笔记 - Fatfs文件系统&#xff08;一&#xff09; - FatFs文件系统初识 最近工作比较忙&#xff0c;没时间摸鱼学习&#xff0c;抽空学点就整理一点笔记。 1、文件系统 在之前学习Flash的时候&#xff0c;可以调用SPI_FLASH_BufferWrite函数&#xff0c;将数…

【Terraform学习】Terraform-AWS部署快速入门(快速入门)

Terraform-AWS部署快速入门 实验步骤 连接到 Terraform 环境 SSH 连接到Terraform 环境(名为MyEC2Instance的实例) 在 Amazon Web Services &#xff08;AWS&#xff09; 上预置 EC2 实例 用于描述 Terraform 中基础结构的文件集称为 Terraform 配置。您将编写一个配置来定义…

【视觉SLAM入门】5.1 非线性最小二乘理论 ------线搜索,信赖域,最速/牛顿下降法,高斯牛顿,LM等原理推导

"天之道也" 0. 引入1. 最速下降法2. 牛顿法3. (实用)G-N法4. (实用)L-M方法5. 总结 注意&#xff1a; 上一节得到的最小二乘问题&#xff0c;本节来讨论---- 求解非线性最小二乘问题 \color {red}求解非线性最小二乘问题 求解非线性最小二乘问题 0. 引入 求解这个简…

el-upload上传图片和视频,支持预览和删除

话不多说&#xff0c; 直接上代码&#xff1a; 视图层&#xff1a; <div class"contentDetail"><div class"contentItem"><div style"margin-top:5px;" class"label csAttachment">客服上传图片:</div><el…

【spring】spring bean的生命周期

spring bean的生命周期 文章目录 spring bean的生命周期简介一、bean的创建阶段二、bean的初始化阶段三、bean的销毁阶段四、spring bean的生命周期总述 简介 本文测试并且介绍了spring中bean的生命周期&#xff0c;如果只想知道结果可以跳到最后一部分直接查看。 一、bean的…

创建维基WIKI百科和建立百度百科有何不同?

很多企业有出口业务&#xff0c;想在互联网上开展全球性网络营销&#xff0c;维基百科往往被认为是开展海外营销的第一站。其作用相当于开展国内网络营销的百度百科&#xff0c;经常有些企业给小马识途营销顾问提供的词条内容就是百度百科的内容&#xff0c;可事实上两个平台的…

无人机影像配准并发布(共线方程)

无人机影像 DEM 计算四个角点坐标&#xff08;刚性变换&#xff09; 像空间坐标&#xff08;x,y,-f&#xff09; 像空间坐标畸变纠正 deltax,deltay 已知(x,y)&#xff0c;求解(X,Y, Z)或者(Lat,Lon) 这里的Z是DEM上获取的坐标和Zs为相机坐标的高程&#xff0c;如果均为已…

水文章——推荐一个视频播放器和一个图片查看器

视频播放器——PotPlayer http://www.potplayercn.com/ 图片查看器——JPEGVIEW https://www.bilibili.com/video/BV1ZY411P7fX/?spm_id_from333.337.search-card.all.click&vd_sourceab35b4ab4f3968642ce6c3f773f85138

PHP数组转对象和对象转数组

PHP数组转对象和对象转数组 <?php function array_to_object($arr){$obj new stdClass();foreach ($arr as $key > $val) {if (is_array($val) || is_object($val)) {$obj->$key array_to_object($val);} else {$obj->$key $val;}}return $obj; } function o…

pdf怎么转换成word 文档?这几种方法收藏一下

pdf怎么转换成word 文档&#xff1f;PDF和Word是我们平时工作和学习中最常用的两种文档格式。PDF文档格式通常用于电子书籍、合同、申请表等需要保持原样式的文档。而Word文档则通常用于编辑和修改。但是&#xff0c;有时我们需要将PDF文档转换为可编辑的Word文档&#xff0c;以…

【Docker】在Docker大火的背后,究竟隐藏着未来科技发展的哪些大趋势

这里写目录标题 在docker大火的背后是什么新科技的发展呢&#xff1f;1.容器化技术的普及2.云原生应用的兴起3.边缘计算的发展4.容器编排和管理平台的演进5.混合云和多云架构的普及 docker三大特性轻量化可移植性可扩展性 docker被谁抢了风头呢1.风头被Kubernetes (K8S)抢了2.缺…

日撸代码300行:第54天(基于 M-distance 的推荐)

代码来自闵老师”日撸 Java 三百行&#xff08;51-60天&#xff09;“&#xff0c;链接&#xff1a;日撸 Java 三百行&#xff08;51-60天&#xff0c;kNN 与 NB&#xff09;_闵帆的博客-CSDN博客 算法是基于M-distance的推荐&#xff0c;通过用户评分矩阵对用户进行电影推荐。…

如果你在选型低代码平台,可以从这5个角度去分析抉择

研究低代码平台已有3年&#xff0c;也算是个低代码资深用户了&#xff0c;很多企业面临低代码选型上的困难&#xff0c;选平台容易&#xff0c;换平台难。下面基于个人理解给大家做一份千字的注意事项&#xff01;希望对大家在选型低代码方面有一定帮助。最终&#xff0c;正确且…

[AWD靶场搭建]

文章目录 [AWD靶场搭建]前言AWD平台搭建靶机搭建Cadinal添加靶机 连接Asteroid大屏默认ssh账号密码参考 [AWD靶场搭建] 前言 觉得好玩搭建了一下AWD靶场&#xff0c;使用了vidar-team编写的 Cardinal AWD平台搭建 这里我是在kali搭建的&#xff0c;所以我下载了这个压缩包&…

centos7搭建k8s环境并部署springboot项目

之前看了很多文章&#xff0c;都是部署后一直报错&#xff0c;百度解决后下次又忘了&#xff0c;这次决定把从头到尾的过程记录下来方便下次再看&#xff0c;部署参考文章尚硅谷Kubernetes&#xff08;k8s&#xff09;视频学习笔记_尚硅谷k8s笔记_溯光旅者的博客-CSDN博客 1、…

13年测试老鸟,接口性能测试总结整理,据说这是全网最全的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试按照不同…

支持多种通信方式和协议方便接入第三方服务器或云平台

2路RS485串口是一种常用的通信接口&#xff0c;可以支持Modbus Slave协议&#xff0c;并可接入SCADA、HMI、DSC、PLC等上位机。它还支持Modbus RTU Master协议&#xff0c;可用于扩展多达48个Modbus Slave设备&#xff0c;如Modbus RTU远程数据采集模块、电表、水表、柴油发电机…

GAN论文精读

标题:Generative Adversarial Nets 摘要: 简写:作者提出了一个framework通过一个对抗的过程&#xff0c;在这里面会同时训练两个模型。 第一个模型为生成模型G&#xff0c;是用来抓住整个数据的分布 第二个模型为辨别模型D&#xff0c;是用来估计一个样本是否从G中产生。 …

BD Biosciences通过使用Liquid UI优化SAP QM,节省了80%的处理时间,提高了 95% 的数据准确性

背景 BD 生物科学公司成立于 1897 年&#xff0c;致力于改善患者的治疗效果&#xff0c;并在一个多世纪的时间里始终坚持这一理念&#xff0c;现已涉足诊断、生物科学以及各种医疗设备和仪器系统。 挑战 手动验证数据 原因&#xff1a;使用非自动程序演示和验证数据&#xff0c…