Amazon Athena DynamoDB コネクタ - Amazon Athena

Amazon Athena DynamoDB コネクタ

Amazon Athena DynamoDB コネクタは、Amazon Athena が DynamoDB とやり取りすることを可能にして、テーブルを SQL でクエリできるようにします。INSERT INTO などの書き込み操作はサポートされていません。

前提条件

パラメータ

このセクションの Lambda 環境変数により、DynamoDB コネクタを設定します。

  • 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 S3 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 により生成したキーにより) 暗号化されます。スピル暗号化を無効にすると、特にスピルされる先でサーバー側の暗号化を使用している場合に、パフォーマンスが向上します。

  • disable_glue – (オプション) これが存在し、true に設定されている場合、コネクタは AWS Glue からの補足メタデータ取得は試みません。

  • glue_catalog – (オプション) クロスアカウントの AWS Glue カタログを指定するために、このオプションを使用します。デフォルトでは、コネクタは自身の AWS Glue アカウントからメタデータを取得しようとします。

  • disable_projection_and_casing – (オプション) プロジェクションおよび大文字と小文字の区別を無効にします。列名に大文字と小文字の区別がある DynamoDB テーブルをクエリしたいものの、AWS Glue テーブルで columnMapping プロパティを指定したくない場合に使用します。

    disable_projection_and_casing パラメータは、次の値を使用して大文字と小文字の区別、および列のマッピングに関する動作を指定します。

    • auto – これまでサポートされていなかったタイプが検出され、列名のマッピングがテーブルに設定されていない場合、プロジェクション、および大文字と小文の区別を無効にします。これはデフォルトの設定です。

    • always – プロジェクション、および大文字と小文字の区別を無条件に無効にします。これは、DynamoDB の列名で大文字と小文字を区別しているものの、列名のマッピングを指定したくない場合に便利です。

    disable_projection_and_casing パメータを使用する場合は、以下の点に注意してください。

    • Lambda 関数が DynamoDB テーブルと同じリージョンにない場合、このパラメータを使用すると、帯域幅の使用量が増加する可能性があります。

    • 転送されるバイト数が増え、またバイト数が多いと逆シリアル化により時間がかかるため、全体のレイテンシが長くなる可能性があります。

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

コネクタに組み込まれたスキーマ推論機能には制限があるため、メタデータ用としては AWS Glue の使用が適しています。DynamoDB で使用するため AWS Glue テーブルを有効にするには、補足メタデータを提供する先の DynamoDB テーブル用として、AWS Glue テーブルを用意する必要があります。

