可以通过在 Hive 或 Spark 配置中指定 aws.glue.catalog.separator 属性来动态访问不同账户中的 Data Catalog。此外,可以通过在 Hive 或 Spark 配置中指定 hive.metastore.glue.catalogid 属性来访问另一个账户中的特定 Data Catalog。
例如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
部分:
B帐号的test database下面有一张表test-table
, 后面将在A帐号测试是否能访问到它:
在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"
}
}]
配置完成后的效果:
登录到primary节点,运行hive, 并执行以下命令:
use `5555666677778888/test`;
show tables;
可以访问到B帐号的表。
如果在EMR 6.3以下的集群运行,则会报错:
这是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