带有AWS Glue的Spark Catalog:未找到数据库

时间:2017-09-19 03:29:37

标签: apache-spark amazon-emr aws-glue

我创建了一个带有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
SparkSession.builder.enableHiveSupport.getOrCreate

4 个答案:

答案 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作业使用了使用标准.jarorg.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)