Amazon Athena Google Cloud Storage コネクタ - Amazon Athena

Amazon Athena Google Cloud Storage コネクタ

Amazon Athena Google Cloud Storage コネクタを使用すると、Amazon Athena は、Google Cloud Storage (GCS) バケットに保存されている Parquet および CSV ファイルに対してクエリを実行できます。1 つ以上の Parquet ファイルまたは CSV ファイルを GCS バケットの未分割または分割されたフォルダーにグループ化すると、AWS Glue データベーステーブルに整理できます。

アカウントで Lake Formation を有効にしている場合、AWS Serverless Application Repository でデプロイした Athena フェデレーション Lambda コネクタの IAM ロールには、Lake Formation での AWS Glue Data Catalog への読み取りアクセス権が必要です。

Athena を使用して GCS バケット内の Parquet ファイルまたは CSV ファイルに対してクエリを実行する方法については、AWS Big Data Blog 記事「Use Amazon Athena to query data stored in Google Cloud Platform」を参照してください。

前提条件

制約事項

  • DDL の書き込みオペレーションはサポートされていません。

  • 関連性のある Lambda 上限値。詳細については、AWS Lambda デベロッパーガイドLambda のクォータを参照してください。

  • 現在、コネクタはパーティション列 (AWS Glue テーブルスキーマにある string または varchar) の VARCHAR タイプのみをサポートしています。他のパーティションフィールドタイプでは、Athena でクエリを実行するとエラーが発生します。

用語

GCS コネクタに関連する用語を次に示します。

  • ハンドラー — GCS バケットにアクセスする Lambda ハンドラー。ハンドラーには、メタデータ用とデータレコード用があります。

  • メタデータハンドラー – GCS バケットからメタデータを取得する Lambda ハンドラー。

  • レコードハンドラー – GCS バケットからデータレコードを取得する Lambda ハンドラー。

  • 複合ハンドラー — GCS バケットからメタデータとデータレコードの両方を取得する Lambda ハンドラー。

[サポートされているファイルの種類]

GCS コネクタは Parquet ファイルタイプと CSV ファイルタイプをサポートしています。

注記

CSV ファイルと Parquet ファイルの両方を同じ GCS バケットまたはパスに配置しないようにしてください。これを行うと、Parquet ファイルを CSV として読み込もうとしたり、その逆を行おうとしたりするため、ランタイムエラーが発生する可能性があります。

パラメータ

このセクションの Lambda 環境変数を使用して GCS コネクタを設定します。

  • spill_bucket – Lambda 関数の上限を超えたデータに対して、Amazon S3 バケットを指定します。

  • spill_prefix – (オプション) 指定された athena-federation-spill という spill_bucket の、デフォルトのサブフォルダに設定します。このロケーションで、Amazon S3 のストレージライフサイクルを設定し、あらかじめ決められた日数または時間数以上経過したスピルを削除することをお勧めします。

  • spill_put_request_headers – (オプション) スピリングに使用されるAmazon S3 の putObject リクエスト (例:{"x-amz-server-side-encryption" : "AES256"}) に関する、 JSON でエンコードされたリクエストヘッダーと値のマッピング。利用可能な他のヘッダーについては、「Amazon Simple Storage Service API リファレンス」の「PutObject」を参照してください。

  • kms_key_id – (オプション) デフォルトでは、Amazon S3 に送信されるすべてのデータは、AES-GCM で認証された暗号化モードとランダムに生成されたキーを使用して暗号化されます。KMS が生成したより強力な暗号化キー (たとえば a7e63k4b-8loc-40db-a2a1-4d0en2cd8331) を Lambda 関数に使用させる場合は、KMS キー ID を指定します。

  • disable_spill_encryption – (オプション) True に設定されている場合、スピルに対する暗号化を無効にします。デフォルト値は False です。この場合、S3 にスピルされたデータは、AES-GCM を使用して (ランダムに生成されたキー、または KMS により生成したキーにより) 暗号化されます。スピル暗号化を無効にすると、特にスピルされる先でサーバー側の暗号化を使用している場合に、パフォーマンスが向上します。

  • secret_manager_gcp_creds_name – JSON 形式の GCS 認証情報が含まれている、AWS Secrets Manager 内のシークレットの名前 (例: GoogleCloudPlatformCredentials)。

AWS Glue でのデータベースとテーブルのセットアップ

