Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 649|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-7-12 08:10:51 | 显示全部楼层 |阅读模式

    一、事务的概述

    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、解决方式

     解决方法:
     将该表手动压缩,在使用datax同步数据:
    ALTER TABLE demo COMPACT 'MAJOR';
     
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-29 02:06 , Processed in 0.072908 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表