Amazon Athena Azure Synapse コネクタ
Azure Synapse Analytics
前提条件
Athena コンソールまたは AWS Serverless Application Repository を使用して AWS アカウント にコネクタをデプロイします。詳細については、「データソースコネクタのデプロイ」または「AWS Serverless Application Repository を使用したデータソースコネクタのデプロイ」を参照してください。
制限事項
-
DDL の書き込みオペレーションはサポートされていません。
-
マルチプレクサの設定では、スピルバケットとプレフィックスが、すべてのデータベースインスタンスで共有されます。
-
関連性のある Lambda 上限値。詳細については、AWS Lambda デベロッパーガイドの Lambda のクォータを参照してください。
-
フィルター条件では、
Date
とTimestamp
データ型を適切なデータ型に型変換する必要があります。 -
Real
およびFloat
型の負の値を検索するには、<=
または>=
演算子を使用します。 -
binary
、varbinary
、image
、およびrowversion
データ型はサポートされていません。
用語
Synapse コネクタに関連する用語を次に示します。
-
データベースインスタンス – オンプレミス、Amazon EC2、または Amazon RDS にデプロイされたデータベースの任意のインスタンス。
-
ハンドラー – データベースインスタンスにアクセスする Lambda ハンドラー。ハンドラーには、メタデータ用とデータレコード用があります。
-
メタデータハンドラー – データベースインスタンスからメタデータを取得する Lambda ハンドラー。
-
レコードハンドラー – データベースインスタンスからデータレコードを取得する Lambda ハンドラー。
-
複合ハンドラー — データベースインスタンスからメタデータとデータレコードの両方を取得する Lambda ハンドラー。
-
プロパティまたはパラメータ – ハンドラーがデータベース情報を抽出するために使用するデータベースプロパティ。これらのプロパティは Lambda の環境変数で設定します。
-
接続文字列 – データベースインスタンスへの接続を確立するために使用されるテキスト文字列。
-
カタログ – Athena に登録された AWS Glue ではないカタログ。これは、
connection_string
プロパティに必須のプレフィックスです。 -
マルチプレックスハンドラー – 複数のデータベース接続を受け入れて使用することが可能な Lambda ハンドラー。
パラメータ
このセクションの Lambda 環境変数を使用して Synapse コネクタを設定します。
接続文字列
次の形式の JDBC 接続文字列を使用して、データベースインスタンスに接続します。
synapse://${
jdbc_connection_string
}
マルチプレックスハンドラーの使用
マルチプレクサーを使用すると、単一の Lambda 関数から複数のデータベースインスタンスに接続できます。各リクエストはカタログ名によりルーティングされます。Lambda では以下のクラスを使用します。
Handler | Class |
---|---|
複合ハンドラー | SynapseMuxCompositeHandler |
メタデータハンドラー | SynapseMuxMetadataHandler |
レコードハンドラー | SynapseMuxRecordHandler |
マルチプレックスハンドラーのパラメータ
パラメータ | 説明 |
---|---|
$ |
必須。データベースインスタンスの接続文字列。環境変数には、Athena で使用されているカタログの名前をプレフィックスします。例えば、Athena に登録されたカタログが mysynapsecatalog の場合、環境変数の名前は mysynapsecatalog_connection_string になります。 |
default |
必須。デフォルトの接続文字列。この文字列は、カタログが lambda:${ AWS_LAMBDA_FUNCTION_NAME } の場合に使用されます。 |
synapse1
(デフォルト) と synapse2
の 2 つのデータベースインスタンスをサポートする Synapse MUX Lambda 関数用のプロパティを次に示します。
プロパティ | Value |
---|---|
default |
synapse://jdbc:synapse://synapse1.hostname:port;databaseName= |
synapse_catalog1_connection_string |
synapse://jdbc:synapse://synapse1.hostname:port;databaseName= |
synapse_catalog2_connection_string |
synapse://jdbc:synapse://synapse2.hostname:port;databaseName= |
認証情報の提供
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}"}
シークレット名を含む接続文字列の例
次の文字列はシークレット名 ${secret_name} を含んでいます。
synapse://jdbc:synapse://hostname:port;databaseName=
<database_name>
;${secret_name
}
次の例のように、コネクタはシークレット名を使用し、シークレットを取得してユーザー名とパスワードを提供します。
synapse://jdbc:synapse://hostname:port;databaseName=
<database_name>
;user=<user>
;password=<password>
単一接続ハンドラーの使用
次の単一接続のメタデータハンドラーとレコードハンドラーを使用して、単一の Synapse インスタンスに接続できます。
ハンドラーのタイプ | Class |
---|---|
複合ハンドラー | SynapseCompositeHandler |
メタデータハンドラー | SynapseMetadataHandler |
レコードハンドラー | SynapseRecordHandler |
単一接続ハンドラーのパラメータ
パラメータ | 説明 |
---|---|
default |
必須。デフォルトの接続文字列。 |
単一接続ハンドラーでは、1 つのデータベースインスタンスがサポートされます。また、default
接続文字列パラメータを指定する必要があります。他のすべての接続文字列は無視されます。
Lambda 関数でサポートされる単一の Synapse インスタンス用のプロパティ例を次に示します。
プロパティ | Value |
---|---|
default |
synapse://jdbc:sqlserver://hostname:port;databaseName= |
Active Directory 認証の設定
Amazon Athena Azure Synapse コネクタは Microsoft Active Directory 認証をサポートしています。開始する前に、Microsoft Azure ポータルで管理ユーザーを設定し、AWS Secrets Manager を使用してシークレットを作成する必要があります。
Active Directory 管理者ユーザーを設定するには
-
管理者権限を持つアカウントを使用して、https://portal.azure.com/
で Microsoft Azure ポータルにサインインします。 -
検索ボックスにAzure Synapse Analytics と入力し、[Azure Synapse Analytics] を選択します。
-
左側のメニューを開きます。
-
ナビゲーションペインで、[Azure Active Directory] を選択します。
-
[管理者の設定] タブで、Active Directory 管理者を新規ユーザーまたは既存のユーザーに設定します。
-
AWS Secrets Manager に、管理者のユーザー名とパスワードの認証情報を保存します。Secrets Manager でのシークレットの作成については、「AWS Secrets Manager シークレットを作成する」を参照してください。
Secrets Manager で自分のシークレットを確認するには
Secrets Manager のコンソール (https://console.aws.amazon.com/secretsmanager/
) を開きます。 -
ナビゲーションペインで [Secrets] (シークレット) を選択します。
-
[Secrets] (シークレット) ページで、自分のシークレットを選択します。
-
自分のシークレットの詳細ページで、[Retrieve secret value] (シークレットの値を取得する) を選択します。
接続文字列の変更
コネクタの Active Directory 認証を有効にするには、次の構文を使用して接続文字列を変更します。
synapse://jdbc:synapse://hostname:port;databaseName=
database_name
;authentication=ActiveDirectoryPassword;{secret_name}
ActiveDirectoryServicePrincipal の使用
Amazon Athena Azure Synapse コネクタも ActiveDirectoryServicePrincipal
をサポートしています。これを有効にするには、接続文字列を次のように変更します。
synapse://jdbc:synapse://hostname:port;databaseName=
database_name
;authentication=ActiveDirectoryServicePrincipal;{secret_name}
secret_name
の場合、ユーザー名にはアプリケーション ID またはクライアント ID を指定し、パスワードにはサービスプリンシパル ID のシークレットを指定します。
スピルパラメータ
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」を参照してください。 |
サポートされるデータ型
次の表に、Synapse と Apache Arrow に対応するデータ型を示します。
Synapse | 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) |
time | VARCHAR |
datetimeoffset | Date(MILLISECOND) |
char[n] | VARCHAR |
varchar[n/max] | VARCHAR |
nchar[n] | VARCHAR |
nvarchar[n/max] | VARCHAR |
パーティションと分割
パーティションは、varchar
型の単一パーティション列で表されます。Synapse は範囲によるパーティションをサポートしているため、パーティションは Synapse メタデータテーブルからパーティション列とパーティション範囲を抽出することによって実装されます。これらの範囲の値はスプリットの作成に使用されます。
パフォーマンス
列のサブセットを選択すると、クエリランタイムが大幅に遅くなります。同時実行が原因で、コネクタに著しいスロットリングが発生しています。
Athena Synapse コネクタは、述語のプッシュダウンを実行して、クエリによってスキャンされるデータを減少させます。単純な述語と複雑な式はコネクタにプッシュダウンされるため、スキャンされるデータ量が減少し、クエリ実行のランタイムが短縮されます。
述語
述語は、ブール値に照らして評価し、複数の条件に基づいて行をフィルタリングする SQL クエリの WHERE
句内の式です。Athena Synapse コネクタは、これらの式を組み合わせて Synapse に直接プッシュすることで、機能を強化し、スキャンされるデータ量を削減できます。
次の Athena Synapse コネクタ演算子は、述語のプッシュダウンをサポートしています。
-
ブーリアン: 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%');
パススルークエリ
Synapse コネクタは、パススルークエリをサポートします。パススルークエリは、テーブル関数を使用して、実行のためにクエリ全体をデータソースにプッシュダウンします。
Synapse でパススルークエリを使用するには、以下の構文を使用できます。
SELECT * FROM TABLE( system.query( query => '
query string
' ))
以下のクエリ例は、Synapse 内のデータソースにクエリをプッシュダウンします。クエリは customer
テーブル内のすべての列を選択し、結果を 10 個に制限します。
SELECT * FROM TABLE( system.query( query => 'SELECT * FROM customer LIMIT 10' ))
ライセンス情報
このコネクタを使用することにより、pom.xml
追加リソース
-
Amazon QuickSight と Amazon Athena の横串検索を使用して、Microsoft Azure Synapse データベースに保存されているデータに関するダッシュボードとビジュアライゼーションを構築する方法の記事については、AWS Big Data Blog の「Perform multi-cloud analytics using Amazon QuickSight, Amazon Athena Federated Query, and Microsoft Azure Synapse
」を参照してください。 最新の JDBC ドライバーのバージョン情報については、GitHub.com の Synapse コネクタ用の pom.xml
ファイルを参照してください。 このコネクタに関するその他の情報については、GitHub.com で対応するサイト
を参照してください。