Amazon Athena Azure Data Lake Storage (ADLS) Gen2 コネクタ - Amazon Athena

Amazon Athena Azure Data Lake Storage (ADLS) Gen2 コネクタ

Azure Data Lake Storage (ADLS) Gen2 用の Amazon Athena コネクタを使用すれば、Amazon Athena で ADLS に保存されたデータに SQL クエリを実行できます。Athena は、データレイクに保存されているファイルに直接アクセスすることはできません。

  • ワークフロー – このコネクタは、com.microsoft.sqlserver.jdbc.SQLServerDriver ドライバーを使用する JDBC インターフェイスを実装します。このコネクタが Azure Synapse エンジンにクエリを渡し、その後、Azure Synapse エンジンがデータレイクにアクセスします。

  • データ処理と S3 – 通常、Lambda コネクタは、Amazon S3 に転送することなく、データを直接クエリします。ただし、Lambda 関数から返されたデータが Lambda の制限を超えると、そのデータは、Athena が超過分を読み取れるように指定した Amazon S3 スピルバケットに書き込まれます。

  • AAD 認証 – AAD は、Azure Synapse コネクタの認証方法として使用できます。AAD を使用するには、コネクタが使用する JDBC 接続文字列に、authentication=ActiveDirectoryServicePrincipalAADSecurePrincipalId、および AADSecurePrincipalSecret の URL パラメータが含まれている必要があります。これらのパラメータは、直接渡すことも、Secrets Manager から渡すこともできます。

前提条件

制約事項

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

  • マルチプレクサの設定では、スピルバケットとプレフィックスが、すべてのデータベースインスタンスで共有されます。

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

  • フィルター条件における日付とタイムスタンプのデータ型は、適切なデータ型にキャストする必要があります。

用語

次の用語は、Azure Data Lake Storage Gen2 コネクタに関連しています。

  • データベースインスタンス – オンプレミス、Amazon EC2、または Amazon RDS にデプロイされたデータベースの任意のインスタンス。

  • ハンドラー – データベースインスタンスにアクセスする Lambda ハンドラー。ハンドラーには、メタデータ用とデータレコード用があります。

  • メタデータハンドラー – データベースインスタンスからメタデータを取得する Lambda ハンドラー。

  • レコードハンドラー – データベースインスタンスからデータレコードを取得する Lambda ハンドラー。

  • 複合ハンドラー — データベースインスタンスからメタデータとデータレコードの両方を取得する Lambda ハンドラー。

  • プロパティまたはパラメータ – ハンドラーがデータベース情報を抽出するために使用するデータベースプロパティ。これらのプロパティは Lambda の環境変数で設定します。

  • 接続文字列 – データベースインスタンスへの接続を確立するために使用されるテキスト文字列。

  • カタログ – Athena に登録された AWS Glue ではないカタログ。これは、connection_string プロパティに必須のプレフィックスです。

  • マルチプレックスハンドラー – 複数のデータベース接続を受け入れて使用することが可能な Lambda ハンドラー。

パラメータ

Azure Data Lake Storage Gen2 コネクタを設定するには、このセクションの Lambda 環境変数を使用します。

接続文字列

次の形式の JDBC 接続文字列を使用して、データベースインスタンスに接続します。

datalakegentwo://${jdbc_connection_string}

マルチプレックスハンドラーの使用

マルチプレクサーを使用すると、単一の Lambda 関数から複数のデータベースインスタンスに接続できます。各リクエストはカタログ名によりルーティングされます。Lambda では以下のクラスを使用します。

Handler Class
複合ハンドラー DataLakeGen2MuxCompositeHandler
メタデータハンドラー DataLakeGen2MuxMetadataHandler
レコードハンドラー DataLakeGen2MuxRecordHandler

マルチプレックスハンドラーのパラメータ

パラメータ 説明
$catalog_connection_string 必須。データベースインスタンスの接続文字列。環境変数には、Athena で使用されているカタログの名前をプレフィックスします。例えば、Athena に登録されたカタログが mydatalakegentwocatalog の場合、環境変数の名前は mydatalakegentwocatalog_connection_string になります。
default 必須。デフォルトの接続文字列。この文字列は、カタログが lambda:${AWS_LAMBDA_FUNCTION_NAME} の場合に使用されます。

