1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Amazon Redshift auto-copy from Amazon S3を試してみた

Last updated at Posted at 2022-12-15

背景・目的

先日、「Amazon Redshift now supports auto-copy from Amazon S3」が発表されましたので、ドキュメントの確認と実際に動かしてみたいと思います。

まとめ

  • 2022年12月16日時点でプレビューです。今後仕様が変わる可能性があります。
    • 以下のリージョンで使用ができます。
      • US East (Ohio) Region (us-east-2)
      • US East (N. Virginia) Region (us-east-1)
      • US West (Oregon) Region (us-west-2)
      • Asia Pacific (Tokyo) Region (ap-northeast-1)
      • Europe (Stockholm) Region (eu-north-1)
      • Europe (Ireland) Region (eu-west-1)
  • COPYコマンドをジョブとして登録することで、S3に配置したファイルを自動的にコピーすることができます。

概要

  • COPYステートメントをコピージョブに保存できるようになり、S3パスで検出された新しいファイルが自動的にRedshiftにCOPYできるようになりました。
  • Redshiftは、ロードされたファイルを追跡し、COPYコマンドごとにバッチ処理されるファイルの数を決定します。
  • COPYコマンドの状況は、以下のシステム ビューで確認できます。
    • SYS_COPY_JOB (preview)
      • 現在定義されている各 COPY JOB の行が含まれています。
    • STL_LOAD_ERRORS
      • COPY コマンドからのエラーが含まれます。
    • STL_LOAD_COMMITS
      • COPY コマンドのデータ ロードのトラブルシューティングに使用される情報が含まれています。
    • SYS_LOAD_HISTORY
      • COPY コマンドの詳細が含まれています。
    • SYS_LOAD_ERROR_DETAIL
      • COPY コマンド エラーの詳細が含まれます。

COPY JOB (preview)

  • COPY JOB コマンドは COPY コマンドの拡張であり、S3バケットからのデータのロードを自動化します。
  • COPYジョブを作成すると、Redshiftは、新しいS3ファイルが指定されたパスに作成されたことを検出し、自動的にロードします。
  • データのロード時には、元のCOPYコマンドで使用されたものと同じパラメーターが使用されます。 Redshift は、ロードされたファイルを追跡して、ロードが1回だけであることを確認します。

実践

事前準備

S3バケットとデータの準備

  1. S3バケットを作成します。
  2. 以下のようなテストデータを作成します。
    • 3つのファイル
    • それぞれidとvalueを持つJSONフォーマット
$ ls -ltr                                  
total 24
-rw-r--r--  1 azumaha  staff  28 12 15 22:48 1.json
-rw-r--r--  1 azumaha  staff  28 12 15 22:49 2.json
-rw-r--r--  1 azumaha  staff  28 12 15 22:49 3.json
$ for nm in `ls`;do echo $nm ; cat $nm;done
1.json
{"id": 1,"value": "111111"}
2.json
{"id": 2,"value": "222222"}
3.json
{"id": 3,"value": "333333"}
$

IAMロールの作成

  1. IAM permissions for COPY, UNLOAD, and CREATE LIBRARYの要件に基づき、IAMポリシーとロールを作成します。

動作確認

クラスタの作成

  1. Redshiftのプロビジョニングされたクラスターダッシュボードで「Create preview cluster」をクリックします。
    image.png

  2. Cluster preview clusterの画面で以下を入力し「クラスターを作成」をクリックします。

    • Preview trackに「preview_autocopy_2022」
    • 上記以外はデフォルト
      image.png
  3. しばらくすると、起動されます。

  4. IAMロールの管理で作成したIAMロールを関連付けます。

Redshiftのスキーマとテーブルを作成

  1. クエリエディタを開きます。

  2. スキーマを作成します。(必須ではありません。)

    create schema auto_copy;
    
  3. テーブルを作成します。

    CREATE TABLE "auto_copy"."id_table"(
    id INT
    ,value VARCHAR(64)
    )
    DISTSTYLE AUTO
    ;
    
  4. テーブル定義を確認します。

    select * from SVV_ALL_COLUMNS where schema_name='auto_copy' and table_name ='id_table';
    

    image.png

