我正在尝试通过遵循以下概述的步骤来启用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
的引用,这向我暗示应该向集群提供此信息。
答案 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优化的提交器部分
必须遵守。