Hive のメタストアとしての AWS Glue Data Catalog の使用 - Amazon EMR

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

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

AWS Glue は、簡単でコスト効果の高い方法でデータの分類、消去、強化、およびさまざまなデータストア間を確実に移動することができる、完全マネージド型の抽出、変換、ロード (ETL) サービスですAWS Glue Data Catalog は、Amazon EMR、および Amazon RDS、Amazon Redshift、Redshift Spectrum、Athena、 Apache Hive メタストアと互換性のあるアプリケーションと統合された、さまざまなデータソースおよびデータ形式にわたって統一されたメタデータリポジトリを提供します。AWS Glue クローラは、Amazon S3 のソースデータからスキーマを自動的に推測し、関連付けられたメタデータを Data Catalog に保存することができます。Data Catalog の詳細については、AWS Glue Developer Guide の「AWS Glue Data Catalog の設定」を参照してください。

AWS Glue には別料金が適用されます。Data Catalog にメタデータを保存してアクセスするための月間料金と、AWS Glue ETL ジョブおよびクローラランタイムの 1 分ごとに課金される時間料金、およびプロビジョニングされた開発エンドポイントごとの 1 分ごとに課金される時間料金があります。Data Catalog を使用すると、最大 100 万個のオブジェクトを無料で保存できます。100 万を超えるオブジェクトを保存した場合は、100,000 オブジェクトごとに 1 USD が課金されます。Data Catalog 内のオブジェクトは、テーブル、パーティション、またはデータベースです。詳細については、「Glue 料金表」を参照してください。

重要

2017 年 8 月 14 日以前に Amazon Athena または Amazon Redshift Spectrum を使用してテーブルを作成した場合、データベースとテーブルは AWS Glue Data Catalog とは別の Athena が管理するカタログに保存されます。Amazon EMR をこれらのテーブルと統合するには、AWS Glue Data Catalog にアップグレードする必要があります。詳細については、Amazon Athena ユーザーガイド の「AWS Glue Data Catalog にアップグレードする」を参照してください。

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

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

注記

HCatalog には Hive がインストールされているため、Data Catalog を使用するオプションは HCatalog でも利用できます。

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

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

  2. [Create cluster (クラスターの作成)]、[Go to advanced options (詳細オプションに移動する)] の順に選択します。

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

  4. [Release (リリース)] で [Hive] または [HCatalog] を選択します。

  5. [AWS Glue Data Catalog settings (AWS Glue Data Catalog の設定)] で [Use for Hive table metadata (Hive テーブルメタデータに使用)] を選択します。

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

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

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

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

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

    EMR リリースバージョン 5.28.0、5.28.1、または 5.29.0 で、メタストアとして AWS Glue Data Catalog を使用してクラスターを作成する場合は、さらに hive.metastore.schema.verificationfalse に設定します。これにより、Hive と HCatalog が MySQL に対してメタストアスキーマを検証できなくなります。この設定がない場合、マスターインスタンスグループは Hive または HCatalog の再設定後に中断されます。次の例を参照してください。

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

    EMR リリースバージョン 5.28.0、5.28.1、または 5.29.0 にクラスターがすでに存在する場合は、次の情報を使用してマスターインスタンスグループ hive.metastore.schema.verificationfalse に設定できます。

    Classification = hive-site Property = hive.metastore.schema.verification Value = false

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

    [ { "Classification": "hive-site", "Properties": { "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory", "hive.metastore.schema.verification": "false" "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 を Hive でメタストアとして使用するときは、以下について考慮します。

  • Hive シェルを使用した補助 JAR の追加はサポートされません。この問題を回避するには、hive-site 設定分類を使用して hive.aux.jars.path プロパティを設定します。これにより、Hive のクラスパスに補助 JAR が追加されます。

  • Hive のトランザクションはサポートされていません。

  • 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 セグメント構造」を参照してください。