Spark 写入hive表解析

FileOutputCommitter中提交mapreduce.fileoutputcommitter.algorithm.version有v1和v2两个版本。

v1版本Spark写入文件的流程:

1.当task完成的时候,会将task的结果文件先写入到临时目录下面。

2.所有的task完成后,将所有的结果文件写入到结果目录。

3.删除临时目录,生成标记文件。

v1的弊端:第二步写入操作是在driver端进行的,而且是单线程进行。当结果文件数量很多的时候,耗时就会线性增加。

v2版本Spark写入文件的流程:

1.当task完成的时候,将task的结果文件直接写入结果目录。

2.所有的task完成后,删除临时目录,生成标记文件。

可以看的v2比v1少了一个rename的过程。写入结果目录是发生在Executor上,task是同时进行的,相当于多线程,速度更快。但是存在一致性问题,在所有task写入结果目录过程,用户可以看到部分数据。

FileOutputCommitter源码解析

对应的类是org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter

commit task

Executor端完成task会执行commitTask,可以看到当algorithmVersion == 1的时候会执行rename操作,将task结果文件到committedTaskPath(临时文件)。

algorithmVersion不是1的时候,使用mergePaths将结果文件直接写入到outputPath

commit job

在driver执行,当job完成(所有的task完成),执行commitJob

algorithmVersion == 1,执行mergePaths将结果文件直接写入到outputPath,这里就是性能瓶颈所在的地方,这里是单线程进行的,要是单个文件耗时20ms,1000个文件就是20000ms(20s),它是线性增加的。

algorithmVersion == 2的话,在commitTask中已经写入到结果目录了。

最后删除临时目录,生成标记文件。

和hive结合使用

上面提到使用v2的时候,很有可能出现结果目录中出现部分文件的情况,这要是hive的表目录就能在这个表读取到部分数据,这是不对的。应该保证原子性,要么读取的数据是旧的数据,要么是新的数据,不能读取部分数据。

入口类:org.apache.spark.sql.hive.execution.InsertIntoHiveTable

hive的临时目录生成

类似这种:{hive表数据目录}/.hive-staging_hive_2025-06-26_17-33-07_088_701862708150638596-1/-ext-10000/

processInsert

这里就一个简单的场景,就是写入到非分区表。

首先是先将数据写入到hive的临时目录中,在load到hive表中。

写入hive临时目录

可以看到commiter变量,这个就是上面的FileOutputCommitter,有两种提交方式。

runJob就是spark提交了任务,开始执行。这里执行task,task完成回调commitTask方法,runJob是阻塞的,会等到所有task完成。然后回调commitJob方法。根据上面FileOutputCommitter,此时数据已经全部写入了hive的临时目录下面了。

loadTable

loadTable是使用反射的方式执行_loadTableMethod_方法,对应就是Hive的loadTable方法。

hive的loadTable中如果是替换就是replaceFiles,否则是copyFiles。

replaceFiles

对应sparksql的 insert overwrite

首先将原有的目录下面的文件都放到回收站,即删除,再将结果文件从临时目录移动到正式目录。

moveFiles 移动结果文件。可以看到使用线程池(默认是25个线程)进行结果文件的重命名来移动文件的。不同于FileOutputCommitter的v1中单线程进行rename,Hive是多线程来rename的,效率更高。

copyFiles

对应sparksql的 insert into

可以看到它也是使用线程池进行并行操作的。

整体流程

v2流程,建议使用v2,效率更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87252.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux云计算基础篇(5)

一、sudo是什么? 定义:sudo(SuperUserDO)是一个Linux/Unix系统命令,允许被授权的普通用户以另一个用户(通常是超级用户root)的身份执行命令。 核心目的: 1.最小权限原则:避免让用户长期拥有ro…

Postgresql通过pgpool进行高可用部署主从,灾备(单机版)

1、bitnami/postgresql-repmgr:15 (镜像名) Bitnami 的 PostgreSQL-Repmgr 镜像是一个预配置的 Docker 镜像,集成了 PostgreSQL 数据库和 repmgr(Replication Manager)工具,用于快速搭建高可用&#xff08…

Flink-1.19.0源码详解-番外补充3-StreamGraph图

1.StreamGraph图: StreamGraph是Flink流处理作业的第一个计算调度流图,它是从用户编写的 DataStream API程序转换而来的逻辑图。StreamGraph由StreamNode与StreamEdge组成,StreamNode为记录数据处理的节点,StreamEdge为连接两个StreamNode的边…

linux系统---Nginx反向代理与缓存功能

目录 正向代理和反向代理 正向代理的作用 反向代理可实现的功能 反向代理客户端ip透传 1.初始访问192.168.235.139 结果 2.编辑代理服务器的配置文件 3、重载nginx服务 4、访问代理服务器 实现反向代理负载均衡 1.先启用已用另一台服务端 2.使用192.168.235.140 …

U+平台配置免密登录、安装Hadoop配置集群、Spark配置

文章目录 1、免密登录2、安装hadoop3、Spark配置 具体详细报告见资源部分,全部实验内容已经上传,如有需要请自行下载。 1、免密登录 使用的配置命令: cd ~/.ssh/ssh-keygen -t rsaEnter键回车y回车回车出现如上所示 cat ./id_rsa.pub >…

GitHub vs GitLab 全面对比报告(2025版)

