我创建了一个带有Glue Data目录的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
通过
SparkSession.builder.enableHiveSupport.getOrCreate
答案 0 :(得分:5)
将hive.metastore.client.factory.class
配置添加到启动spark会话的代码中为我解决了这个问题:
SparkSession spark = SparkSession.builder()
...
.config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory")
.enableHiveSupport()
.getOrCreate();
这是在aws docs(https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html)中定义的相同配置,并在创建群集时检查Use for Hive table metadata
时添加到群集配置中,但由于某种原因,不能按预期工作(我正在使用emr 5.12.0)。
答案 1 :(得分:1)
我遇到了同样的问题:spark-submit
不会发现AWS Glue库,但spark-shell
将在主节点上工作。
事实证明,我的spark-submit
作业使用了使用标准.jar
和org.apache.spark
库编译的胖org.apache.hive
。正在使用jar库而不是EMR
上安装的自定义类。
如果是这种情况,请务必排除所有:
' org.apache.spark:' ' org.apache.hive:' ' org.apache.hadoop:'来自您的模块
.jar
以下是我用于.Gradle
的参考:http://unethicalblogger.com/2015/07/15/gradle-goodness-excluding-depends-from-shadow.html。
在所有火花库前添加compileOnly
关键字修复它。
答案 2 :(得分:1)
我们的问题是EMR集群的IAM权限;确保集群IAM实例配置文件具有对粘合的完全访问权限。
答案 3 :(得分:0)