Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用 AWS Glue Data Catalog作为 Spark SQL 的元数据仓

使用 Amazon EMR 版本 5.8.0 或更高版本,您可以将 Spark SQL 配置为使用 AWS Glue Data Catalog作为元数据仓。当您需要持久的元数据仓或由不同集群、服务和应用程序共享的元数据仓时,我们建议使用此配置。

AWS Glue is a fully managed extract, transform, and load (ETL) service that makes it simple and cost-effective to categorize your data, clean it, enrich it, and move it reliably between various data stores. The AWS Glue Data Catalog provides a unified metadata repository across a variety of data sources and data formats, integrating with Amazon EMR as well as Amazon RDS, Amazon Redshift, Redshift Spectrum, Athena, and any application compatible with the Apache Hive metastore. AWS Glue crawlers can automatically infer schema from source data in Amazon S3 and store the associated metadata in the Data Catalog. For more information about the Data Catalog, see Populating the AWS Glue Data Catalog in the AWS Glue Developer Guide.

Separate charges apply for AWS Glue. There is a monthly rate for storing and accessing the metadata in the Data Catalog, an hourly rate billed per minute for AWS Glue ETL jobs and crawler runtime, and an hourly rate billed per minute for each provisioned development endpoint. The Data Catalog allows you to store up to a million objects at no charge. If you store more than a million objects, you are charged USD$1 for each 100,000 objects over a million. An object in the Data Catalog is a table, partition, or database. For more information, see Glue Pricing.

重要

If you created tables using Amazon Athena or Amazon Redshift Spectrum before August 14, 2017, databases and tables are stored in an Athena-managed catalog, which is separate from the AWS Glue Data Catalog. To integrate Amazon EMR with these tables, you must upgrade to the AWS Glue Data Catalog. For more information, see Upgrading to the AWS Glue Data Catalog in the Amazon Athena User Guide.

指定 AWS Glue Data Catalog作为元数据仓

您可以使用 AWS Management Console、AWS CLI 或 Amazon EMR API 指定 AWS Glue Data Catalog 作为元存储。在使用 CLI 或 API 创建集群时,您可以使用 spark-hive-site 配置分类指定 Data Catalog。在使用控制台创建集群时,您可以使用 Advanced OptionsQuick Options 指定 Data Catalog。

注意

使用 AWS Glue Data Catalog的选项也适用于 Zeppelin,因为 Zeppelin 安装有 Spark SQL 组件。

使用控制台指定 AWS Glue Data Catalog作为 Spark SQL 的元数据仓

  1. Open the Amazon EMR console at https://console.amazonaws.cn/elasticmapreduce/.

  2. Choose Create cluster, Go to advanced options.

  3. 对于 Release,选择 emr-5.8.0 或更高版本。

  4. Release 下,选择 SparkZeppelin

  5. AWS Glue Data Catalog settings 下,选择 Use for Hive table metadata

  6. 根据需要为您的集群选择其他选项,选择 Next,然后根据需要为您的应用程序配置其他集群选项。

使用 AWS CLI 或 Amazon EMR API 指定 AWS Glue Data Catalog 作为元存储

  • 使用 spark-hive-site 分类指定 hive.metastore.client.factory.class 的值,如下例所示。有关更多信息,请参阅配置应用程序

    例 以使用 AWS Glue Data Catalog 为目标的配置 JSON 示例

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

IAM 权限

EMR_EC2_DefaultRole 必须具有执行 AWS Glue 操作的 IAM 权限:只有在您未使用默认 AmazonElasticMapReduceforEC2Role 托管策略且将客户管理的策略附加到该角色时,这才是一个问题。在这种情况下,您需要将该策略配置为允许执行 AWS Glue 操作的权限。打开 IAM 控制台 (https://console.amazonaws.cn/iam/) 并查看 AmazonElasticMapReduceforEC2Role 托管策略的内容以了解允许的所需 AWS Glue 操作。

使用 AWS Glue Data Catalog时的注意事项

在使用 AWS Glue Data Catalog作为 Spark 的元存储时,请考虑以下项目:

  • 当您创建表时,具有没有位置 URI 的默认数据库会导致失败。作为解决方法,请在您使用 CREATE TABLE 时使用 LOCATION 子句指定一个存储桶位置,如 s3://mybucket。或者,在除默认数据库之外的数据库内创建表。

  • 不支持在 AWS Glue 中重命名表。

  • 在未指定 LOCATION 的情况下创建 Hive 表时,表定义将存储在 hive.metastore.warehouse.dir 属性所指定的位置。默认情况下,这是 HDFS 中的位置。如果另一个集群需要访问该表,除非此集群对创建该表的集群有足够的权限,否则将无法访问。此外,由于 HDFS 存储是暂时的,因此,如果集群终止,则表定义将丢失,并且必须重新创建表。我们建议您在使用 AWS Glue 创建 Hive 表时,在 Amazon S3 中指定 LOCATION。或者,您可以使用 hive-site 配置分类在 Amazon S3 中为 hive.metastore.warehouse.dir 指定一个位置,该位置适用于所有 Hive 表。如果在 HDFS 位置创建一个表并且创建该表的集群仍在运行,您可以从 AWS Glue 中将表位置更新为 Amazon S3。有关更多信息,请参阅 AWS Glue Developer Guide 中的在 AWS Glue 控制台上处理表

  • 不支持包含引号和撇号的分区值,例如 PARTITION (owner="Doe's").

  • 不支持列统计数据

  • 不支持使用 Hive 授权

  • 不支持 Hive 约束

  • 不支持在 Hive 中基于成本进行优化。不支持将 hive.cbo.enable 的值更改为 true

  • 不支持设置 hive.metastore.partition.inherit.table.properties

  • 不支持使用以下元存储常量:BUCKET_COUNT, BUCKET_FIELD_NAME, DDL_TIME, FIELD_TO_DIMENSION, FILE_INPUT_FORMAT, FILE_OUTPUT_FORMAT, HIVE_FILTER_FIELD_LAST_ACCESS, HIVE_FILTER_FIELD_OWNER, HIVE_FILTER_FIELD_PARAMS, IS_ARCHIVED, META_TABLE_COLUMNS, META_TABLE_COLUMN_TYPES, META_TABLE_DB, META_TABLE_LOCATION, META_TABLE_NAME, META_TABLE_PARTITION_COLUMNS, META_TABLE_SERDE, META_TABLE_STORAGE, ORIGINAL_LOCATION

  • 当您使用谓词表达式时,显式值必须在比较运算符的右侧,否则查询可能会失败。

    • 正确SELECT * FROM mytable WHERE time > 11

    • 不正确SELECT * FROM mytable WHERE 11 > time

  • 不建议在谓词表达式中使用用户定义的函数 (UDF)。查询可能会因 Hive 尝试优化查询表达式的方式而失败。

  • 不支持临时表

  • 建议使用应用程序通过 Amazon EMR 创建表,而不是直接使用 AWS Glue 创建表。通过 AWS Glue 创建表可能导致必填字段缺失并导致出现查询异常。