我用胶水数据目录创建了一个EMR集群 . 当我调用spark-shell时,我能够成功地列出存储在Glue数据库中的表
spark.catalog.setCurrentDatabase("test")
spark.catalog.listTables
但是,当我通过 spark-submit
提交作业时,我收到致命错误
ERROR ApplicationMaster: User class threw exception: org.apache.spark.sql.AnalysisException: Database 'test' does not exist.;
我正在通过 spark-submit
via提交的作业中创建我的SparkSession
SparkSession.builder.enableHiveSupport.getOrCreate
4 回答
将
hive.metastore.client.factory.class
配置添加到启动spark会话的代码中为我解决了这个问题:这是在aws docs(https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html)中定义的相同配置,并在创建群集时检查
Use for Hive table metadata
时添加到群集配置中,但由于某种原因,dosn 't work as expected (I' m使用emr 5.12.0) .我遇到了同样的问题:
spark-submit
不会发现AWS Glue库,但是在主节点上工作的spark-shell
会 .事实证明我的
spark-submit
作业使用了一个使用标准org.apache.spark
和org.apache.hive
库编译的胖.jar
. 正在使用jar库而不是EMR
上安装的自定义类 . 如果是这种情况,请务必排除所有:这是我用于
.Gradle
的参考:http://unethicalblogger.com/2015/07/15/gradle-goodness-excluding-depends-from-shadow.html .在所有火花库前添加
compileOnly
关键字修复它 .我们的问题是EMR集群的IAM权限;确保集群IAM实例配置文件具有对粘合的完全访问权限 .
EMR 5.9.0刚刚发布 - 请试一试,它应该适合你 .
相关文件:
http://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-components.html
http://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html