理解大数据处理过程中的小文件问题

相信很多开发都知道这个问题,看文章,看博客都有了解过。但是如果让你自己讲,能不能从头到尾讲明白原理和对应的解决方案呢?

这个小文件是怎么产生的?就一句话,spark处理完数据输出时,一个分区一个文件写到了hdfs上。

那怎么说这个小文件呢?每个文件的存储小于128M,实际上大部分是几kb。

这就很浪费呀,一个块128M,你给我只存几k?然后Namenode开始骂骂咧咧~~~~

言归正传,下面咱们开始唠唠:

1、在Spark处理数据时,如果未对中间结果或最终输出进行合并处理,每个RDD分区的数据将被写入单独的文件中,导致HDFS上可能生成大量小文件。
2. 大量小文件会降低HDFS存储效率和NameNode内存利用率,增加元数据管理负担,以及影响后续读取操作的I/O性能。
3. 为解决这一问题,Spark提供了诸如`coalesce()`或`repartition()`等API来调整分区数,并结合`DataFrameWriter`的`bucketBy`、`sortBy`及`saveAsTable`等方法,实现数据聚合与大文件输出,从而有效减少小文件的数量。

那如果控制小文件的产生呢?

在Spark中,减少shuffle阶段之前小文件产生的主要策略包括:

1. **合并分区(Repartitioning)**:
   在进行shuffle操作前,可以使用`repartition()`或`coalesce()`方法来调整RDD的分区数。通过将数据重新分布到更少但更大的分区中,可以在shuffle过程中减少最终写入HDFS的小文件数量。

   - `repartition()`会重新创建指定数量的分区,并可能触发一个完整的数据 Shuffle。
   - `coalesce()`则可以在减少分区数时尽量避免全量 Shuffle,但如果需要增加分区数,则同样会触发 Shuffle。

2. **批量写入与压缩**:
   使用批量写入机制,在聚合或者reduce操作完成后,一次性写出较大的结果文件而不是逐条写出。同时启用数据压缩选项,如Snappy、Gzip等,以减小单个文件的实际大小,即使分区较多也能有效控制物理文件的数量。

3. **自定义Partitioner**:
   设计合理的自定义Partitioner,确保数据在Shuffle时能均匀分布并尽可能地聚集在一起,从而在写入磁盘时生成较少的大文件。

4. **增大块大小**:
   如果是在Hadoop HDFS层面,可以考虑适当增大HDFS的块大小设置,使得每个数据块能够存储更多的记录,间接减少因为分区而产生的小文件数量。

5. **提前合并处理**:
   对于源头就包含大量小文件的数据源,可以预先执行合并操作,例如在加载数据到Spark之前,先利用MapReduce或Spark作业将小文件合并为大文件。

6. **采用数据湖技术**:
   使用支持小文件自动合并特性的数据湖解决方案,如Delta Lake或Apache Hudi,它们提供了事务性和管理小文件的功能。

在Apache Spark中,`coalesce()`算子也可以用来减少RDD或DataFrame的分区数,但它与`repartition()`有所不同:

1. **减小分区数**:`coalesce()`可以将数据集的分区数量缩小到一个较小的值,而不需要进行全量shuffle。这意味着它会尽量重用现有的分区数据,尽可能地保持数据本地性,从而减少网络传输开销。

2. **保持分区顺序(部分情况)**:如果只是少量减少分区数,`coalesce()`可能会保留分区内部的数据顺序(但这不是绝对保证的,具体取决于Spark实现和执行计划)。

3. **增加分区数受限**:但是,当你需要增加分区数时,`coalesce()`就不是一个合适的选择,因为它不支持通过增加分区数来触发shuffle。

因此,在考虑是否手动触发shuffle时:
- 如果你想要减少分区数,并且希望操作相对轻量级、避免全量shuffle,可以选择使用`coalesce()`。
- 如果你需要重新分布数据以达到特定的分区策略(比如均衡数据大小),或者需要增加分区数以便更好地并行处理数据,则应该使用`repartition()`,因为它会强制进行shuffle操作。

