AWS Lambda Based Amazon Redshift Database Loader を使ってみた(2) 〜失敗したバッチの再実行〜

投稿者: | 2016/09/03

前回はAWS Lambda Based Amazon Redshift Database Loader(Redshift Loader)の使い方を紹介しました。今回はデータロード時に失敗した時の挙動やリカバリ方法について紹介します。

Redshiftへのデータロード失敗の挙動

試しにRedshiftクラスターをリサイズしてRedshift Loaderを実行してみました。

リサイズ中、Redshiftへ書き込みができないためCOPYコマンドは失敗します。Redshift Loaderでも次のようなエラーが出てロードに失敗しました。

バッチステータスも失敗(error)になっていることがわかります。

それでは失敗したバッチを再実行してロードしてみます。

reprocessBatch.js でバッチを再実行します。
node reprocessBatch.js <リージョン> <バッチID> <ロードファイル名> で実行します。

再実行時の挙動として、以下の処理が非同期で実行されます。

  • バッチで処理するファイルリストが LambdaRedshiftProcessedFiles テーブルから削除される
  • S3にあるファイルを同じ場所にコピーされる。それをトリガーに、Lambda Functionが実行される(新しくバッチが実行される)
  • error となっていたバッチのステータスを reprocessed に変更される

reprocessed ステータスのバッチを検索すると先ほど失敗したバッチIDと同じになっていることがわかります。
バッチのステータスが error から reprocessed に変更しそのバッチを終了させ、新しいバッチを実行することで再データロードを試みます。
なお、そのバッチもデータロードに失敗したら error になります。

このようにコマンド1つで再実行できるのですが、実行するためにはバッチIDとファイルパスを指定しなければなりません。特にバッチIDを1つ1つ調べるのはとても大変です。
なので、次のようなシェルスクリプトを用意します。

このスクリプトを aws-lambda-redshift-loader と同じディレクトリに置いて実行することで失敗したバッチすべてを再実行するようにします。

最後に

AWS Lambda Based Amazon Redshift Database Loader において、データロード失敗時に再実行する方法について紹介しました。
Redshiftのメンテナンスウインドウによってデータロードに失敗することがしばしばあるため、このような仕組みを用意しておくことで楽に運用できるようになりました。
次回(があれば)、1回のデータロードに許容できるファイルサイズの上限について調べた結果について紹介します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*