Hive事务原理和Datax同步事务表问题解决
一、事务的概述
1、定义
事务就是一组单元化操作,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位。
2、特点
- 原子性:一个事务是一个不可再分割的工作单位,事务中的所有操作要么都发生,要么都不发生。
- 一致性:事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 隔离性:多个事务并发访问,事务之间是隔离的,一个事务不影响其它事务运行效果。这指的是在并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自完整的数据空间。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改后的状态,事务不会查看到中间状态的数据。事务之间的相应影响,分别为:脏读、不可重复读、幻读、丢失更新。
- 持久性(Durability):意味着在事务完成以后,该事务锁对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
3、事务实现的原理
- 预写日志(Write-ahead logging):保证原子性和持久性。
- 锁(locking):保证隔离性;锁是指在并发环境中通过读写锁来保证操作的互斥性。根据隔离程度不同,锁的运用也不同。
- 一致性,是因为一致性是应用相关的话题,它的定义一个由业务系统来定义,什么样的状态才是一致?而实现一致性的代码通常在业务逻辑的代码中得以体现。
二、使用事务的准备条件和限制
1、准备条件
a、 默认事务是关闭的,需要设置开启。
b、需要添加如下配置
<property> <name>hive.support.concurrency</name> <value>true</value> </property> <property> <name>hive.enforce.bucketing</name> <value>true</value> </property> <property> <name>hive.exec.dynamic.partition.mode</name> <value>nonstrict</value> </property> <property> <name>hive.txn.manager</name> <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value> </property> <property> <name>hive.compactor.initiator.on</name> <value>true</value> </property> <property> <name>hive.compactor.worker.threads</name> <value>1</value> </property>2、限制条件
- BEGIN, COMMIT, ROLLBACK 暂时不支持,所有操作自动提交
- 目前只支持ORC 的文件格式。
- 表必须支持分桶(即条件1的设置)
- 必须设置事务管理器 org.apache.hadoop.hive.ql.lockmgr.DbTxnManager ,否则事务表无法工作(条件1的设置)
- 目前支持快照级别的隔离。就是当一次数据查询时,会提供一个数据一致性的快照
- 已有的zookeeper和内存的锁管理和Hive的事务不冲突
- LOAD DATA. 语句目前在事务表中暂时不支持
三、Hive中实现事务的原理
1、Hive事务实现原理
HDFS是不支持文件的修改,并且当有数据追加到文件,HDFS不对读数据的用户提供一致性的。为了在HDFS上支持以上的特性,Hive借鉴了其他数据仓库工具的方法。如果Hive中的表开启transaction,数据是insert进去的,则insert进去的数据会放到delta文件夹里面,hive后台会有个进程定时去跟base里的数据合并,然后删除delta文件。即:表和分区的数据都被存在base files。 新的记录和更新,删除都存在delta files。一次事务操作创建一系列的delta files,将其合并为base。在读取的时候,将基础文件和修改,删除合并,最后返回给查询。
2、几个名词解释
创建一个事务表:CREATE table demo (
num string,
create_date int,
number(19,4)
) clustered by (num ) into 40 buckets stored as orc tblproperties('transactional'='true');
a、表的Base and Delta Directories 目录:
hive> dfs -ls -R /user/hive/warehouse/demo;
drwxr-xr-x - ekoifman staff 0 2016-06-09 17:07 /user/hive/warehouse/demo/delta_0000044_0000044_0000
-rw-r--r-- 1 ekoifman staff 610 2016-06-09 17:07 /user/hive/warehouse/demo/delta_0000044_0000044_0000/bucket_00000
- Minor compaction :将已有的delta files重写到一个单独的delta file,每个分桶一个。
- Major compaction: 将delta文件和base 重写到一个新的base file,每个分桶一个。 这个合并操作的代价更大。
- 所有的合并操作都是后台进行,不会影响并行的数据读取和写入。合并完成之后,系统会等到所以的读操作完成再删除旧的文件。
d、Worker
该进程检查在 hive.txn.timeout 内没有心跳的事务并丢弃。对于一个初始化过事务的client,如果心跳停止了,它所锁住的资源会被释放。
四、datax通过数据中遇到的问题
1、前提条件
当开启了事务,但是没有配置参数,即事务限制条件:
- 客户端
hive.support.concurrency – true
hive.enforce.bucketing – true (Hive 2.0 默认)
hive.exec.dynamic.partition.mode – nonstrict
hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager - 服务端 (Metastore)
hive.compactor.initiator.on – true
hive.compactor.worker.threads – a positive number
当直接向表格中插入数据时,HDFS中存储的都是delta数据,datax无法读取,会报错:
java.lang.IllegalArgumentException: delta_0051045_0051045 does not start with base_
at org.apache.hadoop.hive.ql.io.AcidUtils.parseBase(AcidUtils.java:144)
at org.apache.hadoop.hive.ql.io.AcidUtils.parseBaseBucketFilename(AcidUtils.java:172)
at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.run(OrcInputFormat.java:544)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
2020-02-12 12:58:21.367 [0-0-36-reader] ERROR HdfsReader$Job - 从orcfile文件路径[hdfs://10.20.30.50:8020/inceptor1/user/hive/warehouse/iri.db/hive/var_scr/delta_0051045_0051045/bucket_00017]中读取数据发生异常,请联系系统管理员。
2、解决方式
Hive事务原理和Datax同步事务表问题解决的更多相关文章
- mysql事务管理和mysql用户管理
1.什么是事务? 事务是一条或者是一组语句组成一个单元,这个单元要么全部执行,要么全不执行. 2.事务特性:ACID: A:atomicity原子性:整个事务中的所有操作要么全部成功执行,要么全部失败 ...
- 数据库事务系列-MySQL跨行事务模型
说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务.虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事情基本 ...
- 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&隔离级别
数据库事务的四大特性以及事务的隔离级别 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...
- spring5 源码深度解析----- 事务增强器(100%理解事务)
上一篇文章我们讲解了事务的Advisor是如何注册进Spring容器的,也讲解了Spring是如何将有配置事务的类配置上事务的,实际上也就是用了AOP那一套,也讲解了Advisor,pointcut验 ...
- Hive SQL之分区表与分桶表
Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...
- 事务的隔离级别,mysql中开启事务、django中开启事务
目录 一.事务的特性 二.数据库中开启事务 三.Django中开启事务的两种方式 第一种 第二种 四.事务的隔离级别 隔离级别 如何查看mysql隔离级别? 修改事务的隔离级别 隔离级别解释 read ...
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
- 流水线技术原理和Verilog HDL实现(转)
源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...
随机推荐
- 【转】网关协议学习:CGI、FastCGI、WSGI、uWSGI
一直对这四者的概念和区别很模糊,现在就特意梳理一下它们的关系与区别. CGI CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与Web服务器之间的 ...
- 蓝桥杯 K好数
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.3 ...
- 【JavaWeb】JSP常用内置对象
session //a页面 <% request.getSession().setAttribute("key","session");%> < ...
- let const var 比较说明
现在先来做两道练习题 for(var i=0;i<10;i++){ var a='a' let b = 'b' } console.log(a) console.log(b) for(var i ...
- GO测试
测试 Go拥有一个轻量级的测试框架,它由 go test 命令和 testing 包构成. 你可以通过创建一个名字以 _test.go 结尾的,包含名为 TestXXX 且签名为 func (t *t ...
- C++ 知识零碎搭建
全局变量 局部变量 函数不能嵌套定义 C/C++ 变量在将要被使用时定义即可, 不必一开始就声明所有变量 函数的定义与声明的区别 C++常规类型自动类型转换规则 C语言中十六进制和八进制的格式: 二进 ...
- HDU 5564:Clarke and digits 收获颇多的矩阵快速幂 + 前缀和
Clarke and digits Accepts: 16 Submissions: 29 Time Limit: 5000/3000 MS (Java/Others) Memory Limi ...
- 电脑中安装了两个版本的jdk,后装的会把第一个覆盖掉
电脑中之前装过一个1.8的jdk,后来工作需要又装了个1.7的,但是1.7的没有在系统环境变量中进行配置,而是通过setclasspath文件设置的,但是后来我发现,虽然没有改变系统环境变量中的JAV ...
- FFmpeg笔记--vcodec和-c:v,-acodec和-c:a的区别?
在看ffmpeg命令的时候经常会看到有些地方使用--vcodec指定视频解码器,而有些地方使用-c:v指定视频解码器,那这两个有没有区别呢? ffmpeg的官方文档: -vcodec codec (o ...
- C语言调试器GDB和LLDB的使用方法
调试器的使用 编译输出带调试信息的程序 调试信息包含:指令地址.对应源代码及行号 指令完成后,回调 LINUX使用GDB MAX使用LLDB 使用说明 // 开始调试testlib程序 lldb te ...