大数据面试之路 (二) 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.mzph.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…