除了retartition(放慢处理缓慢(以将所有1MB文件组合到多个大文件中,还有其他方法吗?
在500GB的数据上运行Spark Code,每个执行者24个内核,但将它们保存到具有128MB的大文件中。现在它将每个文件保存1 MB。
spark.sql("set pyspark.hadoop.hive.exec.dynamic.partition=true")
spark.sql("set pyspark.hadoop.hive.exec.dynamic.partition.mode=nonstrict")
spark.sql("set hive.exec.dynamic.partition=true")
spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
spark.sql("set hive.merge.tezfiles=true")
spark.sql("SET hive.merge.sparkfiles = true")
spark.sql("set hive.merge.smallfiles.avgsize=128000000")
spark.sql("set hive.merge.size.per.task=128000000")
option-1:
您可以在数据框架上进行.coalesce(n)
(不会发生混乱(,然后使用 .option("maxRecordsPerFile",n)
控制每个文件中写的记录的数量。
option-2:
使用 spark.sql.shuffle.partitions=n
此选项用于控制发生的散装次数。
然后使用 df.sort("<col_name>").write.etc
将精确创建我们提到的shuffle.partitions
的文件数。
option-3:
Hive:
一旦完成火花作业, trigger hive job
通过选择同一表并使用排序,分发,群集并设置您提到的所有蜂巢配置。
Insert overwrite table select * from table sort by <col1> distributed by <col2>
option-4:
Hive:
如果您有ORC表,请安排连接工作以定期运行
alter table <table_name> concatenate;
如果这些方法似乎都不是可行的解决方案,那么 .repartition(n)
将是要走的方法,因为这将带来额外的开销,但我们最终会〜均匀尺寸的文件在HDF中,并在从 hive/spark 的读取这些文件时提高性能。