datax同步数据翻倍,.hive-staging 导致的问题分析

2023-09-22 15:44:23

一、背景

有同事反馈 Datax 从 Hive 表同步数据到 Mysql 数据翻倍了。通过查看 Datax 任务日志发现,翻倍的原因是多读取了 .hive-staging_xx 开头的文件。接下里就是有关 .hive-staging 的分析。

二、环境

Hive 版本 2.1.1

三、分析

3.1 .hive-staging_hive 产生的原因

通过 Spark SQL、Hive SQL、Hue 等提交 SELECT 或者 INSERT OVERWRITE 等 SQL 到 Hive 时,会产生该目录,用于临时存放执行结果,比如 INSERT OVERWRITE 会将结果暂存到该目录下,待任务结束,将结果复制或移动到 Hive 表中。
对应的的参数:
hive.exec.stagingdir

  • Default Value: .hive-staging
  • Added in: Hive 1.1.0 with HIVE-8750

Directory name that will be created inside table locations in order to support HDFS encryption. This is replaces hive.exec.scratchdir for query results with the exception of read-only tables. In all cases hive.exec.scratchdir is still used for other temporary files, such as job plans.
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-QueryandDDLExecution
对应的源码:
https://github.com/apache/hive/blob/branch-2.1/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
查看 moveFile() 方法
从源码可以看到,有下面几种情况
① 源文件是本地系统的文件,使用 copyFromLocalFile 代码行数: 2925~2934
② 如果是跨系统或者不同加密的数据,会使用 copy ,涉及方法 needToCopy ,代码行数:3018~3032
③ 其他情况都是 move,涉及操作 namenode 元数据,不会有额外数据操作。 (注意:这里和 Hive 1.x 不一样,在 Hive 1.x 中如果原目录是目标目录的子目录,原目录下的每个文件进行copy操作,这个效率很低的!!!,可以查看 1.x 的原码:戳我)

3.2 为什么临时文件没有自动删除?

① 任务执行失败时,这些临时文件和目录不会被自动删除掉,直到有相关的 SQL 执行成功时,才会自动删掉。
② 我们发现,在 Hue 中提交的 SQL,临时文件和目录页也不会自动被删掉。也许和长连接有关系,我尝试了多次,必现。

3.3 .hive-staging_hive 会导致的一些问题:

① 如果目标路径存在临时文件的话,datax 读取hdfs数据的时候会递归读取,所有 .hive-staging_hive 临时文件的数据也会被 datax 读到,导致数据至少翻倍。
② 有的 .hive-staging_hive 可能会包含很多的临时文件,占用空间,同时也会造成 namenode 的压力;

四、如何解决?

从 Datax 的角度分析,修改 HDFS Reader 插件,过滤点开头的文件或目录。
从集群的角度分析,修改 hive.exec.stagingdir 配置,修改成统一的目录。

hive.exec.stagingdir
/tmp/hive/.hive-staging

从用户的角度分析,不要使用 Hue 补数,使用调度系统或者 beeline 执行 SQL,这两种方式都可以保证会话(连接)断开,临时文件(目录)会自动清理。

从社区的角度分析,查看社区的 issue ,有其他用户遇到了这个问题: Hive is not cleaning up staging directories 也可以看出,除了上述分析的原因,也可能有一些奇奇怪怪的bug导致临时文件不会被清理。
看到两个修复:
https://issues.apache.org/jira/browse/HIVE-17479 3.0 版本
When these queries are internally rewritten, a new context is created with a new execution id. This id is used to create the scratch directories. However, only the original context is cleared, and thus the directories created with the original execution id.
The solution is to pass the execution id to the new context when the queries are internally rewritten.
https://issues.apache.org/jira/browse/HIVE-20409 4.0版本

五、总结

hive-staging文件不会自动删除,有些未知的情况还无法避免。

  • 会浪费存储
  • 会影响datax同步数据,datax hdfs reader 也会把临时目录的数据同步到下游。

我认为最优的解决方案是,临时文件改成统一的目录,这样即使有临时文件没有自动删除,我们也可以进行周期性的监控并清理没有及时清理的过期的临时文件。

