如何在 Amazon EMR 上使用 Hive 和 Spark 查询位于不同 AWS 账户中的 AWS Glue Data Catalog?
我想在 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" } }]
将配置更改应用于正在运行的集群
- 打开 Amazon EMR 控制台。
- 在集群列表中,在 Cluster Id(集群 ID)下选择要重新配置的活动集群。
- 在集群详细信息页面中,选择 Applications(应用程序)选项卡。
- 在应用程序详细信息页面中,向下滚动到 Instance group configurations(实例组配置)。
- 选择实例组,然后选择 Reconfigure(重新配置)。
- 在下一个屏幕中,选择 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 - 选中 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" } }]
将配置更改应用于正在运行的集群
- 打开 Amazon EMR 控制台。
- 在集群列表中,在 Cluster Id(集群 ID)下选择要重新配置的活动集群。
- 在集群详细信息页面中,选择 Applications(应用程序)选项卡。
- 在应用程序详细信息页面中,向下滚动到 Instance group configurations(实例组配置)。
- 选择实例组,然后选择 Reconfigure(重新配置)
- 在下一个屏幕中,选择 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 - 选中 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()
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前