这些是你可以考虑的点......
1) maxRecordsPerFile 设置:
有
my_table.write.parquet(s3path)
Spark 为每个任务写入一个文件。
保存的文件数=正在保存的RDD/Dataframe的分区数。因此,这可能会导致文件大得离谱(当然,您可以重新分区数据并保存重新分区意味着跨网络打乱数据。)。
限制每个文件的记录数
my_table.write.option("maxRecordsPerFile", numberOfRecordsPerFile..yourwish).parquet(s3path)
可以避免生成大文件。
2) 如果您使用的是 AWS Emr (Emrfs),这可能是您可以考虑的要点之一。
emr-spark-s3-optimized-committer
未使用 EMRFS S3 优化的 Committer 时:
- 使用 S3A 文件系统时。
- 使用 Parquet 以外的输出格式时,例如 ORC 或文本。
3) 使用压缩技术、算法版本和其他 spark 配置:
.config("spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version", 2)
.config("spark.hadoop.mapreduce.fileoutputcommitter.cleanup-failures.ignored", true)
.config("spark.hadoop.parquet.enable.summary-metadata", false)
.config("spark.sql.parquet.mergeSchema", false)
.config("spark.sql.parquet.filterPushdown", true) // for reading purpose
.config("mapreduce.fileoutputcommitter.algorithm.version", "2")
.config("spark.sql.parquet.compression.codec", "snappy")
.getOrCreate()
4) 快速上传和其他道具,以防您使用 s3a:
.config("spark.hadoop.fs.s3a.fast.upload","true")
.config("spark.hadoop.fs.s3a.fast.upload","true")
.config("spark.hadoop.fs.s3a.connection.timeout","100000")
.config("spark.hadoop.fs.s3a.attempts.maximum","10")
.config("spark.hadoop.fs.s3a.fast.upload","true")
.config("spark.hadoop.fs.s3a.fast.upload.buffer","bytebuffer")
.config("spark.hadoop.fs.s3a.fast.upload.active.blocks","4")
.config("fs.s3a.connection.ssl.enabled", "true")