找不到EmrOptimizedSparkSqlParquetOutputCommitter

时间:2019-07-29 10:28:39

标签: scala amazon-emr aws-java-sdk

我正在尝试通过遵循以下概述的步骤来启用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应用程序是提供此提交者类的正确位置吗?谢谢!

修改

也尝试按照@Lamanus的建议添加aws-java-sdk-emr依赖项,但会引发相同的错误。

我遇到过https://github.com/aws/aws-sdk-java,幸运的是Java SDK是开源的。我看不到对EmrOptimizedSparkSqlParquetOutputCommitter的引用,这向我暗示应该向集群提供此信息。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

必须进行3处更改才能启用提交者:

  • EMR主节点/usr/lib/spark/jars/hadoop*上的jar需要复制到/opt/spark/jars的远程实例。特别是带有-amzn的hadoop jars。

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

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

有了这些更改,我们在EMR群集配置中看到了

**EMRFS consistent view:** Enabled

要利用EmrOptimizedSparkSqlParquetOutputCommitter,防止将_temporary目录最初写入S3,请在Requirements for the EMRFS S3-Optimized Committer不使用EMRFS S3优化的提交器部分  必须遵守。