以下は、2 つのデータベースインスタンス (デフォルト値の datalakegentwo1、および datalakegentwo2) をサポートする、DataLakeGen2 MUX Lambda 関数のプロパティ例です。

プロパティ
default datalakegentwo://jdbc:sqlserver://adlsgentwo1.hostname:port;databaseName=database_name;${secret1_name}
datalakegentwo_catalog1_connection_string datalakegentwo://jdbc:sqlserver://adlsgentwo1.hostname:port;databaseName=database_name;${secret1_name}
datalakegentwo_catalog2_connection_string datalakegentwo://jdbc:sqlserver://adlsgentwo2.hostname:port;databaseName=database_name;${secret2_name}

認証情報の提供

JDBC 接続文字列の中でデータベースのユーザー名とパスワードを指定するには、接続文字列のプロパティ、もしくは AWS Secrets Manager を使用します。

  • 接続文字列 – ユーザー名とパスワードを、JDBC 接続文字列のプロパティとして指定できます。

    重要

    セキュリティ上のベストプラクティスとして、環境変数や接続文字列にハードコードされた認証情報を使用しないでください。ハードコードされたシークレットを AWS Secrets Manager に移動する方法については、「AWS Secrets Manager ユーザーガイド」の「ハードコードされたシークレットを AWS Secrets Manager に移動する」を参照してください。

  • AWS Secrets Manager – Athena の横串検索機能を AWS Secrets Manager で使用するには、Secrets Manager に接続するためのインターネットアクセスまたは VPC エンドポイントが、Lambda 関数に接続されている VPC に必要です。

    JDBC 接続文字列には、AWS Secrets Manager のシークレットの名前を含めることができます。コネクタは、このシークレット名を Secrets Manager の username および password の値に置き換えます。

    Amazon RDS データベースインスタンスには、このサポートが緊密に統合されています。Amazon RDS を使用している場合は、AWS Secrets Manager と認証情報ローテーションの使用を強くお勧めします。データベースで Amazon RDS を使用していない場合は、認証情報を次の形式で JSON として保存します。

    {"username": "${username}", "password": "${password}"}
シークレット名を含む接続文字列の例

次の文字列には、シークレット名 ${secret1_name} が含まれています。

datalakegentwo://jdbc:sqlserver://hostname:port;databaseName=database_name;${secret1_name}

次の例のように、コネクタはシークレット名を使用し、シークレットを取得してユーザー名とパスワードを提供します。

datalakegentwo://jdbc:sqlserver://hostname:port;databaseName=database_name;user=user_name;password=password

単一接続ハンドラーの使用

単一の Azure Data Lake Storage Gen2 インスタンスに接続するには、次の単一接続メタデータとレコードハンドラーを使用します。

ハンドラーのタイプ Class
複合ハンドラー DataLakeGen2CompositeHandler
メタデータハンドラー DataLakeGen2MetadataHandler
レコードハンドラー DataLakeGen2RecordHandler

単一接続ハンドラーのパラメータ

パラメータ 説明
default 必須。デフォルトの接続文字列。

単一接続ハンドラーでは、1 つのデータベースインスタンスがサポートされます。また、default 接続文字列パラメータを指定する必要があります。他のすべての接続文字列は無視されます。

Lambda 関数でサポートされる単一の Azure Data Lake Storage Gen2 インスタンス用のプロパティ例を次に示します。

プロパティ
default datalakegentwo://jdbc:sqlserver://hostname:port;databaseName=;${secret_name}

スピルパラメータ

Lambda SDK は Amazon S3 にデータをスピルする可能性があります。同一の Lambda 関数によってアクセスされるすべてのデータベースインスタンスは、同じ場所にスピルします。

