SparkSQL小文件的处理方式(选第三种方式即可解决)

自适应执行

社区在Spark2.3版本之后的AdaptiveExecute特性之中就能很好的解决Partition个数过多导致小文件过多的问题. 通过动态的评估Shuffle输入的个数(通过设置spark.sql.adaptive.shuffle.targetPostShuffleInputSize实现), 可以聚合多个Task任务, 减少Reduce的个数 。

使用方式:

set spark.sql.adaptive.enabled=true
set spark.sql.adaptive.shuffle.targetPostShuffleInputSize=128MB

优点:

  • 自动根据任务的数据量进行聚合
    缺点:
  • 必须存在Shuffle过程, 否则不生效
  • 任务的Shuffle输出比不能太低

Shuffle输出比, 为一个Shuffle任务中最后Output的数据量除以ShuffleRead的数据量的数值。如果ShuffleRead为100GB, 而输出为1GB, 那么Shuffle输出比为1%. 如果这值比较低,说明Task之中有很高强度的Filter功能. 这个数值太低会对系统产生比较大影响, 例如每个Shuffle块为128MB,
如果输出比为10%, 那么最后在HDFS之中只有12.8MB, 就如会出现小文件问题. 因此动态执行功能并不会对此产生太大的效果. 现实中, 由于SparkSQL已经有比较高效的FilterPushDown功能, 因此这个比例不太太高, 在20%以上.

HINT方式

社区在Spark2.4版本之后引入HINT模式SPARK-24940, 可以由用户来指定最后分区的个数, 只要在SQL语句之中加入注释文件。

使用方式:

INSERT ... SELECT /*+ COALESCE(numPartitions) */ ...
INSERT ... SELECT /*+ REPARTITION(numPartitions) */ ...

优点:

  • 支持简单无Shuffle模式的Reparation
    缺点:
  • 需要人工干预, 设计Partition的个数, 而对于变化的场景来说, 难有一个固定的Partition个数无法处理Shuffle输出比过低的场景。

独立的小文件合并

综上所诉两个方案都无法处理Shuffle输出比过低的场景, 因此我们需要一种兜底方案: 直接读取HDFS上的数据, 进行合并操作。 当插入任务完成之后, 新启动一个Job读取所有的数据, 然后根据设置的文件大小, 进行合并并会写到HDFS之中. 由于是直读直写的方式, 因此对于数据大小的评估是非常精确的, 因此可以很好的避免Shuffle输出比的问题.
优点:
彻底解决小文件问题
缺点:
引入新的一次Job过程, 性能会受影响, 特别对中型任务会有一定的影响(10秒左右)
使用方式:

set spark.sql.merge.enabled=true;
set spark.sql.merge.size.per.task=134217728; --128 * 1024 * 1024 bytes

性能优化: ORC和Parquet格式支持按行读取和按Stripe读取, Stripe读取可以认为是GroupRead, 由于不需要解析文件里面具体的数值, 因此可以按照Stripe粒度读取文件, 再写入文件之中, 以Stripe粒度合并文件。

set spark.sql.merge.mode=fast; -- 默认是pretty, 是逐行读写文件的, 性能较慢

fast模式目前只针对ORC格式做了优化性能较快, 其他格式会额外引入一次任务, 尤其在动态分区场景下, 性能会下降不少

【SparkSQL小文件的处理方式】相关推荐

  1. Hive合并小文件参数总结

    hive merge小文件 一:为什么要合并小文件 当Hive输入由很多个小文件组成,由于每个小文件都会启动一个map任务,如果文件过小,以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资 ...

  2. hive优化处理大量小文件

    一.hive小文件 Hive的数据存储在HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量.HDFS主要分为NameNode,DataNode, ...

  3. Hive Distribute by 应用之动态分区小文件过多问题优化

    目录 0 问题现象及原因分析 1 问题解决 解决办法 2 由以上问题引出的问题 3 思考 4 小结 0 问题现象及原因分析 现象: [Error 20004]: Fatal error occurre ...

  4. 代达罗斯之殇-大数据领域小文件问题解决攻略

    : 点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多惊喜 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据 ...

  5. spark 实现HDFS小文件合并

    一.首先使用sparksql读取需要合并的数据.当然有两种情况, 一种是读取全部数据,即需要合并所有小文件. 第二种是合并部分数据,比如只查询某一天的数据,只合并某一个天分区下的小文件. val df ...

  6. HIVE 生成过多小文件的问题

    HIVE 生成大量小文件 小文件的危害 为什么会生成多个小文件 不同的数据加载方式生成文件的区别 解决小文件过多的问题 今天运维人员突然发来了告警,有一张表生成的小文件太多,很疑惑,然后排查记录了下 ...

  7. Apache Iceberg小文件处理和读数流程分析

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 全网最全大数据面试提升手册! 第一部分:Spark读取Iceberg流程分析 这个部分我们分析常规 ...

  8. HDFS小文件问题及解决方案

    1.  概述 小文件是指文件size小于HDFS上block大小的文件.这样的文件会给hadoop的扩展性和性能带来严重问题.首先,在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储 ...

  9. winfrom里面使用类似于table的合并的控件_Flink集成iceberg数据湖之合并小文件

    背景 使用 流式数据入湖 开启压缩程序 快照过期 删除无用文件 数据查询 遇到的坑 最大并发度问题 文件被重复压缩 扫描任务读取文件问题 不读取大文件 优化生成CombinedScanTask 后续问 ...

最新文章

  1. matlab中ss函数_matlab ss函数 tf函数
  2. Android菜单详解——理解android中的Menu
  3. linux下的连接文件——软连接和硬连接的区别
  4. 重构改善既有代码的设计是php,下篇 |《重构 改善既有代码的设计—笔记》| PHP 技术论坛...
  5. 显示和隐藏系统任务栏的类
  6. mysql text查找性能_MySQL TEXT字段性能
  7. 英文求职信计算机网络,计算机网络专业毕业生英文求职信.doc
  8. 计算机护理职称考试报名时间2015,护理职称考试怎么报名?
  9. js关闭setInterval及终止ajax请求
  10. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)转载自码农网
  11. MFC做一个简易的登录界面
  12. python第三方库官方文档汇总
  13. 浅谈数据指标以及指标体系
  14. lwip协议栈在linux运行,一种轻量级的TCP_IP协议栈LwIP在嵌入式系统中的应用
  15. Kindle DXG的一些使用方法及技巧
  16. STM32 IO 简介
  17. 单核浏览器和双核浏览器有什么区别,哪个好用?
  18. 用AI视觉芯片打造舱内舱外全开放解决方案
  19. K8S中的pod、services、容器的概念和区别
  20. 2023中国矿业大学计算机考研信息汇总

热门文章

  1. c语言程序设计第二版(张磊),C语言程序设计教程(第2版) 教学课件 张磊 第1章 程序设计概述.pdf...
  2. 在线视频播放网站服务器配置,在线播放视频网站应该如何选择服务器
  3. 关于汽车遥控器芯片EV1527的研究
  4. 【Ubuntu】安装Adobe Acrobat
  5. Altair Activate 2021.1 x64
  6. 我还能从中国男子足球队得到快乐吗?
  7. Excel 之 VBA 入门学习(一)宏与 VBA ,使用技巧
  8. IP地址,子网,掩码的计算
  9. 联通3G APN设置
  10. 使用 deeplabv3+ 训练自己的数据集经验总结