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

aut*_*con 2 amazon-emr apache-spark aws-glue

Ive使用Glue Data目录创建了一个EMR集群。调用spark-shell时,我可以通过以下方式成功列出存储在Glue数据库中的表:

spark.catalog.setCurrentDatabase("test")
spark.catalog.listTables
Run Code Online (Sandbox Code Playgroud)

但是,当我通过提交工作时spark-submit出现致命错误

ERROR ApplicationMaster: User class threw exception: org.apache.spark.sql.AnalysisException: Database 'test' does not exist.;
Run Code Online (Sandbox Code Playgroud)

我创建工作中我SparkSession通过提交spark-submit

SparkSession.builder.enableHiveSupport.getOrCreate
Run Code Online (Sandbox Code Playgroud)

小智 7

hive.metastore.client.factory.class配置添加到启动spark会话的代码中为我解决了这个问题:

SparkSession spark = SparkSession.builder()
...
            .config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory")
            .enableHiveSupport()
            .getOrCreate();
Run Code Online (Sandbox Code Playgroud)

这与AWS文档(https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html)中定义的配置相同,并在检查Use for Hive table metadata集群创建时添加到集群配置中,但对于某些配置原因不能按预期工作(我使用的是emr 5.12.0)。


小智 5

我遇到了同样的问题:spark-submit不会发现 AWS Glue 库,但spark-shell在主节点上工作会发现。

事实证明,我的工作使用的是用标准和库编译的spark-submitfat 。使用 jar 库代替安装在. 如果您遇到这种情况,请确保排除所有:.jarorg.apache.sparkorg.apache.hiveEMR

'org.apache.spark:' 'org.apache.hive:' 'org.apache.hadoop:' 来自您的模块.jar

这是我使用的参考.Gradlehttp://unethicalblogger.com/2015/07/15/gradle-goodness-exclusion-depends-from-shadow.html

compileOnly在所有 Spark 库前面添加关键字修复了它。