13 Redshiftイベント・ハンドラの使用

Amazon Redshiftは、ペタバイト規模の完全マネージド型クラウド・データ・ウェアハウス・サービスです。Redshiftイベント・ハンドラの目的は、操作をRedshift表に適用することです。

「ファイル・ライター・ハンドラの使用」を参照してください。

13.1 詳細な機能

Redshiftイベント・ハンドラは、S3イベント・ハンドラの出力に接続されたダウンストリーム・イベント・ハンドラとして使用してください。S3イベント・ハンドラは、ファイル・ライター・ハンドラによって生成されたファイルをAmazon S3にロードします。

Redshiftイベント・ハンドラは、COPY SQLを使用して、S3で使用可能な操作データを一時Redshiftステージング表にバルク・ロードします。その後、ステージング表のデータを使用してターゲット表を更新します。すべてのSQL操作は、スループットを改善するためにバッチで実行されます。

13.2 操作集計

13.2.1 メモリー内での集計

操作データをS3にロードする前に、証跡ファイル内の操作が集計されます。集計操作は、同じ行に対する複数の操作をしきい値に基づいて単一の出力操作に集計(マージ/圧縮)するプロセスです。

表13-1 構成プロパティ

プロパティ 必須/オプション 有効な値 デフォルト 説明

gg.aggregate.operations

オプション

true | false

false

操作レコードの主キーに基づく集計操作。

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であるという制限があります。

13.4 非圧縮のUPDATEレコード

Redshiftに適用する証跡ファイルに非圧縮のUPDATE操作レコードが含まれていることが必須です。つまり、UPDATE操作には、更新する行の完全なイメージが含まれていることを意味します。

UPDATEレコードにない列がある場合、ターゲットではそのような列はnullとして更新されます。gg.abend.on.missing.columns=trueパラメータを設定すると、Replicatは圧縮された更新証跡レコードの検出でフェイルファストを実行できます。これは推奨される設定です。

13.5 データ・ロード・プロセス中のエラー

AWS S3から一時ステージング表への操作データのステージングおよびターゲット表の更新は、単一のトランザクション内で行われます。エラーが発生した場合、トランザクション全体がロールバックされ、Replicatプロセスは異常終了(ABEND)します。

COPY SQLにエラーがある場合は、Redshiftシステム表stl_load_errorsも問合せされ、ハンドラのログ・ファイル内でエラー・トレースが使用可能になります。

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。最高のスループットを得るには、コンポーネントをできるだけ近くに配置する必要があります。

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

13.8 構成

自動構成

AWS Redshiftデータ・ウェアハウスのレプリケーションには、ファイル・ライター・ハンドラ、S3イベント・ハンドラ、Redshiftイベント・ハンドラなどの複数のコンポーネントの構成が含まれます。これらのコンポーネントは自動構成機能によって自動的に構成されるため、必要な構成の実行は最小限になります。自動構成によって変更されたプロパティもハンドラのログ・ファイルに記録されます。

自動構成で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を設定します。

例: jdbc:redshift://aws-redshift-instance.cjoaij3df5if.us-east-2.redshift.amazonaws.com:5439/mydb

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

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とシークレット・アクセス・キーは、次のように資格証明を検索することで取得されます。

  1. 環境変数 - AWS_ACCESS_KEY/AWS_ACCESS_KEY_IDおよびAWS_SECRET_KEY/AWS_SECRET_ACCESS_KEY
  2. Javaシステム・プロパティ - aws.accessKeyIdおよびaws.secretKey
  3. デフォルトの場所(~/.aws/credentials)にある資格証明プロファイルのファイル。
  4. 環境変数AWS_CONTAINER_CREDENTIALS_RELATIVE_URIが設定されている場合は、Amazon ECSからロードされたAmazon Elastic Container Service (ECS)コンテナの資格証明。
  5. 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)、これはキーベースの認可よりも優先されます。