Hive 事务表 (Transactional Tables)

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

1. 为什么要使用事务表?

  • Hive 原本是不支持事务的,也就是不支持 增删改(insert、delete、update)、回滚等 操作的。因为:
    1. Hive的核心目标是: 将已经存在的结构化数据文件映射成为表,然后提供基于表的SQL分析处理。也就是说Hive是面向分析的,并不是面向设计的。
    2. HDFS不支持随机修改文件。
  • 但是随着技术的发展,不支持事务在某些方面也会带来很大的弊端,如:
    Hive 事务表 (Transactional Tables)
  • 所以Hive0.14后开始支持事务,即创建事务表。但是事务表有很大的限制:
    Hive 事务表 (Transactional Tables)

2. 创建使用事务表

  • 第一步:开启事务配置(可以使用set设置当前session生效 也可以配置在hive-site.xml中)

    set hive.support.concurrency = true; --Hive是否支持并发
    set hive.enforce.bucketing = true; --从Hive2.0开始不再需要 是否开启分桶功能
    set hive.exec.dynamic.partition.mode = nonstrict; --动态分区模式 非严格
    set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; --
    set hive.compactor.initiator.on = true; --是否在Metastore实例上运行启动线程和清理线程
    set hive.compactor.worker.threads = 1; --在此metastore实例上运行多少个压缩程序工作线程
    
  • 第二步:在创建表时加上① clustered by关键字;② stored as关键字;③ TBLPROPERTIES('transactional'='true')关键字

    create table trans_student(
    id int,
    name String,
    age int
    )
    -- 1. 必须为分桶表(如果在前面通过set开启了分桶功能,那么这里可以不写该语句)
    clustered by (id) into 2 buckets
    -- 2. 存储方式为 orc 
    stored as orc 
    -- 3. 设置表属性transactional为true,开启事务
    TBLPROPERTIES('transactional'='true');
    
  • 然后就可以使用 insert、update、delete 对事务表进行事务操作。

    注意:使用insert update delete操作数据时,并不是真正的插入/修改/删除数据,而是重新创建了一个新文件,将数据写入进去,并将原文件做了删除标记。通过标记的方式来实现事务。(后面会介绍)
    Hive 事务表 (Transactional Tables)

3. 实现原理

3.1 事务产生文件夹

由于HDFS中只支持追加数据,并不能像MySQL一样随机修改数据。所以,采用不改变原始数据,创建文件进行标记的方法来实现事务:

  1. 每次执行一次事务操作都会创建一个文件夹:

    1. insert语句会创建delta_xxx_xxx_xxx文件夹;
    2. delete语句会创建delete_delta_xxx_xxx_xxx文件夹;
    3. update语句是通过delete、insert两个语句完成的,即先删除,后添加。
      Hive 事务表 (Transactional Tables)

    关于_xxx是怎么命名的?

    1. Hive会为每个写入语句(INSERT、DELETE等)创建一个写事务ID(Write ID),该ID是自增的;
    2. 而一个事务可能含有多条写入语句时,即会产生多个写事务ID。因为ID是自增的,所以,一个事务内的多个写事务ID是连续,故可用mixWID 至 maxWID表示此次事务的所有写事务ID,然后再用stmtID对写事务ID进行区分。
    3. 因此,命名规范为delta_minWID_maxWID_stmtID
      Hive 事务表 (Transactional Tables)
  2. 正在执行中的事务,是以一个.hive-staging_hive_xxx的文件夹维护的,执行结束后就会改名为delta_xxx_xxx_xxxdelete_delta_xxx_xxx_xxx文件夹。
    Hive 事务表 (Transactional Tables)

  3. 当访问Hive数据时,根据HDFS原始文件和相应的delta增量文件做合并,从而得到查询数据。

3.2 那么文件夹里面有什么?

每个事务的delta文件夹下,都有两个文件:

  1. orc_acid_version文件:文件里的内容是2,标识acid版本为2。和版本1的主要区别是UPDATE语句采用了split-update特性,即先删除、后插入。

  2. bucket_00000文件:文件里是写入的数据内容。如果事务表没有分区和分桶,就只有一个这样的文件。

    由于是orc格式存储,底层用二级制存储,因此直接打开文件看不懂,需要使用ORC TOOLS查看。
    Hive 事务表 (Transactional Tables)

    Hive 事务表 (Transactional Tables)文章来源地址https://www.toymoban.com/news/detail-418214.html

