Amazon EMR
Amazon EMR リリースガイド

Spark SQL のメタストアとしての AWS Glue Data Catalog の使用

Amazon EMR バージョン 5.8.0 以降では、AWS Glue Data Catalog をメタストアとして使用するように Spark SQL を設定できます。永続的なメタストア、またはさまざまなクラスター、サービス、アプリケーション、あるいは AWS アカウントで共有されるメタストアが必要である場合は、この設定をお勧めします。

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 ユーザーガイド.

メタストアとしての AWS Glue Data Catalog の指定

AWS Glue Data Catalog は、AWS マネジメントコンソール、AWS CLI、または Amazon EMR API を使用して、メタストアとして指定できます。CLI または API を使用する場合は、Spark の設定分類を使用して Data Catalog を指定します。さらに、Amazon EMR 5.16.0 以降では、設定分類を使用して、別の AWS アカウントで Data Catalog を指定することができます。コンソールを使用する場合は、[詳細オプション] または [クイックオプション] を使用して Data Catalog を指定できます。

注記

Spark SQL コンポーネントには Zeppelin がインストールされているため、Zeppelin でも AWS Glue Data Catalog をメタストアとして使用できます。

コンソールを使用して AWS Glue Data Catalog を Spark SQL のメタストアとして指定するには

  1. Amazon EMR コンソール (https://console.aws.amazon.com/elasticmapreduce/) を開きます。

  2. Choose Create cluster, Go to advanced options.

  3. [Release] で、[emr-5.8.0] 以降を選択します。

  4. [Release] で、[Spark] または [Zeppelin] を選択します。

  5. [AWS Glue Data Catalog 設定)] で [Spark テーブルメタデータに使用] を選択します。

  6. 必要に応じてクラスターの他のオプションを選択し、[Next (次へ)] 選択してアプリケーションに適切な他のクラスターオプションを設定します。

設定分類を使用して AWS Glue Data Catalog をメタストアとして指定するには

AWS CLI と EMR API を使用した設定分類の指定方法の詳細については、「アプリケーションの設定」を参照してください。

  • 次の例に示すように、spark-hive-site 分類を使用して hive.metastore.client.factory.class の値を指定します。

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

    別の AWS アカウントで Data Catalog を指定するには、次の例に示すように hive.metastore.glue.catalogid プロパティを追加します。acct-id を Data Catalog の AWS アカウントに置き換えます。

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

IAM アクセス許可

クラスターの EC2 インスタンスプロファイルには、AWS Glue アクションに対する IAM アクセス許可が必要です。さらに、AWS Glue Data Catalog オブジェクトの暗号化を有効にする場合は、暗号化に使用するカスタマーマスターキー (CMK) を暗号化、復号、および生成できるロールも必要です。

AWS Glue アクションに対するアクセス許可

EMR_EC2_DefaultRole にアタッチされたデフォルトの AmazonElasticMapReduceforEC2Role 管理ポリシーにより、必要な AWS Glue アクションが許可されます。デフォルトの EC2 インスタンスプロファイルを使用する場合、アクションは必要ありません。ただし、クラスターの作成時にカスタム EC2 インスタンスプロファイルとアクセス許可を指定する場合は、適切な AWS Glue アクションが許可されていることを確認してください。開始点として AmazonElasticMapReduceforEC2Role 管理ポリシーを使用します。AWS Glue アクションのリストについては、「クラスターの EC2 インスタンスのサービスロール (EC2 インスタンスプロファイル)」 (Amazon EMR 管理ガイド) を参照してください。

AWS Glue Data Catalog を暗号化/復号するためのアクセス許可

このセクションでは、AWS Glue Data Catalog の暗号化機能について説明します。AWS Glue Data Catalog 暗号化の詳細については、AWS Glue Developer Guideの「Data Catalog の暗号化」を参照してください。

AWS Glue 用の AWS 管理 CMK を使用して AWS Glue Data Catalog オブジェクトの暗号化を有効にしており、AWS Glue Data Catalog にアクセスするクラスターが同じ AWS アカウント内にある場合、EC2 インスタンスプロファイルにアタッチされたアクセス許可ポリシーを更新する必要はありません。カスタマー管理 CMK を使用しているか、クラスターが別の AWS アカウントにある場合は、EC2 インスタンスプロファイルでキーを使用して暗号化と復号を行えるよう、アクセス許可ポリシーを更新する必要があります。デフォルトのアクセス許可ポリシー、AmazonElasticMapReduceforEC2Role、またはカスタム EC2 インスタンスプロファイルにアタッチされたカスタムアクセス許可ポリシーのいずれを使用しているかにかかわらず、次のポリシーステートメントの内容を追加する必要があります。

[ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:region:acct-id:key/12345678-1234-1234-1234-123456789012" } ] } ]

リソースベースのアクセス許可

Amazon EMR で AWS Glue を Hive、Spark、または Presto と使用する場合、AWS Glue では、Data Catalog リソースへのアクセスをコントロールするリソースベースのポリシーをサポートしています。このリソースには、データベース、テーブル、接続、およびユーザー定義関数などがあります。詳細については、AWS Glue Developer Guide の「AWS Glue リソースポリシー」を参照してください。

Amazon EMR 内からの AWS Glue へのアクセスを制限するためにリソースベースのポリシーを使用している場合、アクセス許可ポリシーで指定したプリンシパルは、クラスター作成時に指定された EC2 インスタンスプロファイルに関連付けられているロール ARN である必要があります。たとえば、カタログにアタッチされたリソースベースのポリシーでは、次の例に示されている形式を使用して、デフォルトの クラスター EC2 インスタンスのサービスロール のロール ARN (EMR_EC2_DefaultRole) を Principal として指定できます。

arn:aws:iam::acct-id:role/EMR_EC2_DefaultRole

acct-id は、AWS Glue アカウント ID とは異なる場合があります。これにより、別のアカウントの EMR クラスターからのアクセスが可能になります。別のアカウントからそれぞれ、複数のプリンシパルを指定することができます。

AWS Glue Data Catalog を使用するときの考慮事項

AWS Glue Data Catalog を Spark でメタストアとして使用するときは、以下について考慮します。

  • 場所の URI が指定されていないデフォルトデータベースを使用すると、テーブルの作成時に障害が発生します。回避策として、LOCATION の使用時に s3://mybucket 句を使用して CREATE TABLE などのバケットの場所を指定します。または、デフォルトデータベース以外のデータベース内にテーブルを作成します。

  • AWS Glue 内からのテーブルの名前変更はサポートされていません。

  • LOCATION を指定しないで Hive テーブルを作成すると、テーブルデータは hive.metastore.warehouse.dir プロパティで指定された場所に保存されます。デフォルトでは、これは HDFS の場所です。別のクラスターがテーブルにアクセスする必要がある場合、テーブルを作成したクラスターに対する適切なアクセス許可がない限り、操作に失敗します。さらに、HDFS ストレージが一時的であるため、クラスターが終了するとテーブルデータが失われ、テーブルは再作成される必要があります。AWS Glue を使用して Hive テーブルを作成するときは、Amazon S3 で LOCATION を指定することをお勧めします。または、hive-site 設定分類を使用して、hive.metastore.warehouse.dir に対する Amazon S3 の場所を指定できます。これは、すべての Hive テーブルに適用されます。テーブルは、HDFS の場所で作成され、テーブルを作成したクラスターがまだ実行中の場合は、AWS Glue 内から Amazon S3 に対するテーブルの場所を更新できます。詳細については、AWS Glue Developer Guide の「AWS Glue コンソールでのテーブルの使用」を参照してください。

  • 引用符とアポストロフィを含むパーティション値はサポートされていません (例: PARTITION (owner="Doe's").)。

  • 列の統計はサポートされていません。

  • Hive 許可の使用はサポートされていません。代替策として、AWS Glue リソースベースのポリシーを使用することを検討してください。詳細については、「AWS Glue Data Catalog への Amazon EMR アクセスに対するリソースベースポリシーの使用」を参照してください。

  • 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 がクエリの実行を最適化しようとするため、クエリが失敗する場合があります。

  • 一時テーブルはサポートされていません。

  • AWS Glue を使用してテーブルを直接作成するのではなく、Amazon EMR 経由でアプリケーションを使用して作成することをお勧めします。AWS Glue 経由でテーブルを作成すると、必須フィールドが足りず、クエリの例外が発生することがあります。

  • EMR 5.20.0 以降で AWS Glue Data Catalog がメタストアとして使用されている場合、Spark と Hive に対して並列パーティションの削除が自動的に有効になります。この変更により、パーティションを取得するために複数のリクエストを並行して実行することで、クエリの計画時間は大幅に短縮されます。同時に実行できるセグメントの合計数は、1~10 の範囲です。デフォルト値は 5 です。この設定が推奨されています。この設定を変更するには、hive-site 設定分類のプロパティ aws.glue.partition.num.segments を指定します。スロットリングが発生した場合は、値を 1 に変更して機能を無効にすることができます。詳細については、「AWS Glue セグメント構造」を参照してください。