Hive 事务表 (Transactional Tables)

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

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

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操作数据时,并不是真正的插入/修改/删除数据,而是重新创建了一个新文件,将数据写入进去,并将原文件做了删除标记。通过标记的方式来实现事务。(后面会介绍)
    在这里插入图片描述

3. 实现原理

3.1 事务产生文件夹

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

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

    1. insert语句会创建delta_xxx_xxx_xxx文件夹;
    2. delete语句会创建delete_delta_xxx_xxx_xxx文件夹;
    3. update语句是通过delete、insert两个语句完成的,即先删除,后添加。
      在这里插入图片描述

    关于_xxx是怎么命名的?

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

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

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

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

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

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

    由于是orc格式存储,底层用二级制存储,因此直接打开文件看不懂,需要使用ORC TOOLS查看。
    在这里插入图片描述

    在这里插入图片描述

3.3 合并器(Compactor)

  1. 随着表的修改操作越多,delta增量文件会越来越多,就需要定时将文件合并以保持足够的性能。
  2. 合并器Compactor是一套在Hive Metastore内运行,支持ACID系统的后台进程。所有合并都是在后台完成的,不会阻止数据的并发读、写。合并后,系统将等待所有旧文件的读操作完成后,删除旧文件。
  3. 合并操作分为两种:
    1. minor compaction(小合并):将一组delta增量文件重写为单个增量文件,默认触发条件为10个delta文件;
    2. major compaction(大合并):将多个增量文件基础文件重写为新的基础文件,默认触发条件为delta文件相应于基础文件占比,10%。
      在这里插入图片描述
  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值