将 AWS Glue 数据目录用作 EMR 上 Spark SQL 的元存储的问题

Sri*_*her 8 amazon-emr apache-spark aws-glue hive-metastore aws-glue-data-catalog

我有一个带有 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 主节点):

- 使用 spark-submit(来自 EMR 步骤):

  • 不起作用。不断收到错误“数据库'test_db'不存在”

错误跟踪如下:

INFO HiveClientImpl:Hive 客户端(版本 1.2.1)的仓库位置是 hdfs:///user/spark/warehouse
INFO HiveMetaStore: 0: get_database: 默认
INFO audit: 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的/应用程序缓存/ application_1547055968446_0005 / container_1547055968446_0005_01_000001的/ tmp / 6d0f6b2c-CCCD-4e90-a524-93dcc5301e20_resources
信息SessionState的:创建HDFS目录:/ tmp目录/蜂房/ Hadoop的/ 6d0f6b2c-CCCD-4e90-a524-93dcc5301e20
INFO SessionState的:创建本地目录:/ mnt3 /纱/ usercache / Hadoop的/应用程序缓存/ application_1547055968446_0005 / container_1547055968446_0005_01_000001的/ tmp /纱/ 6d0f6b2c-CCCD-4e90-a524-93dcc5301e20
信息SessionState的:创建HDFS目录:/ tmp目录/蜂房/ 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
INFO 审计:ugi=hadoop ip=unknown-ip-addr cmd=get_database:test_db
警告 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.ingestGriffinRe (GriffinTest.java:97) at org.griffin_test.GriffinTest.main(GriffinTest.java:65) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at 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)


经过大量研究和博客中的许多建议,我尝试了以下修复但无济于事,我们仍然面临差异。

参考博客:

修复尝试:

- 在 spark-defaults.conf 和 SparkSession(代码)中启用 Hive 支持:

  • Hive 类位于 CLASSPATH 上,并将 spark.sql.catalogImplementation 内部配置属性设置为 hive:

    spark.sql.catalogImplementation  hive
    
    Run Code Online (Sandbox Code Playgroud)
  • 添加 Hive 元存储配置:

    .config("hive.metastore.connect.retries", 15)
    .config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory")
    
    Run Code Online (Sandbox Code Playgroud)

代码片段:

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();
Run Code Online (Sandbox Code Playgroud)

找出这种差异的根本原因的任何建议都会非常有帮助。

感谢你的帮助!谢谢!