3

我已经使用 Glue 数据目录创建了一个 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

4 回答 4

12

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

于 2018-03-13T13:50:59.790 回答
2

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

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

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

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

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

于 2017-10-11T21:23:27.097 回答
1

我们的问题是 EMR 集群上的 IAM 权限;确保集群 IAM 实例配置文件具有胶水的完全访问权限。

于 2017-10-12T18:57:18.173 回答
-1

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

于 2017-10-06T04:56:38.637 回答