Spark高手必备技巧:如何有效减少小文件数量

作者 : admin 本文共931个字,预计阅读时间需要3分钟 发布时间: 2024-06-10 共3人阅读

如何减少小文件 📁

目前手动减少的简单方式分写Hive和写Iceberg两种情况讨论:


SQL 和 Hive 表
  1. 开启AQE,自适应执行开启,通常不需要配置
    spark.sql.adaptive.enabled=true
    
  2. 开启优化项
    spark.sql.optimizer.insertRepartitionBeforeWrite.enabled=true
    
  3. 合并分区的大小设大点,例如 1G,通常不需要配置
    spark.sql.adaptive.coalescePartitions.minPartitionNum=1
    
  4. 默认分区大小,例如 256M
    spark.sql.adaptive.advisoryPartitionSizeInBytes=64M
    

SQL 和 Iceberg表 🍦

iceberg可以开启自动小文件合并,除此之外的手动合并:

  1. RDD 手动 repartition 或者 coalesce ⚙️
rdd.repartition(100)
rdd.coalesce(100)

repartitioncoalesce 的区别是 repartition 会产生 shuffle,coalesce 不会。repartition 可能造成 shuffle 失败和空间重复,coalesce 则可能导致原有计算逻辑的并行度被改变。例如:

reduceByKey(key).coalesce(10) //reduceByKey 的并行度被改为 10,需要详细评估使用

2.SQL 中使用 Hint 🧠

方式一:
insert into sinkTable
select /*+ REPARTITION(3, col) */ * from sourceTable
  1. hint开头/*+ 注意是连续的,不要写错,例如 错误写法 /* + REPARTITION(3) */
  2. repartition第一个参数是期望的分区数,第二个是分区的列名,通常是join的key或者常用的filter条件。
方式二(不推荐):
insert into sinkTable select * from sourceTable distribute by cast(rand() * 100 as int)

这种方式不推荐,因为打的分区不均匀,而且可能导致压缩程度不理想。


#数据处理 #大数据 #Spark #分区优化 #编程技巧 #数据分析 #小文件处理

本站无任何商业行为
个人在线分享 » Spark高手必备技巧:如何有效减少小文件数量
E-->