Hive RCFile合并作业为什么产生重复数据

前几天有DW用户反馈,在往一张表(RCFile表)中用“insert overwrite table partition(xx) select ...” 插入数据的时候,会产生重复文件。看了下这个作业log,发现map task 000005起了两个task attempt ,第二个attempt是推测执行,并且这两个attemp都在task close函数里面重命名temp文件成正式文件,而不是通过mapreduce框架的两阶段提交协议(two phrase commit protocol)在收到tasktracker发过来的commitTaskAction时再commit task来保证只有一个attemp的结果成为正式结果。

task log中的输出如下:

attempt_201304111550_268224_m_000005_0
renamed path hdfs://10.2.6.102/tmp/hive-deploy/hive_2013-05-30_10-13-59_124_8643833043783438119/_task_tmp.-ext-10000/hp_cal_month=2013-04/_tmp.000005_0 to hdfs://10.2.6.102/tmp/hive-deploy/hive_2013-05-30_10-13-59_124_8643833043783438119/_tmp.-ext-10000/hp_cal_month=2013-04/000005_0 . File size is 666922  

attempt_201304111550_268234_m_000005_1
renamed path hdfs://10.2.6.102/tmp/hive-deploy/hive_2013-05-30_10-13-59_124_8643833043783438119/_task_tmp.-ext-10000/hp_cal_month=2013-04/_tmp.000005_1 to hdfs://10.2.6.102/tmp/hive-deploy/hive_2013-05-30_10-13-59_124_8643833043783438119/_tmp.-ext-10000/hp_cal_month=2013-04/000005_1 . File size is 666922

其实这条hive语句原本只会起1个job(Launching Job 1 out of 1),当第一个job结束的时候,会起一个conditional task分析每个partition下平均文件的大小,如果小于hive.merge.smallfiles.avgsize(默认为16MB), 第一个job又是map-only job,并且打开hive.merge.mapfiles(默认为true) ,则会另外起一个merge-file job来合并小文件,第二个job中用到RCFileMergeMapper就是合并之前生成的小文件的。workaround的方式有两种,一种是关闭推测执行,不过会有可能有一个task比较慢导致瓶颈,另一种是关闭merge file job(set hive.merge.mapfiles=fasle),从而不使用RCFileMergeMapper,不过这样产生大量的小文件就无法合并。
如果解析出来是要起merge job,会创建一个BlockMergeTask(继承自Task),执行里面的execute方法,先设置好JobConf相应的参数,比如mapred.mapper.class, hive.rcfile.merge.output.dir等,然后创建一个JobClient并submitJob,map的执行逻辑在RCFileMergeMapper类中,它继承了老的MapRed API中的抽象类MapReduceBase,覆盖了configure和close方法,前面提到的rename操作就是在close方法中,MapRunner类中的run方法会循环调用真正执行mapper的map方法,并在finally调用mapper的close方法

public void close() throws IOException {
  // close writer
  if (outWriter == null) {
    return;
  }  

  outWriter.close();
  outWriter = null;  

  if (!exception) {
    FileStatus fss = fs.getFileStatus(outPath);
    LOG.info("renamed path " + outPath + " to " + finalPath
        + " . File size is " + fss.getLen());
    if (!fs.rename(outPath, finalPath)) {
      throw new IOException("Unable to rename output to " + finalPath);
    }
  } else {
    if (!autoDelete) {
      fs.delete(outPath, true);
    }
  }
}