補足メタデータのために AWS Glue を使用するには

  1. AWS Glue コンソールからテーブルとデータベースを編集する際は、必要に応じて以下のテーブルプロパティを追加します。AWS Glue DynamoDB クローラーを使用する場合、これらのプロパティは自動的に設定されます。

    • dynamodb – テーブルを補足メタデータとして使用できることを Athena DynamoDB コネクタに示す文字列。以下のいずれかの場所に、dynamodb 文字列を入力できます。

      • [classification] (分類) というフィールドにある、テーブルプロパティ (完全一致)。

      • テーブルのストレージディスクリプタにある [location] (ロケーション) フィールド (部分文字列一致)。

      • [classification] (分類) というフィールドにある、テーブルのストレージディスクリプタのパラメータ (完全一致)。

    • dynamo-db-flag – Athena DynamoDB コネクタが補足メタデータとして使用するテーブルが、データベースに含まれていることを示す文字列。これは、default 以外の AWS Glue データベースで必要となります。dynamo-db-flag プロパティは、多数のデータベースがあるアカウントにおいて、無関係なデータベースを除外する際の役に立ちます。この文字列は、AWS Glue データベースの [Location URI] (ロケーション URI) で指定する必要があります (部分文字列一致)。

    • sourceTable – DynamoDB 内にあるソーステーブル名を定義するオプションのテーブルプロパティ。AWS Glue テーブルの命名規則が原因で、DynamoDB テーブルと同じ名前で AWS Glue テーブルが作成できない場合に使用します。例えば、AWS Glue テーブルの名前に大文字は許可されていませんが、DynamoDB テーブル名としては使用が可能です。

    • columnMapping – カラム名のマッピングを定義するオプションのテーブルプロパティ。AWS Glue 列の命名規則が原因で、DynamoDB テーブルと同じ名前の列を持つ AWS Glue テーブルを作成できない場合に使用します。例えば、AWS Glue では列名として大文字は許可されていませんが、DynamoDB の列名では使用が可能です。このプロパティ値の形式は、col1=Col1、col2=Col2 のようにします。列マッピングは最上位の列名にのみ適用され、ネストされたフィールドには適用されないことに注意してください。

    • defaultTimeZone – 明示的なタイムゾーンが含まれない date 値、および datetime 値に適用される、オプションのテーブルプロパティ。データソースのデフォルトタイムゾーンと Athena セッションのタイムゾーンの間に不一致が生じないようにするためには、この値を設定することが適切です。

    • datetimeFormatMapping – AWS Glue date または timestamp データ型の列のデータを解析する際に、date または datetime 形式が使用されること指定する、オプションのテーブルプロパティ。このプロパティが指定されていない場合、コネクタは ISO-8601 形式が使用されるものと推定します。コネクタが date または datetime 形式を推定できない、あるいは未加工の文字列を解析できない場合、この値は結果から除外されます。

      datetimeFormatMapping 値は、col1=someformat1,col2=someformat2 形式である必要があります。以下に形式の例をいくつか示します。

      yyyyMMdd'T'HHmmss ddMMyyyy'T'HH:mm:ss

      列にタイムゾーンのない date または datetime 値が含まれており、その列を WHERE 句で使用したい場合には、対象の列で datetimeFormatMapping プロパティを設定します。

  2. 手動で列を定義する場合は、適切なデータ型を使用するように注意してください。クローラーを使用している場合は、クローラーが検出した列とタイプを確認します。

必要な許可

このコネクタが必要とする IAM ポリシーの細かな詳細については、athena-dynamodb.yaml ファイルの Policies セクションで確認してください。以下に簡単な要約を示します。

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

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

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

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

  • DynamoDB 読み取りアクセス – このコネクタでは、DescribeTableListSchemasListTablesQuery、および Scan のAPI オペレーションを使用します。

パフォーマンス

Athena DynamoDB コネクタは並列スキャンをサポートしており、DynamoDB クエリの一部として述語のプッシュダウンを試みます。X が異なる値を持つハッシュキー述語を使用すると、DynamoDB に対する X クエリ呼び出しが発生します。他のすべての述語シナリオでは、スキャン呼び出しの数が Y となります。この際 Y は、テーブルのサイズとプロビジョニングされたスループットに基づいて、ヒューリスティックに決定されます。

述語のプッシュダウンは、 クエリがスキャンするデータを削減するために Lambda 関数内で実行されます。ただし、列のサブセットを選択した場合は、クエリの実行時間が長くなることがあります。LIMIT 句はスキャンされるデータ量を減らしますが、述語が提供されない場合は、LIMIT 句を使用する SELECT クエリであっても、少なくとも 16MB のデータがスキャンされることを想定してください。

DynamoDB コネクタでは、LIMIT 句が適用されているかに関わらず、小さいデータセットよりも大きいデータセットに対する方が、多くのデータをスキャンします。例えば、クエリ SELECT * LIMIT 10000 は、小さな基盤データセットよりも大きな基盤データセットに対して、より多くのデータをスキャンします。

コスト

コネクタの使用料金は、基礎として使用されている AWS リソースによって異なります。スキャンを使用するクエリでは、大量のリードキャパシティーユニット (RCU) を利用することがあるため、「Amazon DynamoDB pricing」 (Amazon DynamoDB の料金) に記載された情報を慎重に検討してください。

以下も参照してください。

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