hive 中可能产生小文件的场景

ops/2025/3/13 20:16:10/

在 Hive 中,小文件是指文件大小远小于 HDFS 块大小(通常为 128 MB 或 256 MB)的文件。小文件过多会导致 NameNode 内存压力增大、查询性能下降以及资源浪费。以下是 Hive 中可能产生小文件的常见场景:


1. 高频插入数据

场景描述

  • 使用 INSERT INTO 或 INSERT OVERWRITE 语句频繁插入少量数据。

  • 每次插入操作都会生成一个新的文件。

示例

INSERT INTO TABLE example_table VALUES (1, 'Alice');
INSERT INTO TABLE example_table VALUES (2, 'Bob');
  • 每次插入都会生成一个小文件。


2. 动态分区插入

场景描述

  • 使用动态分区插入数据时,如果分区数量较多且每个分区的数据量较小,会导致每个分区生成一个小文件。

示例

INSERT OVERWRITE TABLE partitioned_table PARTITION (dt)
SELECT id, name, dt FROM source_table;
  • 如果 dt 分区字段有大量不同的值,且每个分区的数据量较小,会生成大量小文件。


3. 使用 GROUP BY 或 DISTINCT

场景描述

  • 在 GROUP BY 或 DISTINCT 操作中,如果分组字段的基数(Cardinality)较高,且每个分组的数据量较小,会导致每个分组生成一个小文件。

示例

INSERT OVERWRITE TABLE grouped_table
SELECT key, COUNT(*) 
FROM source_table 
GROUP BY key;
  • 如果 key 的基数较高,且每个 key 的数据量较小,会生成大量小文件。


4. 使用 UNION ALL

场景描述

  • 使用 UNION ALL 合并多个查询结果时,如果每个查询的结果数据量较小,会导致生成多个小文件。

示例

INSERT OVERWRITE TABLE union_table
SELECT * FROM table_a
UNION ALL
SELECT * FROM table_b;
  • 如果 table_a 和 table_b 的数据量较小,会生成多个小文件。


5. 使用 CREATE TABLE AS SELECT (CTAS)

场景描述

  • 使用 CREATE TABLE AS SELECT 创建新表时,如果源表的数据分布不均匀或数据量较小,会导致生成小文件。

示例

CREATE TABLE new_table AS
SELECT * FROM source_table;
  • 如果 source_table 的数据量较小或分布不均匀,会生成小文件。


6. 使用 MAPREDUCE 任务

场景描述

  • 在 MapReduce 任务中,如果 Reduce 任务数设置过多,且每个 Reduce 任务处理的数据量较小,会导致生成大量小文件。

示例

SET hive.exec.reducers.bytes.per.reducer = 1000000; -- 每个 Reducer 处理 1 MB 数据
INSERT OVERWRITE TABLE reduced_table
SELECT key, COUNT(*) 
FROM source_table 
GROUP BY key;
  • 如果数据量较小且 Reducer 数量过多,会生成大量小文件。


7. 使用 STORED AS SEQUENCEFILE 或 TEXTFILE

场景描述

  • 使用 SEQUENCEFILE 或 TEXTFILE 格式存储数据时,如果数据量较小,容易生成小文件。

示例

CREATE TABLE textfile_table (id INT,name STRING
) STORED AS TEXTFILE;
  • 如果插入的数据量较小,会生成小文件。


8. 使用 BUCKETING

场景描述

  • 使用分桶表时,如果分桶数设置过多且每个分桶的数据量较小,会导致生成小文件。

示例

CREATE TABLE bucketed_table (id INT,name STRING
) CLUSTERED BY (id) INTO 100 BUCKETS;
  • 如果数据量较小且分桶数过多,会生成大量小文件。


9. 使用 INSERT INTO 追加数据

场景描述

  • 使用 INSERT INTO 追加数据时,如果每次追加的数据量较小,会导致生成小文件。

示例

INSERT INTO TABLE example_table VALUES (1, 'Alice');
INSERT INTO TABLE example_table VALUES (2, 'Bob');
  • 每次插入都会生成一个小文件。


10. 使用 MERGE 或 UPDATE 操作

场景描述

  • 在支持 ACID 的 Hive 表中,使用 MERGE 或 UPDATE 操作时,可能会生成大量小文件。

示例

MERGE INTO acid_table AS target
USING source_table AS source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET target.name = source.name;
  • 每次更新操作可能会生成新的小文件。


