Hive 事务表 (Transactional Tables)

文章目录

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

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

; 2. 创建使用事务表

  • 第一步:开启事务配置(可以使用set设置当前session生效 也可以配置在hive-site.xml中)
set hive.support.concurrency = true;
set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads = 1;
  • 第二步:在创建表时加上① clustered by关键字;② stored as关键字;③ TBLPROPERTIES('transactional'='true')关键字
create table trans_student(
id int,
name String,
age int
)

clustered by (id) into 2 buckets

stored as orc

TBLPROPERTIES('transactional'='true');
  • 然后就可以使用 insert、update、delete 对事务表进行事务操作。

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

    Hive 事务表 (Transactional Tables)

3. 实现原理

3.1 事务产生文件夹

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

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

    关于 _xxx是怎么命名的?

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

3.3 合并器(Compactor)

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

Original: https://blog.csdn.net/qq_43546676/article/details/127619932
Author: 别闹’
Title: Hive 事务表 (Transactional Tables)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817554/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球