最最最后:在Spark作业即将写入HDFS时,减少小文件的策略可以包括以下几种:

  • 使用repartition()coalesce()方法重新组织数据分布。通过增大目标分区数,使得每个分区包含更多的数据量,从而减少最终输出的小文件数量。但要注意,增加分区会导致额外的shuffle操作和资源消耗。
  • 在写入HDFS之前,设置合理的批次大小(例如使用DataFrameWriteroption("maxRecordsPerFile", num_records)),确保每次写入的数据量足够大。
  • 启用数据压缩,这可以在减小文件大小的同时减少物理文件的数量。
    df.write.mode("overwrite").format("parquet").option("compression", "gzip")  # 或其他压缩算法.save(path_to_hdfs)

    Spark SQL中减少小文件生成的方法

  • 使用coalesce()repartition()函数来重新调整DataFrame的分区数,确保每个分区包含足够的数据量。repartition()会触发一个全shuffle操作,而coalesce()则可能不会增加分区数而是合并现有分区,因此需根据实际场景选择合适的函数。
  • -- 在SQL中可通过创建视图的方式实现
    CREATE OR REPLACE TEMPORARY VIEW repartitioned_data AS
    SELECT * FROM original_table
    REPARTITION(num_partitions);

    待补充~~~~~~~~~~~~

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

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

相关文章

CMake和VsCode调试的使用

目录 CMake使用 CMake下载 创建系统文件目录 MakeList编写规范 VsCode启动调试 添加配置文件 添加断点,启动调试 CMake使用 CMake下载 输入指令 sudo apt install cmake 安装cmake,使用 cmake -version可查看cmake的版本信息 创建系统文件目…

土耳其商务团一行莅临优积科技考察交流

7月31日土耳其商务代表Emre Arif Parlak等一行三人莅临优积科技考察交流,公司CEO刘其东携团队成员热情接待并深入交流。 商务团首先参观了我司产品生产基地,详细了解了钢结构模块的生产加工工艺流程和质量控制体系。随后参观了我司模块化学校样板房、模块…

Python-语句

一、if语句 格式 if 条件: 条件成立执行的代码 if True:print(条件成立执行的代码) print(这个代码执行吗?)上述代码两个print均执行 if False:print(条件成立执行的代码) print(这个代码执行吗?)只执行第二个print 2.总结 对于未缩进的代码&#x…

Git+py+ipynb Usage

0.default config ssh-keygen -t rsa #之后一路回车,当前目录.ssh/下产生公私钥 cat ~/.ssh/id_rsa.pub #复制公钥到账号 git config --global user.email account_email git config --global user.name account_namebug of ipynb TqdmWarning: IProgress not found. Please …

Springboot日常总结-@RestController和@Controller的区别

RestController和 Controlle是两种不同的控制器实现,它们的主要区别在于如何处理返回的数据和是否支持跳转到视图页面。 Controller 是一个基本的控制器注解,它允许你将一个类标记为一个Spring MVC控制器处理器。使用 Controller 的类中的方法可以直接返…

c++学习记录 string容器—字符串比较

比较方式&#xff1a; 字符串比较是按照字符的ASCII码进行对比 返回 0> 返回 1< 返回 -1 函数原型&#xff1a; int compare(const string& s) const; //与字符串s比较int compare(const char* s) const; //与字符串s比较 #include<iostream> using name…

一文1400字使用Jmeter进行http接口测试【建议收藏】

前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。 一、开发接口…

【JavaSE】集合框架

目录 程序场景分析 Java集合框架包含的内容List接口ArrayListLinkedListList接口的常用方法ArrayList案例背景分析代码示例扩展以下功能代码示例 LinkedList案例背景分析代码示例LinkedList的特殊方法 ArrayList与LinkedList对比 Set接口HashSet 集合的特点常用方法案例背景分析…

[c 语言] 大端,小端;网络序,主机序

在网络编程中&#xff0c;特别是底层网卡驱动开发时&#xff0c;常常遇到字节序问题。字节序指的是多字节数据类型在内存中存放的顺序&#xff0c;高位保存在低地址还是高地址&#xff0c;以此来划分大端还是小端。 1 大端和小端 大端和小端指的是 cpu 的属性&#xff0c;常见…

Vulhub 靶场训练 DC-9解析