小文件的危害

  1. NameNode 压力:

    • 小文件过多会占用大量 NameNode 内存,影响 HDFS 性能。

  2. 查询性能下降:

    • 小文件会增加 MapReduce 任务的启动开销,降低查询性能。

  3. 资源浪费:

    • 小文件会占用额外的存储空间和计算资源。


解决方法

  1. 合并小文件:

    • 使用 hive.merge.mapfiles 和 hive.merge.mapredfiles 参数自动合并小文件。

    • 示例:

      SET hive.merge.mapfiles = true;
      SET hive.merge.mapredfiles = true;
      SET hive.merge.size.per.task = 256000000; -- 256 MB
  2. 调整 Reduce 任务数:

    • 通过 hive.exec.reducers.bytes.per.reducer 参数控制每个 Reducer 处理的数据量。

    • 示例:

      SET hive.exec.reducers.bytes.per.reducer = 256000000; -- 256 MB
  3. 使用分区和分桶:

    • 合理设计分区和分桶策略,避免生成过多小文件。

  4. 定期合并小文件:

    • 使用 ALTER TABLE 命令或工具(如 hadoop fs -getmerge)定期合并小文件。

  5. 使用 ORC 或 Parquet 格式:

    • 列式存储格式(如 ORC、Parquet)具有更高的压缩率和查询性能,适合存储大规模数据


http://www.ppmy.cn/ops/165503.html

相关文章

推理大模型时代,TextIn ParseX助力出版业知识资产重构

在大语言模型(LLM)与推理能力快速进化的技术浪潮下,出版机构沉淀数十年的非结构化数据资产,包括书籍、期刊、手稿及历史档案,正在焕发新的机遇。基于文档解析、NLP与大模型的推理生成能力,我们在图书馆层层…

MyBatis - XML 操作动态 SQL

目录 1. 前言 2. 动态插入 2.1 if 标签 2.2 trim 标签 2.2.1 注解完成动态 SQL 3. 动态查询 3.1 添加 1 1 3.2 where 标签 4. 动态更新 4.1 set 标签 5. foreach 标签 6. sql 标签 & include 标签 1. 前言 之前博文所讲的 MyBatis SQL 操作, 都必须按照注解或…

LVS + Keepalived 高可用集群

一、LVSKeepalived 原理 1.1.LVS 负载均衡原理 LVS(Linux Virtual Server)是一种基于 Linux 内核的负载均衡技术,它通过 IPVS(IP Virtual Server)模块来实现。LVS 可以将客户端的请求分发到多个后端服务器上&#xf…

zerotier搭建免费moon服务器

🌟 前言 ZeroTier是一种基于P2P的虚拟组网工具,通过搭建‌Moon服务器‌可大幅提升跨运营商/跨国节点的连接质量。本文使用云服务演示部署流程。 📋 准备工作 ‌注册三丰云账号‌ ‌创建CentOS 8.5实例‌ (这里选择centos8以上&a…

[GHCTF 2025]GetShell

题目 <?php highlight_file(__FILE__);class ConfigLoader {private $config;public function __construct() {$this->config [debug > true,mode > production,log_level > info,max_input_length > 100,min_password_length > 8,allowed_actions &g…

Jupyter Notebook 全平台安装与配置教程(附Python/Anaconda双方案)

一、软件定位与特性 Jupyter Notebook 是交互式编程与数据科学分析工具&#xff0c;支持 40 编程语言&#xff0c;其基于浏览器的「代码块可视化」工作流&#xff0c;已成为机器学习、数据清洗、学术研究的标准环境。核心优势包括&#xff1a; 实时执行代码片段并保存结果支持…

重新认识OpenCV:C++视角下的历史演进、功能特性以及OpenCV 4.11新特性

&#xff08;基于2025年最新技术动态&#xff0c;面向工业级C开发者&#xff09; 一、OpenCV的历史迭代与技术定位 自1999年英特尔实验室诞生以来&#xff08;记住这个人-加里 布拉德斯基&#xff0c;是他怀揣着美好愿景启动了这个项目&#xff09;&#xff0c;OpenCV已成长…

推荐一些免费开源支持Vue3甘特图组件

文章目录 前言一、dhtmlxGantt二、frappe-gantt三、vue-ganttastic四、gantt-elastic五、v-gantt六、vue-gantt-schedule-timeline-calendar七、vue-gantt八、总结 前言 在现代项目管理和任务调度中&#xff0c;甘特图是一种非常实用的工具。它能够直观地展示任务的时间安排、…