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
英文地址,請注明出處:http://en.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