在写入S3时,Spark 2.3引入的动态分区似乎不适用于AWS的EMR 5.13.0
执行时,会在S3中创建一个临时目录,但是一旦完成该过程就会消失,而不会将新数据写入最终文件夹结构。
在EMR 5.13.0上执行Scala / Spark 2.3应用程序时发现了该问题。
配置如下:
var spark = SparkSession
.builder
.appName(MyClass.getClass.getSimpleName)
.getOrCreate()
spark.conf.set("spark.sql.sources.partitionOverwriteMode","DYNAMIC") // also tried "dynamic"
写入S3的代码:
val myDataset : Dataset[MyType] = ...
val w = myDataset
.coalesce(10)
.write
.option("encoding", "UTF-8")
.option("compression", "snappy")
.mode("overwrite")
.partitionBy("col_1","col_2")
w.parquet(s"$destinationPath/" + Constants.MyTypeTableName)
目标路径是S3存储桶/文件夹
其他人都遇到过这个问题?
升级到EMR 5.19可以解决问题。但是我之前的回答是不正确的 - 使用EMRFS S3优化的Committer与它无关。当spark.sql.sources.partitionOverwriteMode设置为dynamic时,将静默跳过EMRFS S3优化的Committer:https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-committer-reqs.html
如果您可以升级到至少EMR 5.19.0,AWS的EMRFS S3优化提交器可以解决这些问题。
--conf spark.sql.parquet.fs.optimized.committer.optimization-enabled=true
见:https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3-optimized-committer.html