Hive ACID笔记

这篇具有很好参考价值的文章主要介绍了Hive ACID笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境:hive 3.1.0
执行引擎:hive on tez

  1. 什么是hive ACID?
    hive官网对于ACID的介绍:
    https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions
    中文文档关于ACID的介绍:
    https://www.docs4dev.com/docs/zh/apache-hive/3.1.1/reference/Hive_Transactions.html
    其实和传统数据库中所说的ACID有异曲同工之妙:
  2. 原子性(Atomicity
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。
  3. 一致性(Consistency
    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
    举例说明:张三向李四转100元,转账前和转账后的数据是正确的状态,这就叫一致性,如果出现张三转出100元,李四账号没有增加100元这就出现了数据错误,就没有达到一致性。
  4. 隔离性(Isolation
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  5. 持久性(Durability
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
    其中事务Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,而ACID是衡量事务的4个维度。hive0.13之后提供了行级别ACID,
    常见的INSERT、UPDATE和DELETE已经在hive0.14开始支持,先创建一张默认结构的hive表
    create table test.trans_table1(column1 string,column2 string);
    SHOW CREATE TABLE查看其建表语句:
CREATE TABLE `test.trans_table1`(
  `column1` string, 
  `column2` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  'hdfs://ambari-hadoop1:8020/warehouse/tablespace/managed/hive/test.db/trans_table1'
TBLPROPERTIES (
  'bucketing_version'='2', 
  'transactional'='true', 
  'transactional_properties'='default', 
  'transient_lastDdlTime'='1703744670')

发现其配置项中有三个和事务相关的选项:

  • transactional:是否启用表的事务支持
  • transactional_properties:指定了事务的属性
    1.default: 默认值,表示支持插入、更新、删除操作。
    2.insert_only: 仅支持插入操作,不支持更新和删除。
    3.insert_only_external: 仅支持插入操作,对于外部表。
  • transient_lastDdlTime:最后一次DDL日期时间
    hive默认创建存储格式为ORC的事务表,对表执行一次insert values操作发现增加了一个delta开头的目录
    Hive ACID笔记
    其下有两个文件_orc_acid_version和bucket_00000
    Hive ACID笔记
    而delete操作也同样会生成目录:
    Hive ACID笔记
    而UPDATE操作则会同时生成两个目录:
    Hive ACID笔记
    先创建一个delete前缀的目录,再创建一个代表insert的delta前缀目录,即先删除后插入。
    以上目录的命名规范格式为 delta_minWID_maxWID_stmtID,即 delta 前缀、写事务的 ID 范围、以及语句 ID。
  • 针对写事务(INSERT、DELETE 等),Hive 还会创建一个写事务 ID(Write ID),该 ID 在表范围内唯一。
  • 语句 ID(Statement ID)则是当一个事务中有多条写入语句时使用的,用作唯一标识。
    _orc_acid_version 的内容是 2,即当前 ACID 版本号是 2。而bucket开头的文件则是实际的数据内容,由于存储格式是ORC,可以使用以下方法查看:
    hive --orcfiledump /warehouse/tablespace/managed/hive/test.db/trans_table1/delta_0000001_0000001_0000/bucket_00000
    可以查看相关元数据,但并非数据本身,这里不做过多解析:
    Hive ACID笔记
    hive --orcfiledump -d /warehouse/tablespace/managed/hive/test.db/trans_table1/delta_0000001_0000001_0000/bucket_00000
    则可以查看相关数据内容:
    Hive ACID笔记
  • operation 0 表示插入,1 表示更新,2 表示删除。由于使用了 split-update,UPDATE 是不会出现的;
  • originalTransaction是该条记录的原始写事务 ID。对于 INSERT 操作,该值和 currentTransaction是一致的。对于 DELETE,则是该条记录第一次插入时的写事务 ID;
  • bucket是一个 32 位整型,由 BucketCodec 编码,各个二进制位的含义为:
    1-3 位:编码版本,当前是 001;
    4 位:保留;
    5-16 位:分桶 ID,由 0 开始。分桶 ID 是由 CLUSTERED BY 子句所指定的字段、以及分桶的数量决定的。该值和 bucket_N 中的 N 一致;
    17-20 位:保留;
    21-32 位:语句 ID;
    举例来说,整型 536936448 的二进制格式为 00100000000000010000000000000000,即它是按版本 1 的格式编码的,分桶 ID 为 1;
  • rowId 是一个自增的唯一 ID,在写事务和分桶的组合中唯一;
  • currentTransaction 当前的写事务 ID;
  • row 具体数据。对于 DELETE 语句,则为 null
    还可以通过 row__id 这个虚拟列进行查看(originalTransaction, bucket, rowId)
    select row__id,column1,column2 from test.trans_table1;
    Hive ACID笔记
    注意row__id是两个"_"符合。
    还有个问题由于每次DML的执行都会产生对应小文件,随着时间推移DML执行次数的增多,会产生越来越多的小文件,而过多的小文件对HDFS会产生不利的影响,比如增加namenode的内存占用等等,为此hive引入了压缩Compaction的概念。
    Minor Compaction 会将所有的 delta 文件压缩为一个文件,delete 也压缩为一个。压缩后的结果文件名中会包含写事务 ID 范围,同时省略掉语句 ID。压缩过程是在 Hive Metastore 中运行的,会根据一定阈值自动触发。我们也可以使用如下语句人工触发:
    ALTER TABLE trans_table1 COMPACT 'minor';
    压缩前:
    Hive ACID笔记
    压缩后:
    Hive ACID笔记
    查看压缩后的文件发现,插入操作产生的数据都被合并起来:
    Hive ACID笔记
    同样删除操作的数据也被合并在了一起:
    Hive ACID笔记
    因此Minor Compaction 不会删除任何数据。
    Major Compaction则会将所有文件合并为一个文件,以 base_N 的形式命名,其中 N 表示最新的写事务 ID。已删除的数据将在这个过程中被剔除。
    major前:
    Hive ACID笔记
    major后:
    Hive ACID笔记
      需要注意的是,在 Minor 或 Major Compaction 执行之后,原来的文件不会被立刻删除。这是因为删除的动作是在另一个名为 Cleaner 的线程中执行的。因此,表中可能同时存在不同事务 ID 的文件组合,这在读取过程中需要做特殊处理。
    有了大致的了解后,是否任意存储格式的表均具有ACID特性?
    首先TextFile,默认建表语句中关于事务的配置项:
    'transactional'='true', 'transactional_properties'='insert_only',
    可以执行insert操作,但是无法执行delete和update,报错:
    Error: Error while compiling statement: FAILED: SemanticException [Error 10414]: Attempt to do update or delete on table test.text_table1 that is insert-only transactional (state=42000,code=10414)
    尝试修改transactional_properties值为default,但是无法修改:
    Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot convert an ACID table to non-ACID (state=08S01,code=1)
    官网的意思是目前仅支持ORC格式的hive表:
    Hive ACID笔记
    此外Hive ACID还存在一些限制:
    https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions#:~:text=SQL MERGE statement.-,Limitations,-BEGIN%2C COMMIT

本博客为学习所记,意在备忘所学过程,故有引用之处,其中参考博客有:

  1. 深入学习MySQL事务:ACID特性的实现原理https://www.cnblogs.com/kismetv/p/10331633.html

  2. 实战 | 深入理解 Hive ACID 事务表
    https://blog.csdn.net/zjerryj/article/details/91470261文章来源地址https://www.toymoban.com/news/detail-761470.html

到了这里,关于Hive ACID笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive执行计划之什么是hiveSQL向量化模式及优化详解

    Hive开启向量化模式也是hiveSQL优化方法中的一种,可以提升hive查询速率,也叫hive矢量化。 问题1:那么什么是hive向量化模式呢? 问题2:hive向量化什么情况下可以被使用,或者说它有哪些使用场景呢? 问题3:如何查看hive向量化使用的相关信息? hive向量化模式是hive的一个特

    2024年02月08日
    浏览(33)
  • JVM执行引擎——为什么Java是半编译半解释语言

            起初设计者的初衷是将字节码文件翻译为机器语言的指令来执行即可,就诞生了解释器。但是采用一行行来解释的 效率比较低 ,JIT编译器会将编译后的机器码做一个缓存的操作,放在方法区的JIT代码缓存中,是否需要启用JIT编译器直接将字节码编译为机器码,则

    2024年02月15日
    浏览(40)
  • 事务的ACID属性是什么?为什么它们很重要?

    在现代的数据库和事务处理系统中,事务处理是一项非常重要的技术。在数据库中,事务是指一组被视为单个逻辑操作单元的SQL语句序列,它们要么全部成功执行,要么全部不执行。事务可以确保数据库在执行时保持一致性和可靠性。ACID属性是事务处理系统中的四个基本属性

    2024年01月18日
    浏览(40)
  • 《深入理解Java虚拟机》读书笔记:基于栈的字节码解释执行引擎

      虚拟机是如何调用方法的内容已经讲解完毕,从本节开始,我们来探讨虚拟机是如何执行方法中的字节码指令的。上文中提到过,许多Java虚拟机的执行引擎在执行Java代码的时候都有 解释执行(通过解释器执行) 和 编译执行(通过即时编译器产生本地代码执行) 两种选

    2024年02月11日
    浏览(38)
  • 进来了解实现官网搜索引擎的三种方法

    做网站的目的是对自己的品牌进行推广,让越来越多的人知道自己的产品,但是如果只是做了一个网站放着,然后等着生意找上门来那是不可能的。在当今数字时代,实现官网搜索引擎对于提升用户体验和推动整体性能至关重要。搜索引擎可以帮助访问者快速高效地找到他们

    2024年02月07日
    浏览(34)
  • 搜索引擎都没流量啦,官网建设还有啥意义?

    百度等搜索引擎都没啥流量了,再建设官网还有啥用?如果你把官网定位于获客,那真的没啥太大用处,但是官网不仅仅是用来获客的。 搜索引擎流量减少的原因有多个, 1. 社交媒体的崛起: 许多用户现在更倾向于通过社交媒体平台获取信息和娱乐,而不是通过搜索引擎。

    2024年03月28日
    浏览(41)
  • Hive执行计划之一文读懂Hive执行计划

    Hive的执行计划描述了一个hiveSQL语句的具体执行步骤,通过执行计划解读可以了解hiveSQL语句被解析器转换为相应程序语言的执行逻辑。通过执行逻辑可以知晓HiveSQL运行流程,进而对流程进行优化,实现更优的数据查询处理。 同样,通过执行计划,还可以了解到哪些不一样的

    2024年02月08日
    浏览(33)
  • 为什么服务映射对于微服务安全至关重要

    在复杂的微服务世界中,安全性至关重要。这些服务的松散耦合、分布式特性以及它们之间不断的相互通信不仅增加了潜在的攻击面,而且还给身份验证、授权、配置管理和管理整体复杂性带来了挑战。 在这些挑战中,服务映射成为提供微服务架构全景的关键过程。它有助于

    2024年02月03日
    浏览(38)
  • Vue3对于一个前端来讲意味着什么?

    最近很多技术网站,讨论的最多的无非就是Vue3了,大多数都是Composition API和基于Proxy的原理分析。但是今天想着跟大家聊聊, Vue3对于一个低代码平台的前端更深层次意味着什么? 首先,Vue是前端三大主流框架之一,也是目前最火的一个前端框架。 Vue作为一套构建用户界面的

    2024年02月09日
    浏览(31)
  • 【对于一维信号的匹配】对一个一维(时间)信号y使用自定义基B执行匹配追踪(MP)研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 对一个

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包