0


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')关键字createtable trans_student(id int,name String,age int)-- 1. 必须为分桶表(如果在前面通过set开启了分桶功能,那么这里可以不写该语句)clusteredby(id)into2 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%。在这里插入图片描述
标签: hive hadoop 大数据

本文转载自: https://blog.csdn.net/qq_43546676/article/details/127619932
版权归原作者 ElegantCodingWH 所有, 如有侵权,请联系我们删除。

“Hive 事务表 (Transactional Tables)”的评论:

还没有评论