【大数据Hive】hive 事务表使用详解

目录

一、前言

二、Hive事务背景知识

hive事务实现原理

hive事务原理之 —— delta文件夹命名格式

_orc_acid_version 说明

bucket_00000

合并器(Compactor)

二、Hive事务使用限制

参数设置

客户端参数设置

客户端参数设置

三、Hive事务使用操作演示

操作步骤

客户端设置参数

创建一张事务表

插入几条数据

删除一条数据

针对事务表的增删改查操作演示

创建事务表

插入一条数据

修改数据

删除数据


一、前言

使用过mysql的同学对mysql的事务这个概念应该不陌生,当对mysql的表进行增删改的时候,mysql会开启一个事务,以确保本次操作的数据的安全性,在hive3.0之后,hive也开始支持了事务,以满足一些增删改的业务场景,接下来将对hive的事务操作做详细的说明。

二、Hive事务背景知识

Hive设计之初时,是不支持事务的,原因:

  • Hive的核心目标是将已经存在的结构化数据文件映射成为表,然后提供基于表的SQL分析处理,是一款面向历史、面向分析的工具;
  • Hive作为数据仓库,是分析数据规律的,而不是创造数据规律的;
  • Hive中表的数据存储于HDFS上,而HDFS是不支持随机修改文件数据的,其常见的模型是一次写入,多次读取;

从Hive0.14版本开始,具有ACID语义的事务(支持INSERT,UPDATE和DELETE)已添加到Hive中,以解决以下场景下遇到的问题:

1)流式传输数据

使用如Apache Flume或Apache Kafka之类的工具将数据流式传输到现有分区中,可能会有脏读(开始查询后能看到写入的数据)

2)变化缓慢数据更新

星型模式数据仓库中,维度表随时间缓慢变化。例如,零售商将开设新商店,需要将其添加到商店表中,或者现有商店可能会更改其平方英尺或某些其他跟踪的特征。这些更改需要插入单个记录或更新记录(取决于所选策略)

3)数据修正

有时发现收集的数据不正确,需要局部更正

hive事务实现原理

Hive的文件是存储在HDFS上的,而HDFS上又不支持对文件的任意修改,只能是采取另外的手段来完成。具体来说:

  • 用HDFS文件作为原始数据(基础数据),用delta保存事务操作的记录增量数据;
  • 正在执行中的事务,是以一个staging开头的文件夹维护的,执行结束就是delta文件夹。每次执行一次事务操作都会有这样的一个delta增量文件夹;
  • 当访问Hive数据时,根据HDFS原始文件和delta增量文件做合并,查询最新的数据;

对于insert,update,delete三种操作来说,

1、INSERT语句会直接创建delta目录;

2、DELETE目录的前缀是delete_delta;

3、UPDATE语句采用了split-update特性,即先删除、后插入;

hive事务原理之 —— delta文件夹命名格式

通过上面的描述,大概了解到hive的事务在执行过程中,delta目录文件很重要,具体来说,一个delta文件的完整名称,可以拆开来看,各个部分的含义需要分别去理解,比如当我们执行一条delete语句开启一个事务时,将会出现类似下面第一条格式的文件;

 对于这个文件来说,其完整的含义,可以类比为:delta_minWID_maxWID_stmtID,拆开来看即:

1、即delta前缀、写事务的ID范围、以及语句ID;删除时前缀是delete_delta,里面包含了要删除的文件;

2、Hive会为写事务(INSERT、DELETE等)创建一个写事务ID(Write ID),该ID在表范围内唯一;

3、语句ID(Statement ID)则是当一个事务中有多条写入语句时使用的,用作唯一标识;

而每个事务的delta文件夹下,都存在两个文件

_orc_acid_version 说明

 _orc_acid_version的内容是2,即当前ACID版本号是2。和版本1的主要区别是UPDATE语句采用了split-update特性,即先删除、后插入。这个文件不是ORC文件,可以下载下来直接查看。

bucket_00000

bucket_00000文件则是写入的数据内容。如果事务表没有分区和分桶,就只有一个这样的文件。文件都以ORC格式存储,底层二级制,需要使用ORC TOOLS查看,详见附件资料;

可以通过引入相关的依赖包进行查看

 对于其中的内容做一下补充说明:

  • operation:0 表示插入,1 表示更新,2 表示删除。由于使用了split-update,UPDATE是不会出现的,所以delta文件中的operation是0 , delete_delta 文件中的operation是2;
  • originalTransaction、currentTransaction:该条记录的原始写事务ID,当前的写事务ID;
  • rowId:一个自增的唯一ID,在写事务和分桶的组合中唯一;
  • row:具体数据,对于DELETE语句,则为null,对于INSERT就是插入的数据,对于UPDATE就是更新后的数据;