job执行完成后,是有可能有同一task的不同attempt产生结果文件同时存在的,不过hive显然考虑到了这点,所以在merge作业执行后会调用RCFileMergeMapper.jobClose方法,它会先备份输出目录,然后将数据写入输出目录并调用Utilities.removeTempOrDuplicateFiles方法来删除重复文件,删除的逻辑是从文件名中提取taskid,如果同一个taskid有两个文件,则会将小的那个删除,不过在0.9版本中,RCFileMergeMapper对于目标表是动态分区表情况下不支持,所以还会有duplicated files,打上patch(https://issues.apache.org/jira/browse/HIVE-3149?attachmentOrder=asc)后解决问题

RCFileMergeMapper execute方法finally处理逻辑,源代码中catch住exception后无任何处理,我加了一些stack trace输出和设置return value

finally {
      try {
        if (ctxCreated) {
          ctx.clear();
        }
        if (rj != null) {
          if (returnVal != 0) {
            rj.killJob();
          }
          HadoopJobExecHelper.runningJobKillURIs.remove(rj.getJobID());
          jobID = rj.getID().toString();
        }
        RCFileMergeMapper.jobClose(outputPath, success, job, console, work.getDynPartCtx());
      } catch (Exception e) {
        console.printError("RCFile Merger Job Close Error", "n"
            + org.apache.hadoop.util.StringUtils.stringifyException(e));
        e.printStackTrace(System.err);
        success = false;
        returnVal = -500;
      }
    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, deploy path
, hive
, 方法
, sqoop hive mysql
, merge
, close
, 一个
fs.rename方法
hive rcfile、hive rcfile 压缩、hive rcfile orcfile、hive rcfile 导入、hive rcfilecat,以便于您获取更多的相关知识。

时间: 2024-11-02 16:49:44

Hive RCFile合并作业为什么产生重复数据的相关文章

sqlserver合并DataTable并排除重复数据的通用方法分享

代码如下: 复制代码 代码如下: ///<summary> /// 将两个列不同的DataTable合并成一个新的DataTable ///</summary> ///<param name="dt1">源表</param> ///<param name="dt2">需要合并的表</param> ///<param name="primaryKey">需要排重列表

哪些企业适合采用重复数据删除技术

随着企业对数据安全的重视程度加强,适合企业不同特性的从存储备份方案也应运而生.重复删除技术就是其中的一种.在这篇中就跟大家谈谈,什么样的企业适合采用重复数据删除技术. 一.数据量大.且冗余大的企业适合使用重复数据删除技术. 在对企业的信息化数据进行存储与备份时,超大的容量一直是项目管理员比较头疼的问题.有不少企业,可能一年就需要升级一下存储设备的容量.在这种情况下,采用重复数据删除技术能够起到一定的效果. 通常情况下,当企业的数据量越大,备份数据中所包含的冗余部分也就越多.虽然说增量的http:

合并-关于EXCEL中宏操作,如何用宏处理重复数据

问题描述 关于EXCEL中宏操作,如何用宏处理重复数据 如何使用EXCEL中的宏啊,EXCEL版本为2010,我想通过宏将表中应用账号相同的数据合并成一条,具体如何操作呢 数据合并成一条,如何操作呢? 解决方案 vim重复操作的宏录制vim重复操作的宏录制vim重复操作的宏录制 解决方案二: 好像有一个按钮是可以删除的,数据选项里找找呢

ASP.NET中GridView和Repeater重复数据如何合并_实用技巧

这几天做一个项目有用到表格显示数据的地方,客户要求重复的数据列需要合并,就总结了一下GridView 和 Repeater 关于重复数据合并的方法. 效果图如下 : GridView : 前台代码 : <div> <asp:GridView ID="gvIncome" runat="server" AutoGenerateColumns="False"> <Columns> <asp:TemplateFi

mysql 数据表合并并且只重复数据只读取一条

mysql教程 数据表合并并且只重复数据只读取一条 //首先我们来盾mysql sql结构了,用了union联合查询与insert into 来整表复制了. mysql_connect("localhost","root","root") or die('Database Server Uid or Password Error!'); mysql_select_db('ip') or die('data !'); mysql_query(&qu

飞康发布第8代备份及重复数据删除一体化解决方案

 数据保护和迁移领域的市场领导厂商美国飞康软件公司(FalconStor Software, Inc.,NASDAQ:FALC)近日正式发布第8代备份/去重一体化解决方案,从而为用户提供更强的备份和重复数据删除功能.飞康备份/去重解决方案v8.0整合了飞康公司VTL虚拟磁带库和 FDS去重解决方案两款现有产品的全部功能,将两者有效的合并到一个统一平台,经通用用户界面为用户提供备份及重复数据删除服务. 用户通过使用飞康备份/去重一体化平台,可能获得高达50%的成本节约,以及高达65%的性能与效率提

增强型XP7在提升闪存容量的同时,引入重复数据删除功能

HPE公司将日立第二代VSP功能添加至自家XP7阵列系列当中. 日立专利闪存被惠普方面添加至自家XP7阵列当中. HPE公司的XP7是一款OEM型日立VSP阵列,其最初公布于2014年4月,旨在对同样为OEM出身的XP阵列作出更新. XP7阵列于2015年9月正式迎来闪存存储介质,其采用日立公司提供的SSD专用格式型闪存模块驱动器.日立数据系统公司于今年10月更新了其VSP闪存与混合型闪存/磁盘阵列.因此如今HPE方面也快速跟上,并继续将日立阵列硬件与软件作为XP7产品的实现基础. 根据惠普方面

在Oracle中如何删除表中设计重复数据

oracle|设计|数据|重复 我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢? 重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样. 一.对于部分字段重复数据的删除 先来谈谈如何查询重复的数据吧. 下面语句可以查询出那些数据是重复的: select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1 将上面的>号改为=号就可以查询

windows server 2012中如何删除重复数据

实验名称:windows server2012实现重复数据删除 实验名称:实现重复数据删除 实验目标: 2 实现重复数据删除 实验环境:一台安装了WS2012操作系统的物理计算机,一台WS2012虚拟机(DC1). 任务1:安装'数据删除重复'角色. 1. 使用管理员帐户Administrator,登录到DC1. 2. 在任务栏,单击'服务器管理器'图标 . 3. 在'服务器管理器'窗口,单击'管理',在下拉菜单中单击'添加角色和功能'. 4. 在'选择安装类型'页面,选择'基于角色或功能的安装