找不到 EmrOptimizedSparkSqlParquetOutputCommitter

EmrOptimizedSparkSqlParquetOutputCommitter not found

我正尝试按照以下概述的步骤启用 EmrOptimizedSparkSqlParquetOutputCommitter:

https://docs.amazonaws.cn/en_us/emr/latest/ReleaseGuide/emr-spark-committer-reqs.html

我正在使用 EMR 版本 5.23.0

我根据文档设置了以下配置选项(明确说明了配置值,尽管有些是默认值):

.config("spark.sql.hive.convertMetastoreParquet", "true")
.config("spark.sql.parquet.output.committer.class", "com.amazon.emr.committer.EmrOptimizedSparkSqlParquetOutputCommitter")
.config("spark.sql.sources.commitProtocolClass", "org.apache.spark.sql.execution.datasources.SQLHadoopMapReduceCommitProtocol")
.config("spark.sql.sources.partitionOverwriteMode", "static")
.config("spark.sql.parquet.fs.optimized.committer.optimization-enabled", "true")

并在我的 spark (scala) 应用程序中具有以下依赖项

"com.amazonaws" % "aws-java-sdk" % "1.11.598" % "provided"
"com.amazonaws" % "aws-java-sdk-s3" % "1.11.598"

但是在部署应用程序时出现以下错误:

java.lang.RuntimeException: 
java.lang.ClassNotFoundException: 
Class com.amazon.emr.committer.EmrOptimizedSparkSqlParquetOutputCommitter not found

我无法在任何地方找到该提交者所在库的引用。因此,我猜测它存在于上述 aws java sdk 依赖项之一中。我缺少依赖项吗?此外,spark 应用程序是否是提供此提交者 class 的正确位置?谢谢!

编辑:

还尝试按照@Lamanus 的建议添加 aws-java-sdk-emr 依赖项,但抛出相同的错误。

我遇到了https://github.com/aws/aws-sdk-java,幸运的是java sdk 是开源的。我没有看到对 EmrOptimizedSparkSqlParquetOutputCommitter 的引用,这向我建议应该将 to/by 集群提供。

问题出在远程 EC2 实例向 EMR 主机提交的 spark 作业中。

必须进行 3 项更改才能启用提交程序:

  • /usr/lib/spark/jars/hadoop* 的 EMR 主机上的 jars 需要复制到 /opt/spark/jars 的远程实例。特别是后缀为 -amzn.

  • 的 hadoop 罐子
  • 需要将 /etc/spark/conf 下的 EMR Master 实例中的所有文件复制到 /etc/spark/conf 上的远程实例。这些文件包括 EMR 主节点 IP,否则文件的其余内容是可预测和可模板化的。

  • 最后,我们必须确保我们使用的 Linux OS 用户名可以访问 HDFS。对于我们来说,这需要将 HADOOP_USER_NAME 从 spark 更改为 hadoop

我们在 EMR 集群配置中看到这些变化:

**EMRFS consistent view:** Enabled

为了利用 EmrOptimizedSparkSqlParquetOutputCommitter,防止 _temporary 目录最初被写入 S3,当未使用 EMRFS S3 优化提交器时 部分Requirements for the EMRFS S3-Optimized Committer 必须遵守。

class可以在jar中找到:/usr/share/aws/emr/goodies/lib/emr-spark-goodies-$version.jar