合并器(Compactor)

随着表的修改操作,创建了越来越多的delta增量文件,就需要合并以保持足够的性能,合并器Compactor是一套在Hive Metastore内运行,支持ACID系统的后台进程。所有合并都是在后台完成的,不会阻止数据的并发读、写。合并后,系统将等待所有旧文件的读操作完成后,删除旧文件。

合并操作分为两种

  • minor compaction(小合并),小合并会将一组delta增量文件重写为单个增量文件,默认触发条件为10个delta文件;
  • major compaction(大合并),大合并将一个或多个增量文件和基础文件重写为新的基础文件,默认触发条件为delta文件相应于基础文件占比10%;

二、Hive事务使用限制

然Hive支持了具有ACID语义的事务,但是在使用起来,并没有像在MySQL中使用那样方便,有很多限制,归纳如下:

  • 尚不支持BEGIN,COMMIT和ROLLBACK,所有语言操作都是自动提交的;
  • 表文件存储格式仅支持ORC(STORED AS ORC);
  • 需要配置参数开启事务使用;
  • 外部表无法创建为事务表,因为Hive只能控制元数据,无法管理数据;
  • 表属性参数transactional必须设置为true;
  • 必须将Hive事务管理器设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager才能使用ACID表;
  • 事务表不支持LOAD DATA ...语句;

参数设置

在使用hive的事务表时,需要对部分参数做设置之后才能生效,参数的设置可以在客户端,也可以在服务端,两者任选其一;

客户端参数设置

# 可以使用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实例上运行多少个合并程序工作线程

三、Hive事务使用操作演示

接下来通过实际操作演示下hive事务表的使用

操作步骤

客户端设置参数

打开一个客户端窗口后,执行下面的事务设置参数

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实例上运行多少个压缩程序工作线程。

创建一张事务表

CREATE TABLE emp (id int, name string, salary int)
STORED AS ORC TBLPROPERTIES ('transactional' = 'true');

 

插入几条数据

INSERT INTO emp VALUES (1, 'Jerry', 5000);

INSERT INTO emp VALUES (2, 'Tom', 8000);

INSERT INTO emp VALUES (3, 'Kate', 6000);

执行过程可以看到走了M-R任务

 同时执行过程中,观察hdfs目录文件,可以看到产生了下面的staging文件

 

而执行完成后,正好产生了一个_orc_acid_version文件,以及bucket_00000文件;

 如果执行多条数据的插入,就会产生多少个下面的文件目录;

 查询数据,可以看到已经完成数据的插入;

删除一条数据

delete from emp where id =2;

执行删除之后,再次查看hdfs文件目录,可以看到这里多了一个delete_delta文件,关于这个文件上面我们有详细的说明;

针对事务表的增删改查操作演示

创建事务表

create table trans_student(id int,name String,age int
)stored as orc TBLPROPERTIES('transactional'='true');

可以通过describe命令查看表的详细信息

describe formatted trans_student;

插入一条数据

insert into trans_student (id, name, age) values (1,"allen",18);

 插入完成后,hdfs文件目录就生成了相关的事务文件

修改数据

update trans_student
set age = 20
where id = 1;

执行完成后,检查hdfs目录就多了一个delete_delta文件;

删除数据

delete from trans_student where id =1;

执行完成后,检查hdfs目录又多了一个delete_delta文件;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(已解决)redis.get报错com.alibaba.fastjson.JSONException: autoType is not support

redis存取值问题,存自定义实体对象; 第一次取的时候报错:com.alibaba.fastjson.JSONException: autoType is not support。 GenericFastJsonRedisSerializer序列化和反序列化redis的value值,需要bean对象含有无参构造方法。 解决…

【C语言】回调函数,qsort排序函数的使用和自己实现,超详解

文章目录 前言一、回调函数是什么二、回调函数的使用1.使用标准库中的qsort函数2.利用qsort函数对结构体数组进行排序 三、实现qsort函数总结 先记录一下访问量突破2000啦,谢谢大家支持!!! 这里是上期指针进阶链接,方便…

金融术语总结

洗钱 将犯罪或其他非法违法行为所获得的违法收入,通过各种手段掩饰、隐瞒、转化,使其在形式上合法化的行为。 存量客户 某个时间段里原先已有的客户,与新增客户相对应。 月活跃用户数量,MAU(Monthly Active User,M…

【go语言基础】go中的方法

先思考一个问题,什么是方法,什么是函数? 方法是从属于某个结构体或者非结构体的。在func这个关键字和方法名中间加了一个特殊的接收器类型,这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。 函数则…

【100天精通python】Day37:GUI界面编程_PyQT从入门到实战(上)

目录 专栏导读 1 PyQt6 简介: 1.1 安装 PyQt6 和相关工具: 1.2 PyQt6 基础知识: 1.2.1 Qt 的基本概念和组件: 1.2.2 创建和使用 Qt 窗口、标签、按钮等基本组件 1.2.3 布局管理器:垂直布局、水平布局、网格布局…

typedef函数代码段解释以及部分Windows下的系统函数

文章目录 1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)3、typedef int (WINAPI* LPSDOLTerminal)();4、GetProcAddress运行时获取一个动态链接库(DLL)中…

