Hive事务原理和Datax同步事务表问题解决

一、事务的概述

1、定义

事务就是一组单元化操作,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位。

2、特点

事务(transaction)具有的四个要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这四个基本要素通常称为ACID特性。

  • 原子性:一个事务是一个不可再分割的工作单位,事务中的所有操作要么都发生,要么都不发生。
  • 一致性:事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性:多个事务并发访问,事务之间是隔离的,一个事务不影响其它事务运行效果。这指的是在并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自完整的数据空间。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改后的状态,事务不会查看到中间状态的数据。事务之间的相应影响,分别为:脏读、不可重复读、幻读、丢失更新。
  • 持久性(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:03 /user/hive/warehouse/demo/base_0000042
      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

b、Compactor

Compactor是运行Metastore 里以支持ACID的一系列的后台操作。它包括,Initiator, Worker, Cleaner, AcidHouseKeeperService等等。可以通过SHOW COMPACTIONS的命令查看当前和最近合并的操作

c、Delta File 合并

随着对表的数据的修改,会产生越来越多的delta files. 为了保持性能,需要对这些文件进行合并。分为Minor compaction和Major compaction。

  • Minor compaction :将已有的delta files重写到一个单独的delta file,每个分桶一个。
  • Major compaction: 将delta文件和base 重写到一个新的base file,每个分桶一个。 这个合并操作的代价更大。
  • 所有的合并操作都是后台进行,不会影响并行的数据读取和写入。合并完成之后,系统会等到所以的读操作完成再删除旧的文件。

d、Worker

一个Worker处理一个合并任务,一个合并任务是一个MapReduce job。每个worker提交一个job给集群,并排队处理。hive.compactor.worker.threads 确定每个Metastore中Worker的个数。

e、Cleaner

该进程删除合并之后不再需要的delta files

f、AcidHouseKeeperService
   该进程检查在 hive.txn.timeout 内没有心跳的事务并丢弃。对于一个初始化过事务的client,如果心跳停止了,它所锁住的资源会被释放。

四、datax通过数据中遇到的问题

1、前提条件

当开启了事务,但是没有配置参数,即事务限制条件:

当直接向表格中插入数据时,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中的isuue也提到了该问题: https://issues.apache.org/jira/browse/HIVE-15189%E8%BF%99%E4%B8%AA%E8%BF%9E%E6%8E%A5%E8%83%BD%E6%89%93%E5%BC%80%E5%90%97

解决方法:

https://issues.apache.org/jira/browse/HIVE-15189%E8%BF%99%E4%B8%AA%E8%BF%9E%E6%8E%A5%E8%83%BD%E6%89%93%E5%BC%80%E5%90%97

将该表手动压缩,在使用datax同步数据:

ALTER TABLE demo COMPACT ‘MAJOR‘;

原文地址:https://www.cnblogs.com/chhyan-dream/p/12302962.html

时间: 2024-11-13 09:01:36

Hive事务原理和Datax同步事务表问题解决的相关文章

数据库事务系列-MySQL跨行事务模型

说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务.虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事情基本都是围绕着MySQL做管控系统,比较上层.好在周边都是MySQL内核神级人物,在他们的熏陶下多多少少对MySQL的一些基本知识有一些零碎的记录和模糊的认识,这些基础对于今天整理理解MySQL跨行事务模型非常重要.更重要的,有很多不解的地方也可以向大神请教. MySQL事务模型在网上也有很多的介绍,在

如何处理SQL Server事务复制中的大事务操作

如何处理SQL Server事务复制中的大事务操作 事务复制的工作机制 事务复制是由 SQL Server 快照代理.日志读取器代理和分发代理实现的.快照代理准备快照文件(其中包含了已发布表和数据库对象的架构和数据),然后将这些文件存储在快照文件夹中,并在分发服务器中的分发数据库中记录同步作业. 日志读取器代理监视为事务复制配置的每个数据库的事务日志,并将标记为要复制的事务从事务日志复制到分发数据库中,分发数据库的作用相当于一个可靠的存储-转发队列. 分发代理将快照文件夹中的初始快照文件和分发数

数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&amp;隔离级别

本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执

Hive SQL之分区表与分桶表

Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也存在着显著的差异,比如Hive不支持行级数据的插入.更新和删除,也不支持事务操作. 注: HIVE 2.*版本之后开始支持事务功能,以及对单条数据的插入更新等操作 Hive的相关概念 Hive数据库 Hive中的数据库从本质上来说仅仅就是一个目录或者命名空间,但是对于具有很多用户和组的集群来说,这个

从本地事务到分布式事务到微服务下事务

从本地事务到分布式事务到微服务下事务 一.传统本地事务 传统单服务器,单关系型数据库下事务比较简单,完全可用很简单的实现ACID,实际中我们实现一个业务时只需要:开启一个事务-操作数据库-提交/回滚这个事务,这样就完美的实现了一次事务操作,更简单点我们通常会通过spring集成事务直接指定在哪些服务什么样的方法执行什么样的事务即可,更甚至我们业务实现基本都忽略了事务,具体图如下: 二.传统分布式事务 在传统一服务,一个关系数据库架构基础上,随着访问量的增大,单机很明显已满足不了现状,于是我们顺其

数据库事务的四大特性和事务隔离级别

Reference: [1] http://www.cnblogs.com/fjdingsd/p/5273008.html [2] http://blog.csdn.net/fg2006/article/details/6937413 数据库事务四大特性 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全

数据库事务的四大特性以及事务的隔离级别

本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执

Spring事务管理-使用注解配置事务

一.概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务API如JTA更简单的编程式事务管理

数据库事务的四大特性及事务隔离级别

摘自:http://www.cnblogs.com/fjdingsd/p/5273008.html 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consi