3.3 合并器(Compactor)

  1. 随着表的修改操作越多,delta增量文件会越来越多,就需要定时将文件合并以保持足够的性能。
  2. 合并器Compactor是一套在Hive Metastore内运行,支持ACID系统的后台进程。所有合并都是在后台完成的,不会阻止数据的并发读、写。合并后,系统将等待所有旧文件的读操作完成后,删除旧文件。
  3. 合并操作分为两种:
    1. minor compaction(小合并):将一组delta增量文件重写为单个增量文件,默认触发条件为10个delta文件;
    2. major compaction(大合并):将多个增量文件基础文件重写为新的基础文件,默认触发条件为delta文件相应于基础文件占比,10%。
      Hive 事务表 (Transactional Tables)

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

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

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

相关文章

  • 为什么hive表不经常用索引

    Hive 表不经常使用索引的主要原因是由于其设计初衷和使用场景的特点。下面是一些可能的解释: Hive 主要用于处理大规模数据集的批量分析任务,而不是对单个记录的实时查询。对于批处理任务,全表扫描通常是更为高效的方式,因为索引需要维护额外的数据结构并带来一

    2024年02月16日
    浏览(29)
  • (快手一面)分布式系统是什么?为什么要分布式系统?分布式环境下会有哪些问题?分布式系统是如何实现事务的?

    《分布式系统原理与泛型》中这么定义分布式系统: “ 分布式系统是若干独立计算机的集合, 这些计算机对于用户来说就像单个相关系统 ”, 分布式系统(distributed system)是建立在网络之上的软件系统。 就比如:用户在使用京东这个分布式系统的时候,会感觉是在使用一

    2024年02月08日
    浏览(54)
  • postgresql 内核源码分析 事务提交回滚状态记录 clog机制流程,commit log文件格式,事务状态为什么单独记录的原因,分组优化及leader更新机制

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 ​ 开源贡献 : toadb开源库 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. PostgreSQL是一种开源的关系型数据库管理系统,其内核源码的分析对于深入理

    2024年02月08日
    浏览(46)
  • 为什么要使用卷积

    1. 卷积这个名词是怎么解释?“卷”是什么意思?“积”又是什么意思? 卷积的“卷”,指的的函数的翻转,从  g(t)  变成  g(-t)  的这个过程;同时,“卷”还有滑动的意味在里面(吸取了网友李文清的建议)。如果把卷积翻译为“褶积”,那么这个“褶”字就只有翻转的

    2024年02月09日
    浏览(35)
  • 为什么使用AutoMapper

    类库

    2024年02月14日
    浏览(43)
  • 为什么要使用线程池

    线程池主要是 控制运行的线程的数量 ,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。 Java线程的 创建 非常昂贵,需要 JVM 和 OS (操作系统)配合

    2023年04月09日
    浏览(45)
  • RABBITMQ为什么要使用

    面试官问这个问题,肯定是想知道你们公司有一个什么场景需要使用到这个Mq,这个场景有一个什么技术挑战导致必须要用这个mq,用了这个mq之后有什么好处。mq经典的使用场景有 解耦,异步,削锋 。 异步通信: 当一个系统收到请求,需要在自己系统处理数据,处理完后,

    2024年02月04日
    浏览(40)
  • 为什么要使用Token

            我们知道,http协议是一种无状态的协议,这就意味着当用户向我们的应用提供了用户名和密码进行用户认证,那么在下一次登录的时候,用户还要再进行验证,因为根据http协议,浏览器并不知道是谁发出的请求,所以为了能够让浏览器识别出是哪个用户发出的请求

    2024年02月09日
    浏览(33)
  • 面试好题:@Transactional声明式事务注解什么时候会失效?

    今天来分享一道比较有意思的面试题,“@Transactional声明式事务注解什么时候会失效?”。 对于这个问题,我们一起看看考察点和比较好的回答吧!     这个问题就是面试官想考察我们对@Transactional注解有没有深刻的认识,以及日常开发中是否善于积累,认真思考。 下面我

    2024年02月09日
    浏览(30)
  • ChatGPT为什么使用强化学习

    最近出现很多ChatGPT相关论文,但基本都是讨论其使用场景和伦理问题,至于其原理,ChatGPT在其主页上介绍,它使用来自人类反馈的强化学习训练模型,方法与InstructGPT相同,只在数据收集上有细微的差别。 那么,InstructGPT和ChatGPT为什么使用强化学习呢?先看个示例: 先不论

    2023年04月13日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包