我有一个带有 Spark(v2.2.1)的 AWS EMR 集群(v5.11.1),并尝试使用 AWS Glue 数据目录作为其元存储。根据官方 AWS 文档(下面的参考链接)中提供的指南,我已按照步骤操作,但在访问 Glue 目录数据库/表方面存在一些差异。EMR 集群和 AWS Glue 都在同一个账户中,并且已提供适当的 IAM 权限。
AWS 文档:https ://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html
观察:
- 使用 spark-shell(来自 EMR 主节点):
- 作品。能够使用以下命令访问 Glue DB/Tables:
spark.catalog.setCurrentDatabase("test_db") spark.catalog.listTables
- 使用 spark-submit(来自 EMR 步骤):
- 不工作。不断收到错误“数据库'test_db'不存在”
错误跟踪如下:
INFO HiveClientImpl:Hive 客户端(版本 1.2.1)的仓库位置是 hdfs:///user/spark/warehouse
INFO HiveMetaStore:0:get_database:默认
INFO 审计:ugi=hadoop ip=unknown-ip-addr cmd=get_database:默认
信息 HiveMetaStore:0:get_database:global_temp
信息审计:ugi=hadoop ip=unknown-ip-addr cmd=get_database:global_temp
WARN ObjectStore:无法获取数据库 global_temp,返回 NoSuchObjectException
INFO SessionState:已创建本地目录:/mnt3/yarn/ usercache/hadoop/appcache/application_1547055968446_0005/container_1547055968446_0005_01_000001/tmp/6d0f6b2c-cccd-4e90-a524-93dcc5301e20_resources
INFO SessionState: Created HDFS directory: /tmp/hive/hadoop/6d0f6b2c-cccd-4e90-a524-93dcc5301e20
INFO SessionState: Created local directory: /mnt3/yarn/usercache/hadoop/appcache/application_1547055968446_0005/container_1547055968446_0005_01_000001/tmp/yarn/6d0f6b2c-cccd-4e90-a524-93dcc5301e20
INFO SessionState: Created HDFS directory: /tmp/hive/hadoop/6d0f6b2c -cccd-4e90-a524-93dcc5301e20/_tmp_space.db
INFO HiveClientImpl:Hive 客户端(版本 1.2.1)的仓库位置是 hdfs:///user/spark/warehouse
INFO StateStoreCoordinatorRef:注册的 StateStoreCoordinator 端点
INFO CodeGenerator:生成的代码 > 191.063411 ms INFO CodeGenerator:
在 10.27313 ms 中生成的代码
INFO HiveMetaStore:0:get_database:test_db
信息审计:ugi=hadoop ip=unknown-ip-addr cmd=get_database:test_db
WARN ObjectStore: 获取数据库 test_db 失败,返回 NoSuchObjectException
org.apache.spark.sql.AnalysisException:数据库“test_db”不存在。;在 org.apache.spark.sql.internal.CatalogImpl.requireDatabaseExists(CatalogImpl.scala:44) 在 org.apache.spark.sql.internal.CatalogImpl.setCurrentDatabase(CatalogImpl.scala:64) 在 org.griffin_test.GriffinTest.ingestGriffinRecords (GriffinTest.java:97) 在 org.griffin_test.GriffinTest.main(GriffinTest.java:65) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run( ApplicationMaster.scala:635)
经过大量研究和博客中的许多建议,我尝试了以下修复但无济于事,我们仍然面临着差异。
参考博客:
- https://forums.aws.amazon.com/thread.jspa?threadID=263860
- 带有 AWS Glue 的 Spark 目录:找不到数据库
- https://okera.zendesk.com/hc/en-us/articles/360005768434-How-can-we-configure-Spark-to-use-the-Hive-Metastore-for-metadata-
修复尝试:
- 在 spark-defaults.conf 和 SparkSession 中启用 Hive 支持(代码):
Hive 类位于 CLASSPATH 上,并将 spark.sql.catalogImplementation 内部配置属性设置为 hive:
spark.sql.catalogImplementation hive
添加 Hive 元存储配置:
.config("hive.metastore.connect.retries", 15) .config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory")
代码片段:
SparkSession spark = SparkSession.builder().appName("Test_Glue_Catalog")
.config("spark.sql.catalogImplementation", "hive")
.config("hive.metastore.connect.retries", 15)
.config("hive.metastore.client.factory.class","com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory")
.enableHiveSupport()
.getOrCreate();
找出这种差异的根本原因的任何建议都会非常有帮助。
感谢你的帮助!谢谢!