

# Amazon Athena Vertica コネクタ
<a name="connectors-vertica"></a>

Vertica は、クラウドまたはオンプレミスでデプロイできる列指向データベースプラットフォームで、エクサバイト規模のデータウェアハウスをサポートします。Athena からの Vertica データソースのクエリには、フェデレーティッドクエリで Amazon Athena Vertica コネクタを使用できます。たとえば、Vertica 上のデータウェアハウスと Amazon S3 のデータレイクに対して分析クエリを実行できます。

このコネクタは、Glue 接続を使用して Glue の設定プロパティを一元化しません。接続設定は Lambda を介して行われます。

## 前提条件
<a name="connectors-vertica-prerequisites"></a>
+ Athena コンソールまたは AWS Serverless Application Repository を使用して AWS アカウント にコネクタをデプロイします。詳細については「[データソース接続を作成する](connect-to-a-data-source.md)」または「[AWS Serverless Application Repository を使用してデータソースコネクタをデプロイする](connect-data-source-serverless-app-repo.md)」を参照してください。
+ このコネクタを使用する際は、先に VPC とセキュリティグループをセットアップしておきます。詳細については、「[データソースコネクタまたは AWS Glue 接続用の VPC を作成する](athena-connectors-vpc-creation.md)」を参照してください。

## 制限事項
<a name="connectors-vertica-limitations"></a>
+ Athena Vertica コネクタは、Amazon S3 からエクスポートされた Parquet ファイルを読み取るので、コネクタのパフォーマンスが低下する可能性があります。大きなテーブルに対してクエリを実行する場合は、[CREATE TABLE AS (SELECT ...)](ctas.md) クエリおよび SQL 述語を使用することをお勧めします。
+ 現在、Athena フェデレーティッドクエリでの既知の問題のため、コネクタにより Vertica ではクエリされたテーブルのすべての列が Amazon S3 にエクスポートされますが、Athena コンソールの結果にはクエリされた列のみが表示されます。
+ DDL の書き込みオペレーションはサポートされていません。
+ 関連性のある Lambda 上限値。詳細については、「*AWS Lambda デベロッパーガイド*」の「[Lambda のクォータ](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)」を参照してください。

## ワークフロー
<a name="connectors-vertica-workflow"></a>

次の図は、Vertica コネクタを使用するクエリのワークフローを示しています。

![Amazon Athena からの Vertica クエリのワークフロー](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/connectors-vertica-1.png)


1. SQL クエリは、Vertica の 1 つ以上のテーブルに対して発行されます。

1. コネクタは SQL クエリを解析し、関連する部分を JDBC 接続経由で Vertica に送信します。

1. Vertica にアクセスするため、接続文字列には AWS Secrets Manager に保存されているユーザー名とパスワードを使用します。

1. コネクタは、次の例のように SQL クエリを Vertica の `EXPORT` コマンドでラップします。

   ```
   EXPORT TO PARQUET (directory = 's3://amzn-s3-demo-bucket/{{folder_name}}, 
      Compression='Snappy', fileSizeMB=64) OVER() as 
   SELECT
   PATH_ID,
   ...
   SOURCE_ITEMIZED,
   SOURCE_OVERRIDE
   FROM DELETED_OBJECT_SCHEMA.FORM_USAGE_DATA
   WHERE PATH_ID <= 5;
   ```

1. Vertica が SQL クエリを処理し、結果セットを Amazon S3 バケットに送信します。スループットを向上させるため、Vertica は `EXPORT` オプションを使用して、複数の Parquet ファイルの書き込みオペレーションを並列化します。

1. Athena は Amazon S3 バケットをスキャンして、結果セット用に読み込むファイルの数を決定します。

1. Athena は Lambda 関数を複数回呼び出し、Apache `ArrowReader` を使用して結果のデータセットから Parquet ファイルを読み取ります。複数回呼び出しを行うことで、Athena は Amazon S3 ファイルの読み取りを並列化し、1 秒あたり最大 100 GB のスループットを達成できます。

1. Athena は、Vertica から返されたデータをデータレイクからスキャンされたデータで処理し、その結果を返します。

## 用語
<a name="connectors-vertica-terms"></a>