hive.exec.stagingdir
/tmp/hive/.hive-staging

另一种方案,不要使用hue刷数据,使用调度或beeline执行SQL,大概率(不排除是不是有其他bug)不会出现临时文件不会自动清理的情况。

大数据学习指南 专注于大数据技术分享与交流。

在这里插入图片描述

更多推荐

华为云HECS云服务器docker环境下安装mysql

华为云HECS云服务器,已经安装了docker环境,准备下docker环境下安装mysql。一、HECS云服务器安装docker登录华为HECS云服务器,安装docker环境。安装docker参考如下文章:华为云HECS安装docker并安装mysql-CSDN博客二、拉取mysql镜像1、拉取mysql5.7的镜像d

Flink1.14 Source概念入门讲解与源码解析

目录FlinkSource概念SourceSource源码getBoundedness()createReader(SourceReaderContextreaderContext)createEnumerator(SplitEnumeratorContextenumContext)SplitEnumeratorres

Redis的高性能之谜

介绍Redis通常用作缓存。当一致性要求不高时,它也可以用作存储。此外,Redis还提供消息订阅、事务、索引等功能。我们还可以使用集群功能构建分布式存储服务,并实现非强一致性的分布式锁服务。在上述各种情况下,Redis都具有一个共同的优势,即处理速度快(高性能)。Redis有多快?要了解Redis有多快,您需要有一个评

MySQL数据库入门到精通3--进阶篇(存储引擎,索引)

1.存储引擎1.1MySQL体系结构1).连接层最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接

怎样使用 NFTScan Solana API 快速创建 NFT 应用程序?

之前,Solana凭借其超高的性能和低廉的费用,已然成为NFT项目最青睐的公链之一,众多知名NFT项目如DeGods、OkayBears、DegenerateApeAcademy等都选择在Solana上发行。意味着Solana链上每天都会产生海量的NFT交易数据,仅交易记录就超过了数百万条。不仅如此,Solana新建钱

java 企业工程管理系统软件源码 自主研发 工程行业适用

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

【C++】STL之适配器---用deque实现栈和队列

目录前言一、deque1、deque的原理介绍2、deque的底层结构3、deque的迭代器4、deque的优缺点4.1、优点4.2、缺点二、stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现三、queue的介绍和使用1、queue的介绍2、queue的使用3、queue的模拟实现前

Python:为何成为当下最热门的编程语言?

文章目录🍋引言🍋1.简单易学🍋2.多领域应用🍋3.强大的社区支持🍋4.丰富的库和框架🍋5.跨平台兼容🍋6.开源和免费🍋7.数据科学和人工智能的崛起🍋8.自动化和脚本编写🍋9.大型组织的采用🍋10.教育和培训🍋引言在计算机编程的世界里,有数以百计的编程语言可供选择。然而,近年来,Python已经崭

偶现来电时手机操作出现重启

问题描述:偶现来电时手机操作出现重启问题分析:从系统Log看09-0610:22:44.79182914001425WWatchdog:***WATCHDOGKILLINGSYSTEMPROCESS:Blockedinhandleronmainthread(main)09-0610:22:44.794133140014

CSRF和SSRF有什么不同?

文章目录CSRF复现SSRF复现启动环境漏洞复现探测存活IP和端口服务计划任务反弹shell区别CSRF复现打开dvwa,将难度调为low,点击CSRF,打开后发现有一个修改密码的输入框:在这里修改密码,并用bp抓包,在httphistory查看数据包,点击engagementtools中的GenerateCSRFPo

策略模式,一种广泛应用于各种情况的设计模式(设计模式与开发实践 P5)

文章目录策略模式实现思想实战-表单策略模式定义:定义一系列算法,把它们一个个封装起来,并且可以互相替换例如,我们要计算年终奖,年终奖根据绩效A、B、C来计算最终数值实现最初我们很容易想到用分支if来解决这个问题,如果绩效=A则工资x2,如果绩效=B则工资x3如果经常使用这样的分支结构,你会发现代码耦合度很高,很容易就出

热文推荐