一、搭建环境 kali的IP地址是&#xff1a;192.168.200.14 DC-9的IP地址暂时未知 二、信息收集 1、探索同网段下存活的主机 arp-scan -l #2、探索开放的端口 开启端口有&#xff1a;80和22端口 3、目录扫描 访问80 端口显示的主页面 分别点击其他几个页面 可以看到是用户…

SpringBoot源码解读与原理分析(三十四)SpringBoot整合JDBC(三)声明式事务的传播行为控制

文章目录 前言10.5 声明式事务的传播行为控制10.5.1 修改测试代码&#xff08;1&#xff09;新建一个Service类&#xff0c;并引用UserService&#xff08;2&#xff09;修改主启动类 10.5.2 PROPAGATION_REQUIRED10.5.2.1 tm.getTransaction&#xff08;1&#xff09;获取事务…

一拖二ADG数据库拆除其中一个复制关系

一、备库一操作 1、检查 select name,open_mode,switchover_status,database_role from v$database; select group#,thread#,status from v$standby_log; select thread#,sequence#,first_time,next_time,applied from v$archived_log where thread#1 order by 4; select …

用于自监督视觉预训练的屏蔽特征预测

Masked Feature Prediction for Self-Supervised Visual Pre-Training 一、摘要 提出了用于视频模型自监督预训练的掩模特征预测&#xff08;MaskFeat&#xff09;。首先随机屏蔽输入序列的一部分&#xff0c;然后预测屏蔽区域的特征。研究了五种不同类型的特征&#xff0c;发…

netfilter内核实现

Netfilter是Linux内核中的一个框架&#xff0c;用于实现数据包的过滤、NAT(Network Address Translation)、连接追踪以及其他网络功能。Netfilter框架的主要实现包括如下几个部分&#xff1a; 钩子函数&#xff08;Hooks&#xff09;&#xff1a;Netfilter框架在Linux内核中通…

遥感、航拍、影像等用于深度学习的数据集集合

遥感图像的纹理特征异常繁杂&#xff0c;地貌类型多变&#xff0c;人工提取往往存在特征提取困难和特征提取不准确的问题&#xff0c;同时&#xff0c;在这个过程中还会耗费海量的人力物力。随着计算力的突破、数据洪流的暴发和算法的不断创新&#xff0c;在具有鲜明“大数据”…

我们的C++(基础)(中文翻译版)

什么是C&#xff1f; C是一种高级语言。它由 Bjarne Stroustrup 于 1979 年在贝尔实验室设计和开发。C 是一种面向对象的编程语言&#xff0c;它扩展和改进了 C 语言。C 可在各种平台上运行&#xff0c;例如 Windows、MAC 操作系统和 UNIX 版本。 C 是一种静态类型、编译、通…

ffmpeg的pcm、yuv小知识点

ffmpeg的pcm、yuv小知识点 pcm、yuv保存调用&#xff0c;写个通用工具方法&#xff0c;平时快速保存&#xff0c;和调用方便查看自己bug ffmpeg的AVFrame存储 yuv 调用方法 保存方法 void save_yuv420p_file(unsigned char *y_buf , unsigned char *u_buf,unsigned char *…

git commit 后,本地远端都没有记录,消失不见

今天git commit 之后发现远端没有记录&#xff0c;本地没有最新代码记录 git commit 后&#xff0c;提交记录会消失不见的原因可能是&#xff1a; git只git commit了&#xff0c;没有push到远程分支&#xff0c;切换到其他分支时丢失。而且看不到提交记录&#xff0c;和找不到…

美团2024届秋招笔试第一场编程真题——小美的字符串变换

小美拿到了一个长度为n的字符串&#xff0c;她希望将字符串从左到右平铺成一个矩阵&#xff08;先平铺第一行&#xff0c;然后是第二行&#xff0c;以此类推&#xff0c;矩阵有x行y列&#xff0c;必须保证x∗yn&#xff0c;即每y个字符换行&#xff0c;共x行&#xff09;。 该…

2024.2.21 模拟实现 RabbitMQ —— 实现转发规则

目录 需求分析 直接交换机&#xff08;Direct &#xff09; 主题交换机&#xff08;Topic &#xff09; 扇出交换机&#xff08;Fanout &#xff09; Topic 交换机转发规则 routingKey 组成 bindingKey 组成 匹配规则 情况一 情况二 情况三 实现 Router 类 校验 b…