大數據面試之路 (二) hive小文件合并優化方法

大量小文件容易在文件存儲端造成瓶頸,影響處理效率。對此,您可以通過合并Map和Reduce的結果文件來處理。?

一、合并小文件的常見場景

  1. 寫入時產生小文件:Reduce任務過多或數據量過小,導致每個任務輸出一個小文件。

  2. 動態分區插入:分區字段基數高,每個分區生成少量數據,形成大量小文件。

  3. 頻繁追加數據:通過INSERT INTO多次追加數據,導致文件碎片化。

二、合并小文件的核心方法

?方法1:調整Reduce任務數量

-- 1. 設置Reduce任務數(根據數據量調整)
SET hive.exec.reducers.bytes.per.reducer=256000000; -- 每個Reduce處理256MB數據
SET hive.exec.reducers.max=1009; -- Reduce最大數量

-- 2. 執行插入操作(自動合并到指定Reduce數)
INSERT OVERWRITE TABLE target_table
SELECT * FROM source_table;

?方法2:啟用Hive自動合并

-- 啟用Map端和Reduce端小文件合并
SET hive.merge.mapfiles = true; ? ? ? ? ?-- Map-only任務結束時合并小文件
SET hive.merge.mapredfiles = true; ? ? ? -- Map-Reduce任務結束時合并小文件
SET hive.merge.size.per.task = 256000000; -- 合并后文件目標大小(256MB)
SET hive.merge.smallfiles.avgsize = 16000000; -- 平均文件小于16MB時觸發合并

-- 執行插入操作(自動合并)
INSERT OVERWRITE TABLE target_table
SELECT * FROM source_table;

?方法3:使用ALTER TABLE ... CONCATENATE(ORC格式專用)

?-- 合并表或分區的ORC文件
ALTER TABLE table_name [PARTITION (partition_key='value')] CONCATENATE;

方法4:重寫數據(通用)?

通過INSERT OVERWRITE重新寫入數據,強制合并文件:?

-- 1. 將數據覆蓋寫入原表(自動合并)
INSERT OVERWRITE TABLE target_table
SELECT * FROM target_table;?

-- 2. 寫入新表后替換舊表
CREATE TABLE new_table AS SELECT * FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;

?方法5:使用Hadoop命令合并(手動操作)

?合并HDFS上已有的小文件(需謹慎操作):