パラメータ 説明
spill_bucket 必須。スピルバケット名。
spill_prefix 必須。スピルバケットのキープレフィックス
spill_put_request_headers (オプション) スピルに使用される Amazon S3 の putObject リクエスト (例:{"x-amz-server-side-encryption" : "AES256"}) における、リクエストヘッダーと値に関する JSON でエンコードされたマッピング。利用可能な他のヘッダーについては、「Amazon Simple Storage Service API リファレンス」の「PutObject」を参照してください。

サポートされるデータ型

次の表では、ADLS Gen2 と Arrow に対応させてデータ型を示しています。

ADLS Gen2 Arrow
bit TINYINT
tinyint SMALLINT
smallint SMALLINT
整数 INT
bigint BIGINT
decimal DECIMAL
numeric FLOAT8
smallmoney FLOAT8
money DECIMAL
float[24] FLOAT4
float[53] FLOAT8
real FLOAT4
datetime Date(MILLISECOND)
datetime2 Date(MILLISECOND)
smalldatetime Date(MILLISECOND)
date Date(DAY)
時系 VARCHAR
datetimeoffset Date(MILLISECOND)
char[n] VARCHAR
varchar[n/max] VARCHAR

パーティションと分割

Azure Data Lake Storage Gen2 は、データファイルの保存に Hadoop 互換の Gen2 ブロブストレージを使用します。これらのファイルからのデータは、Azure Synapse エンジンによりクエリされます。Azure Synapse エンジンは、ファイルシステムに保存されている Gen2 データを外部テーブルとして扱います。パーティションはデータの型に基づいて実装されます。データがすでにパーティション化されており、Gen 2 ストレージシステム内で分散されている場合、コネクタは、データを単一のスプリットとして取得します。

パフォーマンス

Azure Data Lake Storage Gen2 コネクタは、複数のクエリを一度に実行するとクエリのパフォーマンスが遅くなり、スロットリングの対象となります。

Athena Azure Data Lake Storage Gen2 コネクタは、述語のプッシュダウンを実行して、クエリによってスキャンされるデータを減少させます。単純な述語と複雑な式はコネクタにプッシュダウンされるため、スキャンされるデータ量が減少し、クエリ実行のランタイムが短縮されます。

述語

述語は、ブール値に照らして評価し、複数の条件に基づいて行をフィルタリングする SQL クエリの WHERE 句内の式です。Athena Azure Data Lake Storage Gen2 コネクタは、これらの式を組み合わせて Azure Data Lake Storage Gen2 に直接プッシュすることで、機能を強化し、スキャンされるデータ量を削減できます。

次の Athena Azure Data Lake Storage Gen2 コネクタ演算子は、述語のプッシュダウンをサポートしています。

  • ブーリアン: AND、OR、NOT

  • 等値: EQUAL、NOT_EQUAL、LESS_THAN、LESS_THAN_OR_EQUAL、GREATER_THAN、GREATER_THAN_OR_EQUAL、NULL_IF、IS_NULL

  • Arithmetic: ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE

  • その他: LIKE_PATTERN、IN

組み合わせたプッシュダウンの例

クエリ機能を強化するには、次の例のようにプッシュダウンタイプを組み合わせます。

SELECT * FROM my_table WHERE col_a > 10 AND ((col_a + col_b) > (col_c % col_d)) AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%');

パススルークエリ

Azure Data Lake Storage Gen2 コネクタは、パススルークエリをサポートします。パススルークエリは、テーブル関数を使用して、実行のためにクエリ全体をデータソースにプッシュダウンします。

Azure Data Lake Storage Gen2 でパススルークエリを使用するには、以下の構文を使用できます。

SELECT * FROM TABLE( system.query( query => 'query string' ))

以下のクエリ例は、Azure Data Lake Storage Gen2 内のデータソースにクエリをプッシュダウンします。クエリは customer テーブル内のすべての列を選択し、結果を 10 個に制限します。

SELECT * FROM TABLE( system.query( query => 'SELECT * FROM customer LIMIT 10' ))

ライセンス情報

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

追加リソース

JDBC ドライバーの最新バージョンの情報については、GitHub.com で、Azure Data Lake Storage Gen2 コネクタ用の pom.xml ファイルを確認してください。

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