ジョブの作成〜動作確認

  1. 以下のコマンドを実行します。

    COPY auto_copy.id_table
    FROM 's3://{バケット名}/{フォルダ名}'
    IAM_ROLE 'arn:aws:iam::{AWSアカウント}:role/{IAMロール}' 
    FORMAT AS JSON 'auto'
    JOB CREATE id_json_copy_job
    AUTO ON;
    
  2. ジョブを確認します。登録されました。

    select * from SYS_COPY_JOB
    
    ===
    job_id,job_name,job_owner,table_id,data_source,iam_role,copy_query,is_auto,on_error_suspend
    105725,id_json_copy_job,100,105715,s3://{バケット名}/{フォルダ名},arn:aws:iam::{AWSアカウント}:role/{IAMロール},COPY auto_copy.id_table\nFROM 's3://{バケット名}/{フォルダ名}'\nIAM_ROLE '' \nFORMAT AS JSON 'auto'\nJOB CREATE id_json_copy_job\nAUTO ON;,true,true
    
  3. ファイルを配置する前にテーブルに登録されているレコードを確認します。未だ登録されていません。

    select * from auto_copy.id_table;
    

    image.png

  4. S3にファイルを配置します。先程作成した1.jsonを配置します。
    image.png

  5. ファイル配置後にレコードを確認します。登録されました。
    image.png

  6. ジョブのロード結果を確認します。

    select * from stl_load_commits where filename like '%1.json%' 
    

ファイルの追加〜動作確認

  1. 配置前のS3とテーブルの状態を確認します。
    image.png
    image.png

  2. ファイルを配置します。(2.jsonを配置します。)
    image.png

  3. 配置後のテーブルの状態を確認します。COPYが成功しレコードが追加されています。
    image.png

AUTO COPYをOFF〜動作確認

AUTO COPYをOFFに変更し、自動でコピーされないか確認します。

  1. 以下のSQLでOFFに変更します。

    COPY JOB ALTER id_json_copy_job 
    AUTO OFF
    
  2. ジョブを確認します。OFFになりました。

    select job_name,is_auto from SYS_COPY_JOB
    
    ===
    job_name is_auto
    id_json_copy_job	false
    
  3. ファイルを配置します。(3.jsonを配置します。)
    image.png

  4. 配置後のテーブルの状態を確認します。OFFにしているので、想定通りレコードは登録されていません。(ID=3のレコードは見当たりません。)

    select * from auto_copy.id_table;
    

    image.png

ジョブのマニュアル実行

上記の「AUTO COPYをOFF〜動作確認」でOFFに変更した状態で、ジョブを実行しレコードが登録されるか確認します。

  1. 以下のコマンドでジョブを実行します。
    COPY JOB RUN id_json_copy_job
    
  2. 配置後のテーブルの状態を確認します。レコードが登録されました。
    select * from auto_copy.id_table;
    
    image.png

ジョブのDDLを確認

  1. 以下のコマンドでDDLが確認できます。
    COPY JOB SHOW id_json_copy_job
    ===
    COPY auto_copy.id_table FROM 's3://{バケット名}/{フォルダ名}' IAM_ROLE 'arn:aws:iam::{AWSアカウント}:role/{IAMロール}' FORMAT AS JSON 'auto' JOB CREATE id_json_copy_job AUTO ON;
    

ジョブの削除

  1. 以下のコマンドでジョブを削除します。
    COPY JOB DROP id_json_copy_job
    
  2. 削除されたことを確認します。
    select * from SYS_COPY_JOB
    
    image.png

ファイルがある状態でジョブを作成

ファイルが配置されたままで、ジョブを作成した場合、自動でロードされるか確認します。

  1. レコードを確認します。(事前にTruncateしているので0件です。)

    select * from auto_copy.id_table;
    

    image.png

  2. ジョブを確認します。登録されていません。

    select * from SYS_COPY_JOB
    

    image.png

  3. S3を確認します。
    image.png

  4. ジョブを作成します。

    COPY auto_copy.id_table
    FROM 's3://{バケット名}/{フォルダ名}'
    IAM_ROLE 'arn:aws:iam::{AWSアカウント}:role/{IAMロール}' 
    FORMAT AS JSON 'auto'
    JOB CREATE id_json_copy_job
    AUTO ON;
    
  5. ジョブを確認します。

        select * from SYS_COPY_JOB
    
        ===
        job_id,job_name,job_owner,table_id,data_source,iam_role,copy_query,is_auto,on_error_suspend
        105737,id_json_copy_job,100,105715,s3://{バケット名}/{フォルダ名},arn:aws:iam::{AWSアカウント}:role/{IAMロール},COPY auto_copy.id_table\nFROM 's3://{バケット名}/{フォルダ名}'\nIAM_ROLE '' \nFORMAT AS JSON 'auto'\nJOB CREATE id_json_copy_job\nAUTO ON;,true,true
    
  6. レコードを確認します。COPYされているようです。(3件増えています。)

    select * from auto_copy.id_table;
    

    image.png

考察

今まで、COPYにはジョブなどでRedshift外から実行する必要がありました。AUTO COPYによりそのような手間が減り運用が楽になりました。
GA後に、大量データをコピーしパフォーマンスを計測しようと思います。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?