# 1. 合并HDFS文件到本地(合并后需重新加載)
hadoop fs -getmerge /user/hive/warehouse/table_dir/* merged_file.txt
hadoop fs -put merged_file.txt /user/hive/warehouse/table_dir/

# 2. 使用Hive的`hadoop jar`命令合并(針對特定格式)
hadoop jar $HIVE_HOME/lib/hive-exec.jar -Dmapreduce.job.queuename=default \
? -Dmapreduce.map.memory.mb=2048 \
? org.apache.hadoop.hive.ql.io.HiveFileFormatUtils \
? --combine /user/hive/warehouse/table_dir/ /user/hive/warehouse/table_dir_merged/

三、動態分區場景下的優化?

若使用動態分區(如按天、按用戶ID分區),需額外配置:

-- 啟用動態分區模式
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;

-- 設置每個Reduce任務寫入的分區數
SET hive.optimize.sort.dynamic.partition = true;
SET hive.exec.max.dynamic.partitions = 1000;
SET hive.exec.max.dynamic.partitions.pernode = 100;

四、不同文件格式的注意事項

文件格式合并特點
Text需通過重寫數據或Hadoop命令合并。
ORC支持ALTER TABLE ... CONCATENATE快速合并,或重寫數據。
Parquet只能通過重寫數據合并(如INSERT OVERWRITE)。
RCFile類似ORC,但無專用合并命令,需重寫數據。

五、最佳實踐?

  1. 寫入時預防

    • 合理設置Reduce任務數,避免過度并行化。

    • 啟用hive.merge參數自動合并小文件。

  2. 事后合并

    • ORC表優先使用ALTER TABLE ... CONCATENATE

    • 其他格式通過INSERT OVERWRITE重寫數據。

  3. 分區管理

    • 避免過多細粒度分區,定期清理過期數據。

?示例:合并ORC表文件

-- 1. 檢查表格式
DESCRIBE FORMATTED table_name;

-- 2. 合并文件(ORC格式)
ALTER TABLE table_name CONCATENATE;

-- 3. 驗證合并后文件大小
hadoop fs -du -h /user/hive/warehouse/table_dir;

如何調優Hive作業

更多內容請參考 案例云幫助文檔

如何調優Hive作業_開源大數據平臺 E-MapReduce(EMR)-阿里云幫助中心

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72367.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL 批量插入 vs 逐條插

MySQL 插入數據:批量插入 vs 逐條插入,哪個更快? 在 MySQL 中,插入數據有兩種常見方式: 批量插入:一條 SQL 插入多條數據。逐條插入:每次插入一條數據。 這兩種方式有什么區別?哪…

Docker基礎命令說明

Docker基礎操作命令眾多,這些命令可以按如下方式進行分類: 鏡像操作容器操作網絡操作數據卷操作LOG查詢 等方面進行分類。 一、鏡像操作命令 docker images:用于列出本地系統中所有的 Docker 鏡像。鏡像就像是一個模板,它包含…

AI重構私域增長:從流量收割到終身價值運營的三階躍遷

私域運營的AI進化論:內容即服務的三個階段 隨著企業微信生態的成熟,私域運營正經歷從"流量收割"到"關系養成"的本質轉變。在AIGC技術的推動下,2024年私域場景正式進入**"內容即服務"**的價值共創期&#xff1…

Linux date 命令使用指南

date 命令用于 顯示或設置系統日期和時間&#xff0c;支持靈活的時間格式化和計算。以下是常用場景與詳細示例&#xff1a; 一、基本用法 1. 顯示當前日期和時間 <BASH> date # 輸出&#xff1a;Thu Jun 13 14:25:36 CST 20242. 設置系統時間&#xff08;需root權限&am…

Maven的依賴管理

maven相關依賴的官網&#xff1a;https://mvnrepository.com/ pom.xml是項目依賴的配置文件 maven首先會去本地倉庫下載相關依賴&#xff0c;如果沒有&#xff0c;則會去私服下載&#xff0c;再沒有&#xff0c;就去中央倉庫或鏡像下載。 自定義properties&#xff0c;可使用…

Mybaties批量操作

1、批量插入 <!--批量操作-插入--><!-- 相當于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…

向量庫集成指南

文章目錄 向量庫集成指南Chroma集成Pinecone集成MiLvus集成向量庫集成指南 向量庫是一種索引和存儲向量嵌入以實現高效管理和快速檢索的數據庫。與單獨的向量索引不同,像Pinecone這樣的向量數據庫提供了額外的功能,例如,索引管理、數據管理、元數據存儲和過濾,以及水平擴展…

軟件測試之使用Requests庫進行接口測試

文章目錄 前言Requests庫是什么為什么要用Requests庫進行接口測試安裝Requests庫Requests庫使用發送GET請求發送帶查詢參數的GET請求響應內容格式添加請求頭信息發送一個POST請求查看響應內容斷言請求超時Cookie與Session模擬登錄 參考目錄 前言 閱讀本文前請注意最后編輯時間…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

AttributeError: module backend_interagg has no attribute FigureCanvas 這個錯誤通常是由于 Matplotlib 的后端配置問題引起的。具體來說&#xff0c;Matplotlib 在嘗試加載某個后端時&#xff0c;發現該后端模塊中缺少必要的屬性&#xff08;如 FigureCanvas&#xff09;&a…

iWebOffice2015 中間件如何在Chrome107及之后的高版本中加載

iWebOffice2015是江西金格科技有限公司開發的一款智能文檔中間件&#xff0c;和一些知名OA及ERP公司曾經達成OEM合作&#xff0c;所以用戶一度比較多&#xff0c;但不幸的是Chromium內核瀏覽器在2022年10月份發布的107版本中永久取消了對PPAPI插件的加載支持&#xff0c;導致使…

【MyBatis Plus JSON 處理器簡化數據庫操作】

文章目錄 什么是 MyBatis-Plus JSON 處理器&#xff1f;開始使用 MyBatis-Plus JSON 處理器步驟 1: 創建實體類步驟 2: 創建 Mapper 接口步驟 3: 查詢 JSON 數據步驟 4: 插入和更新 JSON 數據 什么是 MyBatis-Plus JSON 處理器&#xff1f; MyBatis-Plus 是一個基于 MyBatis 的…

OpnenHarmony 開源鴻蒙北向開發——1.開發環境搭建(DevEco Studio 5.03)

我這邊是基于window下對OpenHarmony開源鴻蒙進行北向開發。 一、安裝DevEco Studio 1、下載 下載中心 | 華為開發者聯盟-HarmonyOS開發者官網&#xff0c;共建鴻蒙生態 2、安裝 下載完成之后進行解壓 雙擊進行安裝 按照我的步驟進行 選擇安裝目錄&#xff0c;全部配置完成后…

深入 Python 網絡爬蟲開發:從入門到實戰

一、為什么需要爬蟲&#xff1f; 在數據驅動的時代&#xff0c;網絡爬蟲是獲取公開數據的重要工具。它可以幫助我們&#xff1a; 監控電商價格變化抓取學術文獻構建數據分析樣本自動化信息收集 二、基礎環境搭建 1. 核心庫安裝 pip install requests beautifulsoup4 lxml …

linux(ubuntu)中Conda、CUDA安裝Xinference報錯ERROR: Failed to build (llama-cpp-python)

文章目錄 一、常規辦法二、繼續三、繼續四、缺少 libgomp庫&#xff08;最終解決&#xff09;在 Conda 環境中安裝 libgomp 如果符合標題情況 執行的&#xff1a; pip install "xinference[all]"大概率是最終解決的情況。 一、常規辦法 llama-cpp-python 依賴 CMak…

OpenGL中繪制圖形元素的實現(使用visual studio(C++)繪制一個矩形)

目標&#xff1a;使用OpenGL提供的函數繪制矩形、線段、三角形等基本圖形元素 所需效果 實驗步驟 1、配置OpenGL&#xff08;詳情參見OpenGL的配置&#xff09; 2、頭文件引入 #include <gl/glut.h> 3、編寫方法體 1>矩形實現 //繪制矩形 void DisplayRectangl…

庖丁解java(一篇文章學java)

(大家不用收藏這篇文章,因為這篇文章會經常更新,也就是刪除后重發) 一篇文章學java,這是我滴一個執念... 當然,真一篇文章就寫完java基礎,java架構,java業務實現,java業務擴展,根本不可能.所以,這篇文章,就是一個索引,索什么呢? 請看下文... 關于決定開始寫博文的介紹 …

面試高頻#LeetCode#Hot100-字母異位詞分組

題號鏈接 49. 字母異位詞分組 - 力扣&#xff08;LeetCode&#xff09; 1首先定義map集合一個String對應一個String[]集合&#xff0c;遍歷字符串數組 2對其先進行拆分&#xff0c;拆分為字符數組&#xff0c;再進行排序&#xff0c;再轉為字符串 3如果key值沒有就創建一個字符…

esProc SPL vs DuckDB:多源數據處理誰更勝一籌?

DuckDB 和 esProc SPL 都支持多樣數據源處理&#xff0c;這里比較一下兩者的差異。 支持的數據源種類 DuckDB 支持的數據源類型覆蓋了常見的文件格式&#xff08;如 CSV、Parquet、JSON、Excel&#xff09;、云存儲&#xff08;如 AWS S3、Azure Blob Storage&#xff09;以及…

超精密工件小孔幾何尺寸測量:自動化解決方案

下載鏈接&#xff1a;&#xff08;最新版本&#xff09;超精密工件小孔幾何尺寸測量&#xff1a;自動化解決方案python腳本代碼&#xff0c;可直接運行&#xff0c;內包含測試數據&#xff0c;親測好用資源-CSDN文庫 在現代制造業中&#xff0c;超精密工件的質量控制至關重要&a…

重生之我在學Vue--第11天 Vue 3 高級特性

重生之我在學Vue–第11天 Vue 3 高級特性 文章目錄 重生之我在學Vue--第11天 Vue 3 高級特性前言一、Teleport&#xff1a;打破組件層級的瞬移術1. 什么是Teleport&#xff1f;2. 核心用法3. 實戰技巧 二、Suspense&#xff1a;異步組件的優雅過渡1. 為什么需要Suspense&#x…