>我使用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.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。
在所有 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