Vertica コネクタに関連する用語を次に示します。
+ **データベースインスタンス** — Amazon EC2 にデプロイされた Vertica データベースの任意のインスタンス。
+ **ハンドラー** – データベースインスタンスにアクセスする Lambda ハンドラー。ハンドラーには、メタデータ用とデータレコード用があります。
+ **メタデータハンドラー** – データベースインスタンスからメタデータを取得する Lambda ハンドラー。
+ **レコードハンドラー** – データベースインスタンスからデータレコードを取得する Lambda ハンドラー。
+ **複合ハンドラー** — データベースインスタンスからメタデータとデータレコードの両方を取得する Lambda ハンドラー。
+ **プロパティまたはパラメータ** – ハンドラーがデータベース情報を抽出するために使用するデータベースプロパティ。これらのプロパティは Lambda の環境変数で設定します。
+ **接続文字列** – データベースインスタンスへの接続を確立するために使用されるテキスト文字列。
+ **カタログ** – Athena に登録された AWS Glue ではないカタログ。これは、`connection_string` プロパティに必須のプレフィックスです。

## パラメータ
<a name="connectors-vertica-parameters"></a>

このセクションのパラメータを使用して Vertica コネクタを設定します。

### AWS Glue Data Catalog フェデレーションコネクタ
<a name="connectors-vertica-gc"></a>

Glue 接続オブジェクトを使用して Vertica コネクタを設定することをお勧めします。そのためには、Vertica コネクタ Lambda の `glue_connection` 環境変数を、使用する Glue 接続の名前に設定します。

**Glue 接続プロパティ**

次のコマンドを使用して、Glue 接続オブジェクトのスキーマを取得します。このスキーマには、接続を制御するために使用できるすべてのパラメータが含まれています。

```
aws glue describe-connection-type --connection-type VERTICA
```

**Lambda 環境プロパティ**

次の Lambda 環境プロパティは、お客様のアカウントの Lambda 関数でコネクタを使用する場合にのみ適用されます。
+ **glue\_connection** – フェデレーションコネクタに関連付けられた Glue 接続の名前を指定します。
+ **casing\_mode** – (オプション) スキーマ名とテーブル名の大文字と小文字の区別を処理する方法を指定します。`casing_mode` パラメータは、次の値を使用して大文字と小文字の区別に関する動作を指定します。
  + **none** – 指定されたスキーマ名とテーブル名の大文字と小文字は変更しないでください。これは、グルー接続が関連付けられているコネクタのデフォルトです。
  + **upper** – 指定されたすべてのスキーマ名とテーブル名を大文字にします。
  + **lower** – 指定されたすべてのスキーマ名とテーブル名を小文字にします。

**注記**  
AWS Glue Data Catalog フェデレーション接続を使用するすべてのコネクタは、認証情報を保存するために AWS Secrets Manager を使用する必要があります。
AWS Glue Data Catalog フェデレーション接続を使用して作成された Vertica コネクタは、マルチプレックスハンドラーの使用をサポートしていません。
AWS Glue Data Catalog フェデレーション接続を使用して作成された Vertica コネクタは、`ConnectionSchemaVersion` 2 のみをサポートします。

### Athena データカタログフェデレーションコネクタ
<a name="connectors-vertica-legacy"></a>

Amazon Athena Vertica コネクタは Lambda 環境変数を使用して、設定オプションを公開します。次の Lambda 環境変数を使用して、コネクタを設定できます。
+  **AthenaCatalogName** — Lambda 関数名 
+  **ExportBucket** — Vertica のクエリ結果がエクスポートされる Amazon S3 バケット。
+  **SpillBucket** — この関数がデータを提供できる Amazon S3 バケットの名前。
+  **SpillPrefix** — この関数がデータを提供できる `SpillBucket` の場所のプレフィックス。
+  **SecurityGroupIds** — Lambda 関数に適用する必要があるセキュリティグループに対応する 1 つ以上の ID (例: `sg1`、`sg2`、または `sg3`)。
+  **SubnetIds** — Lambda 関数がデータソースへのアクセスに使用できるサブネットに対応する 1 つ以上のサブネット ID (例: `subnet1`、または `subnet2`)。
+  **SecretNameOrPrefix** — この関数がアクセスできる Secrets Manager 内の名前セットの名前またはプレフィックス (例: `vertica-*`)。
+  **VerticaConnectionString** — カタログ固有の接続が定義されていない場合にデフォルトで使用される Vertica 接続の詳細。オプションで、文字列は AWS Secrets Manager 構文を使用できます (例: `${secret_name}`)。
+  **VPC ID** — Lambda 関数にアタッチする VPC ID。

#### 接続文字列
<a name="connectors-vertica-connection-string"></a>

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

```
vertica://jdbc:vertica://{{host_name}}:{{
                        port}}/{{database}}?user={{vertica-username}}&password=
                        {{vertica-password}}
```

