跨帐号查询Glue

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

配置Glue权限

例如A帐号要访问B帐号的Glue Table:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:root"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*"
      ]
    }
  ]
}
  • 1111222233334444 替换为账户 A 的账户 ID

  • 5555666677778888 替换为账户 B 的账户 ID

  • us-east-1 替换为您选择的区域

  • DOC-EXAMPLE-DB 替换为数据库的名称

登录到B帐号,在Catalog settings部分:

image-20240305084514096

B帐号的test database下面有一张表test-table, 后面将在A帐号测试是否能访问到它:

image-20240305084615661

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

在A帐号启动 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"
    }
}]

配置完成后的效果:

image-20240305084908679

测试跨帐号访问

登录到primary节点,运行hive, 并执行以下命令:

use `5555666677778888/test`;
show tables;

可以访问到B帐号的表。

EMR 6.2 bug

如果在EMR 6.3以下的集群运行,则会报错:

image-20240305085134322

这是EMR的bug,参考: https://stackoverflow.com/questions/71489583/emr-6-x-cross-account-access-to-glue-catalog

参考

https://repost.aws/zh-Hans/knowledge-center/query-glue-data-catalog-cross-account

https://repost.aws/zh-Hans/knowledge-center/glue-data-catalog-cross-account-access