13 Redshiftイベント・ハンドラの使用
Amazon Redshiftは、ペタバイト規模の完全マネージド型クラウド・データ・ウェアハウス・サービスです。Redshiftイベント・ハンドラの目的は、操作をRedshift表に適用することです。
「ファイル・ライター・ハンドラの使用」を参照してください。
- 詳細な機能
Redshiftイベント・ハンドラは、S3イベント・ハンドラの出力に接続されたダウンストリーム・イベント・ハンドラとして使用してください。S3イベント・ハンドラは、ファイル・ライター・ハンドラによって生成されたファイルをAmazon S3にロードします。 - 操作集計
- サポート対象外の操作および制限
- 非圧縮のUPDATEレコード
Redshiftに適用する証跡ファイルに非圧縮のUPDATE操作レコードが含まれていることが必須です。これは、UPDATE
操作に、更新する行の完全なイメージが含まれていることを意味します。 - データ・ロード・プロセス中のエラー
AWS S3から一時ステージング表への操作データのステージングおよびターゲット表の更新は、単一のトランザクション内で行われます。エラーが発生した場合、トランザクション全体がロールバックされ、Replicatプロセスは異常終了(ABEND)します。 - トラブルシューティングと診断
- クラスパス
Redshift適用は、アップストリームのファイル・ライター・ハンドラとS3イベント・ハンドラに依存します。 - 構成
- Redshift COPY SQL認可
Redshiftイベント・ハンドラは、COPY SQL
を使用して、Amazon Web Services (AWS) S3バケットのステージングされたファイルを読み取ります。COPY SQL
問合せがAWS S3のファイルにアクセスするために認可資格証明が必要になる場合があります。
13.1 詳細な機能
Redshiftイベント・ハンドラは、S3イベント・ハンドラの出力に接続されたダウンストリーム・イベント・ハンドラとして使用してください。S3イベント・ハンドラは、ファイル・ライター・ハンドラによって生成されたファイルをAmazon S3にロードします。
Redshiftイベント・ハンドラは、COPY SQLを使用して、S3で使用可能な操作データを一時Redshiftステージング表にバルク・ロードします。その後、ステージング表のデータを使用してターゲット表を更新します。すべてのSQL操作は、スループットを改善するためにバッチで実行されます。
親トピック: Redshiftイベント・ハンドラの使用
13.2 操作集計
- メモリー内での集計
操作データをS3にロードする前に、証跡ファイル内の操作が集計されます。集計操作は、同じ行に対する複数の操作をしきい値に基づいて単一の出力操作に集計(マージ/圧縮)するプロセスです。 - ステージング表へのSQLポスト・ロード・データを使用した集計
この集計操作では、インメモリー操作集計を実行する必要はありません。一時ステージング表にロードされた操作データは、ステージング表にキーごとに1行のみが存在するように、SQL問合せを使用して集計されます。
親トピック: Redshiftイベント・ハンドラの使用
13.2.1 メモリー内での集計
操作データをS3にロードする前に、証跡ファイル内の操作が集計されます。集計操作は、同じ行に対する複数の操作をしきい値に基づいて単一の出力操作に集計(マージ/圧縮)するプロセスです。
表13-1 構成プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
オプション |
|
|
操作レコードの主キーに基づく集計操作。 |
親トピック: 操作集計
13.2.2 ステージング表へのSQLポスト・ロード・データを使用した集計
この集計操作では、インメモリー集計操作を実行する必要はありません。一時ステージング表にロードされた操作データは、ステージング表にキーごとに1行のみが存在するように、SQL問合せを使用して集計されます。
表13-2 構成プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
gg.eventhandler.name.aggregateStagingTableRows |
オプション | True| False |
False |
ターゲット表を更新する前に、SQLを使用してステージング表データを集計します。 |
親トピック: 操作集計
13.3 サポート対象外の操作および制限
次の操作はRedshiftハンドラでサポートされていません:
- DDLの変更はサポートされません。
- TIMESTAMPおよびTIMESTAMP WITH TIME ZONEのデータ型:サポートされる最大精度はマイクロ秒までで、ナノ秒部分は切り捨てられます。これは、Redshift COPY SQLで確認された制限です。
- Redshift COPY SQLには、すべてのソースからの単一の入力行の最大サイズが4 MBであるという制限があります。
親トピック: Redshiftイベント・ハンドラの使用
13.4 非圧縮のUPDATEレコード
Redshiftに適用する証跡ファイルに非圧縮のUPDATE操作レコードが含まれていることが必須です。つまり、UPDATE
操作には、更新する行の完全なイメージが含まれていることを意味します。
UPDATE
レコードにない列がある場合、ターゲットではそのような列はnullとして更新されます。gg.abend.on.missing.columns=true
パラメータを設定すると、Replicatは圧縮された更新証跡レコードの検出でフェイルファストを実行できます。これは推奨される設定です。
親トピック: Redshiftイベント・ハンドラの使用
13.5 データ・ロード・プロセス中のエラー
AWS S3から一時ステージング表への操作データのステージングおよびターゲット表の更新は、単一のトランザクション内で行われます。エラーが発生した場合、トランザクション全体がロールバックされ、Replicatプロセスは異常終了(ABEND)します。
COPY SQLにエラーがある場合は、Redshiftシステム表stl_load_errors
も問合せされ、ハンドラのログ・ファイル内でエラー・トレースが使用可能になります。
親トピック: Redshiftイベント・ハンドラの使用
13.6 トラブルシューティングと診断
- Redshiftへの接続の問題
- JDBC接続URL、ユーザー名およびパスワードを検証してください。
- http/httpsプロキシが有効かどうか確認します。通常、Redshiftエンドポイントにはプロキシ経由でアクセスできません。
- ターゲット表に適用されないDDLおよび切り捨て操作: RedshiftハンドラはDDLを無視し、ソース証跡ファイルのレコードを切り捨てます。
- ターゲット表の存在:適用プロセスを開始する前に、Redshiftターゲット表が存在している必要があります。ターゲット表は、主キー、ソート・キー、パーティション分散キーの列を使用して設計する必要があります。証跡ファイルの列メタデータに基づいた近似処理が常に正確であるとはかぎりません。したがって、ターゲット表が欠落している場合、Redshift適用が異常終了(
ABEND
)します。 - インメモリー集計操作(
gg.aggregagte.operations=true
)はメモリーを多く使用し、SQLを使用する集計操作(gg.eventhandler.name.aggregateStagingTableRows=true
)は、Redshiftデータベースでより多くのSQL処理が必要になります。これらの構成は相互に排他的であり、1度に有効にできるのは1つのみです。Oracle内でのテストにより、インメモリー集計操作の方が適用レートが高いことが判明しました。これは、すべてのカスタマ・デプロイメントで常にそうであるとはかぎりません。 - 適用プロセスに関する診断情報はハンドラのログ・ファイルに記録されます。
- インメモリー集計操作時間(ミリ秒単位):
INFO 2018-10-22 02:53:57.000980 [pool-5-thread-1] - Merge statistics ********START*********************************
INFO 2018-10-22 02:53:57.000980 [pool-5-thread-1] - Number of update operations merged into an existing update operation: [232653]
INFO 2018-10-22 02:53:57.000980 [pool-5-thread-1] - Time spent aggregating operations : [22064]
INFO 2018-10-22 02:53:57.000980 [pool-5-thread-1] - Time spent flushing aggregated operations : [36382]
INFO 2018-10-22 02:53:57.000980 [pool-5-thread-1] - Merge statistics ********END***********************************
- SQL問合せのステージングおよびロード処理時間(ミリ秒単位)
INFO 2018-10-22 02:54:19.000338 [pool-4-thread-1] - Stage and load statistics ********START*********************************
INFO 2018-10-22 02:54:19.000338 [pool-4-thread-1] - Time spent for staging process [277093]
INFO 2018-10-22 02:54:19.000338 [pool-4-thread-1] - Time spent for load process [32650]
INFO 2018-10-22 02:54:19.000338 [pool-4-thread-1] - Stage and load statistics ********END***********************************
- SQLを使用する集計操作が有効な場合、ステージング時間(ミリ秒)には追加の統計も含まれます。
- コンポーネントの共存: Replicatプロセスが実行されているマシンの場所/リージョン、AWS S3バケット・リージョンおよびRedshiftクラスタ・リージョンは、適用プロセスの全体的なスループットに影響を与えます。データ・フローは次のとおりです:
GoldenGate => AWS S3 => AWS Redshift
。最高のスループットを得るには、コンポーネントをできるだけ近くに配置する必要があります。
親トピック: Redshiftイベント・ハンドラの使用
13.7 クラスパス
Redshift適用は、アップストリームのファイル・ライター・ハンドラとS3イベント・ハンドラに依存します。
S3イベント・ハンドラを実行するために必要なjarをgg.classpathに含めます。「S3イベント・ハンドラの使用」を参照してください。Redshiftイベント・ハンドラは、Redshift JDBCドライバを使用します。次の例に示すように、必ずgg.classpath
にjarファイルを含めてください。
gg.classpath=aws-java-sdk-1.11.356/lib/*:aws-java-sdk-1.11.356/third-party/lib/*:./RedshiftJDBC42-no-awssdk-1.2.8.1005.jar
親トピック: Redshiftイベント・ハンドラの使用
13.8 構成
自動構成
AWS Redshiftデータ・ウェアハウスのレプリケーションには、ファイル・ライター・ハンドラ、S3イベント・ハンドラ、Redshiftイベント・ハンドラなどの複数のコンポーネントの構成が含まれます。これらのコンポーネントは自動構成機能によって自動的に構成されるため、必要な構成の実行は最小限になります。自動構成によって変更されたプロパティもハンドラのログ・ファイルに記録されます。
gg.target=redshift
を設定します。gg.target
Required
Legal Value: redshift
Default: None
Explanation: Enables replication to Redshift target
Redshiftターゲットに複製する場合、S3イベント・ハンドラ名およびRedshiftイベント・ハンドラ名はカスタマイズできません。
ファイル・ライター・ハンドラの構成
ファイル・ライター・ハンドラ名は、値redshift
に事前設定されています。ファイル・ライター・ハンドラのプロパティを編集する例を次に示します。gg.handler.redshift.pathMappingTemplate=./dirout
S3イベント・ハンドラの構成
S3イベント・ハンドラ名は、値s3に事前設定されています。S3イベント・ハンドラのプロパティを編集する例を次に示します。gg.eventhandler.s3.bucketMappingTemplate=bucket1
Redshiftイベント・ハンドラ構成
Redshiftイベント・ハンドラ名は、値redshiftに事前設定されています。
表13-3 プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
gg.eventhandler.redshift.connectionURL |
必須 | Redshift JDBC接続URL | なし |
Redshift JDBC接続URLを設定します。 例: |
gg.eventhandler.redshift.UserName |
必須 | JDBCユーザー名 | なし | Redshiftデータベースのユーザー名を設定します。 |
gg.eventhandler.redshift.Password |
必須 | JDBCパスワード | なし | Redshiftデータベースのパスワードを設定します。 |
gg.eventhandler.redshift.awsIamRole |
オプション | AWSロールARN (arn:aws:iam::<aws_account_id>:role/<role_name> の形式) |
なし | RedshiftクラスタがAWS S3バケット内のオブジェクトにアクセスするためのCOPY SQL を実行するために認証および認可に使用するAWS IAMロールARN。
|
gg.eventhandler.redshift.useAwsSecurityTokenService |
オプション | true | false |
値は、アップストリームのs3イベント・ハンドラgg.eventhandler.s3.enableSTS に設定されている構成プロパティから設定されます |
認可にAWSセキュリティ・トークン・サービスを使用します。詳細は、Redshift COPY SQL認可を参照してください。 |
gg.eventhandler.redshift.awsSTSEndpoint |
オプション | 有効なHTTPS URL。 | 値は、アップストリームのs3イベント・ハンドラgg.eventhandler.s3.stsURL に設定されている構成プロパティから設定されます。
|
AWS STSエンドポイント文字列。たとえば: https://sts.us-east-1.amazonaws.com。詳細は、Redshift COPY SQL認可を参照してください。 |
gg.eventhandler.redshift.awsSTSRegion |
オプション | 有効なAWSリージョン。 | 値は、アップストリームのs3イベント・ハンドラgg.eventhandler.s3.stsRegion に設定されている構成プロパティから設定されます。
|
AWS STSリージョン。たとえば、us-east-1 です。詳細は、Redshift COPY SQL認可を参照してください。
|
エンドツーエンドの構成
FWハンドラ、S3およびRedshiftイベント・ハンドラの自動構成を使用するエンド-エンド構成の例を次に示します。
サンプル・プロパティは、(Oracle GoldenGate Classicインストールの)次の場所にあります。<oggbd_install_dir>/AdapterExamples/big-data/redshift-via-s3/rs.props
# Configuration to load GoldenGate trail operation records # into Amazon Redshift by chaining # File writer handler -> S3 Event handler -> Redshift Event handler. # Note: Recommended to only edit the configuration marked as TODO
gg.target=redshift #The S3 Event Handler #TODO: Edit the AWS region gg.eventhandler.s3.region=<aws region> #TODO: Edit the AWS S3 bucket gg.eventhandler.s3.bucketMappingTemplate<s3bucket>
#The Redshift Event Handler #TODO: Edit ConnectionUrl gg.eventhandler.redshift.connectionURL=jdbc:redshift://aws-redshift-instance.cjoaij3df5if.us-east-2.redshift.amazonaws.com:5439/mydb #TODO: Edit Redshift user name gg.eventhandler.redshift.UserName=<db user name> #TODO: Edit Redshift password gg.eventhandler.redshift.Password=<db password> #TODO:Set the classpath to include AWS Java SDK and Redshift JDBC driver. gg.classpath=aws-java-sdk-1.11.356/lib/*:aws-java-sdk-1.11.356/third-party/lib/*:./RedshiftJDBC42-no-awssdk-1.2.8.1005.jar jvm.bootoptions=-Xmx8g -Xms32m
親トピック: Redshiftイベント・ハンドラの使用
13.9 Redshift COPY SQL認可
Redshiftイベント・ハンドラは、COPY SQL
を使用して、Amazon Web Services (AWS) S3バケットのステージングされたファイルを読み取ります。COPY SQL
問合せがAWS S3のファイルにアクセスするために認可資格証明が必要になる場合があります。
RedshiftクラスタにアタッチされているAWS Identity and Access Management (IAM)ロールを使用するか、AWSアクセス・キーおよびアクセス・キーのシークレットを指定することで、認可を提供できます。セキュリティ上の考慮事項として、可能な場合はロールベースのアクセスを使用することがベスト・プラクティスとなります。
AWSキーベースの認可
キー・ベースのアクセス制御では、AWS S3へのアクセスを認可されているAWS IAMユーザーのアクセス・キーIDとシークレット・アクセス・キーを指定します。アクセス・キーIDとシークレット・アクセス・キーは、次のように資格証明を検索することで取得されます。
- 環境変数 -
AWS_ACCESS_KEY/AWS_ACCESS_KEY_ID
およびAWS_SECRET_KEY/AWS_SECRET_ACCESS_KEY
。 - Javaシステム・プロパティ -
aws.accessKeyId
およびaws.secretKey
。 - デフォルトの場所(
~/.aws/credentials
)にある資格証明プロファイルのファイル。 - 環境変数
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
が設定されている場合は、Amazon ECSからロードされたAmazon Elastic Container Service (ECS)コンテナの資格証明。 - Amazon Elastic Compute Cloud (EC2)メタデータ・サービスから取得されたインスタンス・プロファイル資格証明。
AWS EC2インスタンスでのReplicatの実行
AWS EC2インスタンスでReplicatプロセスが開始されると、Oracle GoldenGate for BigDataによってアクセス・キーIDおよびシークレット・アクセス・キーが自動的に取得されるため、明示的なユーザー構成は必要ありません。
AWSセキュリティ・トークン・サービス(STS)を使用した一時的なセキュリティ資格証明
キーベースのアクセス制御を使用する場合、AWSセキュリティ・トークン・サービスを使用して一時的なセキュリティ資格証明を取得することで、ユーザーのデータへのアクセスをさらに制限できます。Redshiftイベント・ハンドラの自動構成機能は、AWSセキュリティ・トークン・サービス(STS)構成をS3イベント・ハンドラから自動的に取得します。
表13-4 S3イベント・ハンドラ構成およびRedshiftイベント・ハンドラ構成
S3イベント・ハンドラの構成 | Redshiftイベント・ハンドラ構成 |
---|---|
enableSTS |
useAwsSTS |
stsURL |
awsSTSEndpoint |
stsRegion |
awsSTSRegion |
AWS IAMロールベースの認可
ロールベースの認可では、RedshiftクラスタはCOPY SQL
を実行するとき、一時的にIAMロールを使用します。gg.eventhandler.redshift.AwsIamRole
のように、ロールのAmazonリソース番号(ARN)を構成値として指定する必要があります。たとえば: gg.eventhandler.redshift.AwsIamRole=arn:aws:iam::<aws_account_id>:role/<role_name>
。ロールには、対応するS3バケットを読み取る権限が必要です。ロールの信頼関係にAWS redshiftサービスが含まれていることを確認します。また、Redshiftクラスタを起動する前に、このロールをRedshiftクラスタにアタッチします。たとえば、ロールの信頼関係で使用できるAWS IAMポリシーです。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "redshift.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
ロールベースの認可が構成されている場合(gg.eventhandler.redshift.AwsIamRole
)、これはキーベースの認可よりも優先されます。
親トピック: Redshiftイベント・ハンドラの使用