#### 単一接続ハンドラーの使用
<a name="connectors-vertica-using-a-single-connection-handler"></a>

次の単一接続のメタデータハンドラーとレコードハンドラーを使用して、単一の Vertica インスタンスに接続できます。


****  

| ハンドラーのタイプ | Class | 
| --- | --- | 
| 複合ハンドラー | VerticaCompositeHandler | 
| メタデータハンドラー | VerticaMetadataHandler | 
| レコードハンドラー | VerticaRecordHandler | 

#### 単一接続ハンドラーのパラメータ
<a name="connectors-vertica-single-connection-handler-parameters"></a>


****  

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

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

#### 認証情報の提供
<a name="connectors-vertica-providing-credentials"></a>

JDBC 接続文字列の中でデータベースのユーザー名とパスワードを指定するには、接続文字列のプロパティ、もしくは AWS Secrets Manager を使用します。
+ **接続文字列** – ユーザー名とパスワードを、JDBC 接続文字列のプロパティとして指定できます。
**重要**  
セキュリティのベストプラクティスとして、環境変数や接続文字列にハードコードされた認証情報を使用しないでください。ハードコードされたシークレットを AWS Secrets Manager に移動する方法については、「*AWS Secrets Manager ユーザーガイド*」の「[ハードコードされたシークレットを AWS Secrets Manager に移動する](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html)」を参照してください。
+ **AWS Secrets Manager** – Athena フェデレーティッドクエリ機能を AWS Secrets Manager で使用するには、Secrets Manager に接続するための[インターネットアクセス](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)または [VPC エンドポイント](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)が、Lambda 関数に接続されている VPC に必要です。

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

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

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**シークレット名を含む接続文字列の例**  
次の文字列には、シークレット名 ${`vertica-username`} および `${vertica-password}` が含まれています。

```
vertica://jdbc:vertica://{{
                        host_name}}:{{port}}/{{database}}?user=${vertica-username}&password=${vertica-password}
```

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

```
vertica://jdbc:vertica://{{
                        host_name}}:{{port}}/{{database}}?user=sample-user&password=sample-password
```

現在、Vertica コネクタは `vertica-username` と `vertica-password` の JDBC プロパティを認識します。

#### スピルパラメータ
<a name="connectors-vertica-spill-parameters"></a>

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](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)」を参照してください。 | 

## サポートされるデータ型
<a name="connectors-vertica-data-type-support"></a>

次の表は、Vertica コネクタ用にサポートされているデータ型です。


****  

| ブール値 | 
| --- | 
| BigInt | 
| ショート | 
| 整数 | 
| Long | 
| 浮動小数点数 | 
| Double | 
| 日付 | 
| Varchar | 
| バイト | 
| BigDecimal | 
| Varchar としての TimeStamp | 

## パフォーマンス
<a name="connectors-vertica-performance"></a>

Lambda 関数は射影プッシュダウンを実行して、クエリがスキャンするデータを減少させます。`LIMIT` 句はスキャンされるデータ量を削減しますが、述語を提供しない場合、`LIMIT` 句を含む `SELECT` クエリは少なくとも 16 MB のデータをスキャンすることを想定する必要があります。Vertica コネクタは、同時実行によるスロットリングに強いです。

## パススルークエリ
<a name="connectors-vertica-passthrough-queries"></a>

Vertica コネクタは、[パススルークエリ](federated-query-passthrough.md)をサポートします。パススルークエリは、テーブル関数を使用して、実行のためにクエリ全体をデータソースにプッシュダウンします。

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

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

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

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

## ライセンス情報
<a name="connectors-vertica-license-information"></a>

このコネクタを使用することにより、[pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-vertica/pom.xml) ファイル内のリストにある、サードパーティのコンポーネントが使用されることを承認し、 GitHub.com にある [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-vertica/LICENSE.txt) ファイルに記載されている、個別のサードパーティライセンスの使用条件に同意したとみなされます。

## その他のリソース
<a name="connectors-vertica-additional-resources"></a>

最新の JDBC ドライバーのバージョン情報については、GitHub.com で Vertica コネクタ用の [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-vertica/pom.xml) ファイルを参照してください。

このコネクタの追加情報については、GitHub.com の[対応するサイト](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-vertica)および *AWS ビッグデータブログ*の「[Athena Federated Query SDK を使用して Amazon Athena で Vertica データソースのクエリを実行する](https://aws.amazon.com/blogs/big-data/querying-a-vertica-data-source-in-amazon-athena-using-the-athena-federated-query-sdk/)」を参照してください。