mysql与redis区别

mysql和redis的数据库类型 mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。 redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速…

网络

mcq Java 传输层:拆分和组装,完成端到端的消息传递,流量控制,差错控制等 网络层: 寻址、路由,复用,拥塞控制,完成源到宿的传递。 显然A选项是错误的,有流量控制的是传输层…

JavaScript TypeScript

文章目录 JavaScript语法事件处理与HTML和CSS集成前端框架和库 TypeScript静态类型检查语法更好的可维护性 包管理工具npmpnpmyarnBower JavaScript JavaScript(简称JS)是一种广泛应用于网页开发的脚本语言。它被用来为网页增加交互性和动态功能。以下是…

netty学习分享(一)

TCP与UDP TCP 是面向连接的、可靠的流协议,通过三次握手建立连接,通讯完成时要拆除连接。 UDP是面向无连接的通讯协议,UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象 端口号: 端口号用…

【微信小程序】记一次自定义微信小程序组件的思路

最近来个需求,要求给小程序的 modal 增加个关闭按钮,上网一查发现原来 2018 年就有人给出解决方案了,于是总结下微信小程序自定义组件的思路:一句话,用 wxml css实现和原生组件类似的样式和效果,之后用 JS…

【uniapp】uniapp设置安全区域:

文章目录 一、效果图:二、实现代码: 一、效果图: 二、实现代码: {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitle…

消息队列学习笔记

消息队列基础 适合消息队列解决的问题 异步处理:处理完关键步骤后直接返回结果,后续放入队列慢慢处理流量控制: 使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。能根据下游的处理能力自动调节流量&#x…

leetcode做题笔记79单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相…

Matlab工具NIFTI包的基本功能函数

Matlab工具NIFTI包的基本功能函数 Nifti 格式最初是为神经影像学发明的。神经影像信息学技术计划(NIFTI)将 NIfTI 格式预设为 ANALYZE7.5 格式的替代品。它最初的应用领域是神经影像,但是也被用在其他领域。这种格式的主要特点就是它包含两个…

Docker基础入门:常规软件安装与镜像加载原理

Docker基础入门:常规软件安装与镜像加载原理 一、Docker常规软件安装1.1、部署nginx1.2、部署tomcat1.3、部署elasticsearch1.4、如何部署kibana-->连接elasticsearch1.5、部署可视化工具 二、 镜像加载原理2.1、镜像是什么2.2、Docker镜像加速原理2.3、分层理解…

为什么我的集群一个 Spark Executor / Yarn Container 只分配一个vCore?

在很多集群里,在关闭了Spark的DynamicAllocation的前提下(避免自动申请空闲资源,干扰测试结果),都会观察到:提交Spark作业时,申请 1 个 driver + n 个 executor 会在Yarn上对应创建 n+1 个 container,但是每个container只有一个vCore,通过--driver-cores和--executor-…

Grafana Prometheus 通过JMX监控kafka 【2023最新方式】

第三方kafka exporter方案 目前网上关于使用Prometheus 监控kafka的大部分资料都是使用一个第三方的 kafka exporter,他的原理大概就是启动一个kafka客户端,获取kafka服务器的信息,然后提供一些metric接口供Prometheus使用,随意它…

docker 安装mysql8.0

1、拉取镜像 docker pull mysql2、运行镜像 docker run -d --restartalways --name mysql --privilegedtrue -p 3306:3306 -v /home/sunyuhua/docker/mysql/data:/var/lib/mysql -v /home/sunyuhua/docker/mysql/conf:/etc/mysql/conf.d -v /home/sunyuhua/docker/mysql/logs…

07_Hudi案例实战、Flink CDC 实时数据采集、Presto、FineBI 报表可视化等

7.第七章 Hudi案例实战 7.1 案例架构 7.2 业务数据 7.2.1 客户信息表 7.2.2 客户意向表 7.2.3 客户线索表 7.2.4 线索申诉表 7.2.5 客户访问咨询记录表 7.3 Flink CDC 实时数据采集 7.3.1 开启MySQL binlog 7.3.2 环境准备 7.3.3 实时采集数据 7.3.3.1 客户信息表 7.3.3.2 客户…