Spark 2.3动态分区不适用于S3 AWS EMR 5.13.0

Dav*_*lla 7 scala amazon-s3 bigdata amazon-emr apache-spark

在写入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"
Run Code Online (Sandbox Code Playgroud)

写入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)
Run Code Online (Sandbox Code Playgroud)

的DestinationPath是一个S3桶/文件夹

其他人都遇到过这个问题?

小智 1

升级到 EMR 5.19 修复了该问题。然而,我之前的答案是不正确的 - 使用 EMRFS S3 优化的提交器与此无关。当 Spark.sql.sources.partitionOverwriteMode 设置为动态时,EMRFS S3 优化的提交器将被静默跳过: https: //docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-committer-reqs.html

如果您可以升级到至少 EMR 5.19.0,AWS 的 EMRFS S3 优化的 Committer 可以解决这些问题。

--conf spark.sql.parquet.fs.optimized.committer.optimization-enabled=true

请参阅: https: //docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3-optimized-committer.html