如何在 Amazon EMR 上使用 Hive 和 Spark 查询位于不同 AWS 账户中的 AWS Glue Data Catalog?

上次更新日期:2023 年 1 月 24 日

我想在 Amazon EMR 中使用 Apache Hive 和 Apache Spark 访问和查询另一个账户的 AWS Glue Data Catalog。

简短描述

您可以通过在 Hive 或 Spark 配置中指定 aws.glue.catalog.separator 属性来动态访问不同账户中的 Data Catalog。此外,您可以通过在 Hive 或 Spark 配置中指定 hive.metastore.glue.catalogid 属性来访问另一个账户中的特定 Data Catalog。

解决方法

如果您没有向 AWS Glue 授予跨账户访问权限,请按照授予跨账户访问权限中的步骤进行设置。确保为 AWS Glue 表指向的 Amazon Simple Storage Service(Amazon S3)存储桶配置跨账户访问权限。有关更多信息,请参阅如何设置 Amazon EMRFS 的跨账户访问?

动态访问不同账户中的 Data Catalog

将配置更改应用到新集群

在启动 EMR 集群时,添加类似于以下对象的配置对象。有关更多信息,请参阅在创建集群时配置应用程序

[{
    "Classification": "hive-site",
    "Properties": {
        "aws.glue.catalog.separator": "/",
        "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
    }
}, {
    "Classification": "spark-hive-site",
    "Properties": {
        "aws.glue.catalog.separator": "/",
        "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
    }
}]

将配置更改应用于正在运行的集群

  1. 打开 Amazon EMR 控制台
  2. 在集群列表中,在 Cluster Id(集群 ID)下选择要重新配置的活动集群。
  3. 在集群详细信息页面中,选择 Applications(应用程序)选项卡。
  4. 在应用程序详细信息页面中,向下滚动到 Instance group configurations(实例组配置)。
  5. 选择实例组,然后选择 Reconfigure(重新配置)。
  6. 在下一个屏幕中,选择 Add new configuration(添加新配置),然后输入以下内容:
    对于 Classification(分类):hive-site
    对于属性:aws.glue.catalog.separator
    对于 Value(值):/
    对于 Classification(分类):hive-site
    对于 Property(属性):hive.metastore.client.factory.class
    对于 Value(值):com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory
    对于 Classification(分类):spark-hive-site
    对于属性:aws.glue.catalog.separator
    对于:/
    对于 Classification(分类):spark-hive-site
    对于 Property(属性):hive.metastore.client.factory.class
    对于 Value(值):com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory
  7. 选中 Apply this configuration to all active instance groups(将此配置应用到所有活动的实例组),然后选择 Save changes(保存更改)。有关更多信息,请参阅在正在运行的集群中重新配置实例组

查询另一个 AWS 账户中的表

注意:在 Amazon EMR 6.5 中,在运行 Spark 任务时传递配置属性 spark.sql.catalogImplementation=hive。有关更多信息,请参阅 Apache Spark 文档中的 Dynamically loading Spark properties(动态加载 Spark 属性)。

要查询位于不同 AWS 账户中的表,请在查询中指定账号。账号与目录 ID 相同。例如,要在 Hive 中查询 111122223333 账户 demodb.tab1,请运行以下命令:

SELECT * FROM `111122223333/demodb.tab1` LIMIT 5;

Spark 示例(在 spark-submit 脚本中运行,或作为笔记本 shell 命令运行):

spark.sql("SELECT * FROM `111122223333/demodb`.tt1 LIMIT 5").show()

您还可以跨两个目录联接表。

Hive 示例:

SELECT * FROM `111122223333/demodb.tab1` t1 INNER JOIN `444455556666/demodb.tab2` t2 ON t1.col1 = t2.col2

Spark 示例(在 spark-submit 脚本中运行,或作为笔记本 shell 命令运行):

spark.sql(SELECT * FROM `111122223333/demodb.tab1` t1 INNER JOIN `444455556666/demodb.tab2` t2 ON t1.col1 = t2.col2).show()

访问另一个账户中的特定 Data Catalog

将配置更改应用到新集群

在启动 EMR 集群时,添加类似于以下对象的配置对象。有关更多信息,请参阅在创建集群时配置应用程序

[{
    "Classification": "hive-site",
    "Properties": {
        "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
        "hive.metastore.glue.catalogid": "account-id"
    }
}, {
    "Classification": "spark-hive-site",
    "Properties": {
        "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
        "hive.metastore.glue.catalogid": "account-id"
    }
}]

将配置更改应用于正在运行的集群

  1. 打开 Amazon EMR 控制台
  2. 在集群列表中,在 Cluster Id(集群 ID)下选择要重新配置的活动集群。
  3. 在集群详细信息页面中,选择 Applications(应用程序)选项卡。
  4. 在应用程序详细信息页面中,向下滚动到 Instance group configurations(实例组配置)。
  5. 选择实例组,然后选择 Reconfigure(重新配置)
  6. 在下一个屏幕中,选择 Add new configuration(添加新配置),然后输入以下内容:
    对于 Classification(分类):hive-site
    对于 Property(属性):hive.metastore.glue.catalogid
    对于 Value(值):account-id
    对于 Classification(分类):hive-site
    对于 Property(属性):hive.metastore.client.factory.class
    对于 Value(值):com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory
    对于 Classification(分类):spark-hive-site
    对于 Property(属性):hive.metastore.glue.catalogid
    对于 Value(值):account-id
    对于 Classification(分类):spark-hive-site
    对于 Property(属性):hive.metastore.client.factory.class
    对于 Value(值):com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory
  7. 选中 Apply this configuration to all active instance groups(将此配置应用到所有活动的实例组),然后选择 Save changes(保存更改)。有关更多信息,请参阅在正在运行的集群中重新配置实例组

查询另一个 AWS 账户中的表

要查询存储在指定的 AWS Glue Data Catalog 中的表,您可以运行以下命令。例如,要查询 demodb.tab1

在 Hive 中,运行以下命令:

SELECT * FROM `demodb.tab1` LIMIT 5;

Spark 示例(在 spark-submit 脚本中运行,或作为笔记本 shell 命令运行):

spark.sql("SELECT * FROM `demodb`.tt1 LIMIT 5").show()

这篇文章对您有帮助吗?


您是否需要账单或技术支持?