如何在 Amazon EMR 上使用 Hive 和 Spark 来查询位于不同 AWS 账户中的 AWS Glue 数据目录?

上次更新时间:2020 年 8 月 31 日

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

简短描述

在您的 Hive 和 Spark 配置中,添加属性 "aws.glue.catalog.separator": "/"。您可以在新集群或正在运行的集群上配置此属性。

注意:此解决方案适用于 Amazon EMR 版本 5.28.0 及更高版本。EMR 集群和 AWS Glue 数据目录必须位于同一区域。

解决方法

设置对 AWS Glue 的跨账户访问权限(如果尚未设置)。确保将 AWS Glue 表指向的 Amazon Simple Storage Service (Amazon S3) 存储桶配置为跨账户访问。有关详细信息,请参阅如何为 EMRFS 设置跨账户访问权限?

然后,将 Hive 和 Spark 的 aws.glue.catalog.separator 属性设置为 /

在新的集群上

在启动集群时,添加以下类似的配置对象

[
    {
        "Classification": "hive-site",
        "Properties": {
            "aws.glue.catalog.separator": "/"
        }
    },
    {
        "Classification": "spark-hive-site",
        "Properties": {
            "aws.glue.catalog.separator": "/"
        }
    }    
]

在正在运行的集群上

  1. 打开 Amazon EMR 控制台
  2. 在集群列表中,在名称下选择要重新配置的活动集群。
  3. 打开集群的集群详细信息页面,然后选择配置选项卡。
  4. 筛选条件下拉列表中,选择您想要重新配置的实例组。
  5. 重新配置下拉列表中,选择在表中编辑
  6. 在配置分类表中,选择添加配置,然后输入以下内容:
    对于分类:hive-site
    对于属性:aws.glue.catalog.separator
    对于:/

    对于分类:spark-hive-site
    对于属性:aws.glue.catalog.separator
    对于:/
  7. 选择将此配置应用到所有活动的实例组,然后选择保存更改

查询其他 AWS 账户中的表

要查询位于不同 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()

或者,在 spark-submit 脚本中使用 --conf 选项传递参数,或作为笔记本 shell 命令运行。示例:

pyspark --conf spark.hadoop.aws.glue.catalog.separator="/"

这篇文章对您有帮助吗?


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