【SparkSQL小文件的处理方式】
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小文件的处理方式】相关推荐
- Hive合并小文件参数总结
hive merge小文件 一:为什么要合并小文件 当Hive输入由很多个小文件组成,由于每个小文件都会启动一个map任务,如果文件过小,以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资 ...
- hive优化处理大量小文件
一.hive小文件 Hive的数据存储在HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量.HDFS主要分为NameNode,DataNode, ...
- Hive Distribute by 应用之动态分区小文件过多问题优化
目录 0 问题现象及原因分析 1 问题解决 解决办法 2 由以上问题引出的问题 3 思考 4 小结 0 问题现象及原因分析 现象: [Error 20004]: Fatal error occurre ...
- 代达罗斯之殇-大数据领域小文件问题解决攻略
: 点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多惊喜 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据 ...
- spark 实现HDFS小文件合并
一.首先使用sparksql读取需要合并的数据.当然有两种情况, 一种是读取全部数据,即需要合并所有小文件. 第二种是合并部分数据,比如只查询某一天的数据,只合并某一个天分区下的小文件. val df ...
- HIVE 生成过多小文件的问题
HIVE 生成大量小文件 小文件的危害 为什么会生成多个小文件 不同的数据加载方式生成文件的区别 解决小文件过多的问题 今天运维人员突然发来了告警,有一张表生成的小文件太多,很疑惑,然后排查记录了下 ...
- Apache Iceberg小文件处理和读数流程分析
点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 全网最全大数据面试提升手册! 第一部分:Spark读取Iceberg流程分析 这个部分我们分析常规 ...
- HDFS小文件问题及解决方案
1. 概述 小文件是指文件size小于HDFS上block大小的文件.这样的文件会给hadoop的扩展性和性能带来严重问题.首先,在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储 ...
- winfrom里面使用类似于table的合并的控件_Flink集成iceberg数据湖之合并小文件
背景 使用 流式数据入湖 开启压缩程序 快照过期 删除无用文件 数据查询 遇到的坑 最大并发度问题 文件被重复压缩 扫描任务读取文件问题 不读取大文件 优化生成CombinedScanTask 后续问 ...
最新文章
- matlab中ss函数_matlab ss函数 tf函数
- Android菜单详解——理解android中的Menu
- linux下的连接文件——软连接和硬连接的区别
- 重构改善既有代码的设计是php,下篇 |《重构 改善既有代码的设计—笔记》| PHP 技术论坛...
- 显示和隐藏系统任务栏的类
- mysql text查找性能_MySQL TEXT字段性能
- 英文求职信计算机网络,计算机网络专业毕业生英文求职信.doc
- 计算机护理职称考试报名时间2015,护理职称考试怎么报名?
- js关闭setInterval及终止ajax请求
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)转载自码农网
- MFC做一个简易的登录界面
- python第三方库官方文档汇总
- 浅谈数据指标以及指标体系
- lwip协议栈在linux运行,一种轻量级的TCP_IP协议栈LwIP在嵌入式系统中的应用
- Kindle DXG的一些使用方法及技巧
- STM32 IO 简介
- 单核浏览器和双核浏览器有什么区别,哪个好用?
- 用AI视觉芯片打造舱内舱外全开放解决方案
- K8S中的pod、services、容器的概念和区别
- 2023中国矿业大学计算机考研信息汇总
热门文章
- c语言程序设计第二版(张磊),C语言程序设计教程(第2版) 教学课件 张磊 第1章 程序设计概述.pdf...
- 在线视频播放网站服务器配置,在线播放视频网站应该如何选择服务器
- 关于汽车遥控器芯片EV1527的研究
- 【Ubuntu】安装Adobe Acrobat
- Altair Activate 2021.1 x64
- 我还能从中国男子足球队得到快乐吗?
- Excel 之 VBA 入门学习(一)宏与 VBA ,使用技巧
- IP地址,子网,掩码的计算
- 联通3G APN设置
- 使用 deeplabv3+ 训练自己的数据集经验总结