从技术架构到金融估值,深度解析两大代码托管平台的差异化竞争策略 一、技术架构对比 维度GitHub (Microsoft旗下)GitLab (独立上市公司)关键差异核心架构- 分布式Git仓库 Issues/Projects- 全栈DevSecOps平台GitLab集成CI/CD、安全、监控部署模式- SaaS为主 - Git…

Python 数据分析与可视化 Day 14 - 建模复盘 + 多模型评估对比(逻辑回归 vs 决策树)

✅ 今日目标 回顾整个本周数据分析 & 建模流程学会训练第二种模型:决策树(Decision Tree)掌握多模型对比评估的方法与实践输出综合对比报告:准确率、精确率、召回率、F1 等指标为后续模型调优与扩展打下基础 🪜 一…

本周大模型新动向:KV缓存混合精度量化、个体时空行为生成、个性化问答

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 KVmix: Gradient-Based Layer Importance-Aware Mixed-Precision Quantization for KV Cache 大型语言模型(LLMs)在推理过程中,键值(KV)缓存的高内…

在 Spring Boot 中使用 WebMvcConfigurer

WebMvcConfigurer 是 Spring MVC 提供的一个扩展接口,用于配置 Spring MVC 的各种功能。在 Spring Boot 应用中,通过实现 WebMvcConfigurer 接口,可以定制和扩展默认的 Spring MVC 配置。以下是对 WebMvcConfigurer 的详细解析及其常见用法。…

w-笔记:uni-app的H5平台和非H5平台的拍照识别功能:

uni-app的H5平台和非H5平台的拍照识别功能&#xff1a; <template><view class"humanVehicleBinding"><view v-if"warn" class"shadow"></view><view class"header"><uni-nav-bar left-icon"l…

TCP 半连接队列和全连接队列(结合 Linux 2.6.32 内核源码分析)

文章目录 一、什么是 TCP 半连接队列和全连接队列二、TCP 全连接队列1、如何查看进程的 TCP 全连接队列大小&#xff1f;注意 2、TCP 全连接队列溢出问题注意 3、TCP 全连接队列最大长度 三、TCP 半连接队列1、TCP 半连接队列溢出问题2、TCP 半连接队列最大长度3、引申问题 一、…

linux下fabric环境搭建

参考教程&#xff1a; https://devpress.csdn.net/cloudnative/66d58e702045de334a569db3.html?dp_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MjA2MzY4NywiZXhwIjoxNzQwMzY4MDc0LCJpYXQiOjE3Mzk3NjMyNzQsInVzZXJuYW1lIjoiaHVhbmd0dXBpIn0.oh8e4F6Sw_A4SV2ODQ5W0pYK0…

Redis Pipeline介绍:提高操作Redis数据库的执行效率

Redis Pipeline是一种用于提高Redis执行效率的技术&#xff0c;通过减少客户端与服务器之间的通信开销&#xff0c;显著提升批量操作的性能。本文将详细介绍Redis Pipeline的概念、使用场景、实现方式及其优势。 一、Redis Pipeline的概念 Redis Pipeline是一种批处理机制&am…

linux长时间锁屏无法唤醒

是的&#xff0c;您这么理解很直接&#xff0c;抓住了要点。 简单来说&#xff0c;就是这样&#xff1a; 电脑睡觉有两种方式&#xff1a; 打个盹&#xff08;挂起/Suspend&#xff09;&#xff1a; 把工作状态保存在内存里。这个一般和 Swap 分区没关系。睡死过去&#xff…

STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader

导言 想象一下&#xff0c;我们的单片机 App 正在稳定地运行着&#xff0c;突然我们想给它升级一下&#xff0c;添加个新功能。我们该如何安全地通知它&#xff1a;“嘿&#xff0c;准备好接收新固件了” ? 这就需要 App 和 Bootloader 之间建立一个可靠的"秘密握手"…

Explain解释

参考官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/explain-output.html explain关键字可以分析你的查询语句的结构和性能。 explain select查询&#xff0c; 执行会返回执行计划的信息。 注意&#xff1a;如果from中有子查询&#xff0c;仍然会执行该子查询…

选择 PDF 转 HTML 转换器的 5 个关键特性

市面上有很多 PDF 转 HTML 的转换器&#xff0c;每一款产品都有不同的功能组合。要理清并理解每个功能可能会让人感到困惑。那么&#xff0c;真正重要的是什么呢&#xff1f; 这篇文章将介绍我们认为在选择最佳 PDF 转 HTML 转换器时最重要的 5 个关键特性&#xff1a; 1. 转换…

使用堡塔在服务器上部署宝塔面板-linux版

使用堡塔在服务器上部署宝塔面板-linux版 使用堡塔多机管理登录服务器 进入宝塔官网&#xff0c;获取安装脚本 wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec3. 在堡塔多机管理中&#xff0c;…

【Unity高级】Unity多界面游戏场景管理方案详解

引言&#xff1a;游戏界面管理的挑战 在Unity游戏开发中&#xff0c;尤其是包含多个功能界面&#xff08;如主菜单、关卡选择、游戏页面、设置和商城&#xff09;的游戏&#xff0c;如何高效管理场景与界面是架构设计的核心挑战。本文将深入探讨三种主流实现方案&#xff1a;单…

WINDOWS最快布署WEB服务器:apache2

安装JDK下载 https://tomcat.apache.org/ Index of /dist/tomcat/tomcat-9 安装测试 http://localhost:8080/ 替换自己的文件 把自己的文件复制到&#xff1a; C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\ROOT