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



>我使用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

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)。

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

事实证明,我的spark-submit工作使用了一个胖.jar,该是用标准org.apache.sparkorg.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。

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

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

您应该在 Glue 作业中选中"使用 Glue 数据目录作为 Hive 元存储"选项; 这是基础,否则 Spark 将看不到 Glue 目录,只会看到 Glue 创建的"默认"数据库。

我的问题是另一个分类配置一直在干扰spark-hive-site的分类配置。我删除了所有其他内容,它终于能够连接了。

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

相关内容

  • 没有找到相关文章

最新更新