GCS コネクタの組み込みスキーマ推論機能には制限があるため、AWS Glue メタデータに使用することをお勧めします。以下の手順では、AWS Glue で Athena からアクセスできるデータベースとテーブルを作成する方法を示しています。

AWS Glue でデータベースを作成する

AWS Glue コンソールを使用して、GCS コネクタで使用するデータベースを作成できます。

AWS Glue にデータベースを作成するには
  1. AWS Management Consoleにサインインし、AWS Glue コンソール (https://console.aws.amazon.com/glue/) を開きます。

  2. ナビゲーションペインから、[Databases] (データベース) を選択します。

  3. [Add database] (データベースの追加) を選択します。

  4. [Name] (名前) には、GCS コネクタで使用するデータベースの名前を入力します。

  5. [場所] に、google-cloud-storage-flag を指定します。この場所は、AWS Glue データベースに Athena でクエリされる GCS データのテーブルが含まれていることを GCS コネクタに伝えます。コネクタは、このフラグのある Athena 内のデータベースを認識し、そうでないデータベースは無視します。

  6. [データベースの作成] を選択します。

AWS Glue でのテーブルの作成

これで、データベース用のテーブルを作成できるようになりました。GCS コネクタで使用する AWS Glue テーブルを作成するときは、追加のメタデータを指定する必要があります。

AWS Glue コンソールでテーブルを作成するには
  1. AWS Glue コンソールで、ナビゲーションペインから [Tables] (テーブル) を選択します。

  2. [Tables] (テーブル) ページで、[Add table] (テーブルの追加) を選択します。

  3. [Set table properties] (テーブルプロパティの設定) ページで、次の情報を入力します。

    • 名前 – テーブル用に一意の名前を入力します。

    • データベース — GCS コネクタ用に作成した AWS Glue データベースを選択します。

    • インクルードパス[Data store] (データストア) セクションの [Include path] (インクルードパス) に、gs:// で始まる GCS の URI の場所を入力します (例: gs://gcs_table/data/)。パーティションフォルダが 1 つ以上ある場合は、パスに含めないでください。

      注記

      s3:// テーブル以外のパスを入力すると、AWS Glue コンソールにエラーが表示されます。このエラーは無視して構いません。テーブルは正常に作成されます。

    • データ形式[Classification] (分類) には、[CSV] または [Parquet] を選択します。

  4. [Next] を選択します。

  5. [Choose or define schema] (スキーマの選択または定義) ページでは、テーブルスキーマの定義を強く推奨していますが、必須ではありません。スキーマを定義しない場合、GCS コネクタは自動的にスキーマを推測しようとします。

    次のいずれかを行います。

    • GCS コネクタに自動的にスキーマを推測させたい場合は、[Next] (次へ) を選択してから [Create] (作成) を選択します。

    • 自分でスキーマを定義するには、次のセクションの手順に従います。

AWS Glue でのテーブルスキーマの定義

AWS Glue でテーブルスキーマを定義すると、より多くの手順が必要になりますが、テーブル作成プロセスをより細かく制御できます。

AWS Glue でテーブルのスキーマを定義するには
  1. [Choose or define schema] (スキーマの選択または定義) ページで、[Add] (追加) を選択します。

  2. [Add schema entry] (スキーマエントリの追加) ダイアログボックスを使用して、列名とデータタイプを指定します。

  3. 列をパーティション列として指定するには、[Set as partition key] (パーティションキーとして設定) オプションを選択します。

  4. [Save] (保存) を選択して列を保存します。

  5. さらに他の列を追加するには、[Add] (追加) を選択します。

  6. 列の追加が完了したら、[Next] (次へ) を選択します。

  7. [Review and create] (確認して作成) ページで、テーブルを確認し、[Create] (作成) を選択します。

  8. スキーマにパーティション情報が含まれている場合は、次のセクションの手順に従って、AWS Glue のテーブルのプロパティにパーティションパターンを追加します。

AWS Glue のテーブルプロパティへのパーティションパターンの追加

GCS バケットにパーティションがある場合は、AWS Glue のテーブルのプロパティにパーティションパターンを追加する必要があります。

テーブルプロパティ AWS Glue にパーティション情報を追加するには
  1. AWS Glue で作成したテーブルの詳細ページで、[Actions] (アクション)、[Edit] (編集) の順に選択します。

  2. [Edit table] (テーブルの編集) ページで、[Table properties] (テーブルプロパティ) セクションまで下にスクロールします。

  3. [Add] (追加) を選択して、パーティションキーを追加します。

  4. [Key] (キー) に「partition.pattern」と入力します。このキーはフォルダーパスパターンを定義します。

  5. [Value] (値) には、StateName=${statename}/ZipCode=${zipcode}/ のようなフォルダーパスパターンを入力します。${} で囲まれた statenamezipcode はパーティションの列名です。GCS コネクタは、Hive パーティションスキームと Hive 以外のパーティションスキームの両方をサポートします。

  6. 完了したら、[Save ] を選択します。

  7. 作成したばかりのテーブルプロパティを表示するには、[Advanced properties] (詳細プロパティ) タブを選択します。

この時点で、Athena コンソールに移動できます。AWS Glue で作成したデータベースとテーブルは、Athena でクエリできます。

サポートされるデータ型

次の表に、CSV と Parquet 向けにサポートされているデータ型を示します。

CSV

[Nature of data] (データの性質) [Inferred Data Type] (推定されたデータ型)
数字のように見えるデータ BIGINT
文字列のように見えるデータ VARCHAR
浮動小数点 (浮動小数点、倍精度浮動小数点、10 進数) のように見えるデータ DOUBLE
日付のように見えるデータ タイムスタンプ
true/false の値を含むデータ BOOL

Parquet

[PARQUET] [Athena (Arrow)] (Athena (矢印))
BINARY VARCHAR
BOOLEAN BOOL
DOUBLE DOUBLE
ENUM VARCHAR
FIXED_LEN_BYTE_ARRAY DECIMAL
FLOAT FLOAT (32 ビット)
INT32
  1. INT32

  2. DATEDAY (Parquet 列の論理タイプが DATE である場合)

INT64
  1. INT64

  2. TIMESTAMP (Parquet 列の論理タイプが TIMESTAMP である場合)

INT96 タイムスタンプ
MAP MAP
STRUCT STRUCT
LIST LIST

必要な許可

このコネクタが必要とする IAM ポリシーの完全な詳細については、athena-gcs.yaml ファイルの Policies セクションを参照してください。次のリストは、必要なアクセス権限をまとめたものです。

  • Amazon S3 への書き込みアクセス – 大規模なクエリからの結果をスピルするために、コネクタは Amazon S3 内のロケーションへの書き込みアクセス権限を必要とします。

  • Athena GetQueryExecution – コネクタはこの権限を使用して、アップストリームの Athena クエリが終了した際に fast-fail を実行します。

  • AWS Glue Data Catalog – GCS コネクタには、スキーマ情報を取得するために AWS Glue Data Catalog への読み取り専用アクセス権が必要です。

  • CloudWatch Logs – コネクタは、ログを保存するために CloudWatch Logs にアクセスする必要があります。

パフォーマンス

テーブルスキーマにパーティションフィールドが含まれていて、partition.pattern テーブルプロパティが正しく設定されている場合は、クエリの WHERE 句にパーティションフィールドを含めることができます。このようなクエリの場合、GCS コネクタはパーティション列を使用して GCS フォルダーのパスを絞り込み、GCS フォルダー内の不要なファイルをスキャンしないようにします。

Parquet データセットには、列のサブセットを選択すると、スキャンされるデータが少なくなります。通常、これにより、列プロジェクションが適用されるときのクエリ実行時間が短くなります。

CSV データセットでは列の投影はサポートされていないため、スキャンされるデータ量が減ることはありません。

LIMIT 句はスキャンされるデータ量を減らしますが、述語が提供されない場合は、LIMIT 句を含む SELECT クエリは少なくとも 16 MB のデータをスキャンすることを想定する必要があります。GCS コネクタでは、LIMIT 句が適用されているかに関わらず、小さいデータセットよりも大きいデータセットに対する方が、多くのデータをスキャンします。例えば、クエリ SELECT * LIMIT 10000 は、小さな基盤データセットよりも大きな基盤データセットに対して、より多くのデータをスキャンします。

ライセンス情報

このコネクタを使用することにより、pom.xml ファイル内のリストにある、サードパーティのコンポーネントが使用されることを承認し、 GitHub.com にある LICENSE.txt ファイルに記載されている、個別のサードパーティライセンスの使用条件に同意したとみなされます。

追加リソース

このコネクタに関するその他の情報については、GitHub.com で対応するサイトを参照してください。