8

我有一个带有 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)


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

参考博客:

修复尝试:

- 在 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();

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

感谢你的帮助!谢谢!

4

0 回答 0