Snowflake から BigQuery への移行チュートリアル

このドキュメントでは、Snowflake から BigQuery への移行パイプラインを設定するさまざまな方法について、エンドツーエンドの例とチュートリアルを提供します。

Snowflake 移行パイプラインの例

Snowflake から BigQuery にデータを移行するには、ELT、ETL、パートナー ツールという 3 つの異なるプロセスを使用できます。

抽出、読み込み、変換

抽出、読み込み、変換(ELT)プロセスは、次の 2 つの方法で設定できます。

  • パイプラインを使用して Snowflake からデータを抽出し、BigQuery にデータを読み込む
  • 他の Google Cloud プロダクトを使用して Snowflake からデータを抽出する

パイプラインを使用して Snowflake からデータを抽出する

Snowflake からデータを抽出し、Cloud Storage に直接読み込むには、snowflake2bq ツールを使用します。

その後、次のいずれかのツールを使用して、Cloud Storage から BigQuery にデータを読み込むことができます。

Snowflake からデータを抽出するその他のツール

次のツールを使用して、Snowflake からデータを抽出することもできます。

BigQuery にデータを読み込むその他のツール

次のツールを使用して、BigQuery にデータを読み込むこともできます。

抽出、変換、読み込み

BigQuery にデータを読み込む前にデータを変換する場合は、次のツールを検討してください。

  • Dataflow
  • Cloud Data Fusion
    • 再利用可能なパイプラインを作成し、CDAP プラグインを使用してデータを変換します。
  • Dataproc
    • サポートされている Spark 言語(Scala、Java、Python、R)のいずれかで Spark SQL またはカスタムコードを使用してデータを変換します。

移行用のパートナー ツール

EDW 移行空間を専門とする複数のベンダーがあります。主要なパートナーと、パートナーが提供するソリューションの一覧については、BigQuery パートナーをご覧ください。

Snowflake エクスポートのチュートリアル

以下のチュートリアルでは、Snowflake の COPY INTO <location> コマンドを使用して Snowflake から BigQuery へサンプルデータをエクスポートする方法について説明します。コードサンプルを含む詳細な手順については、Google Cloud プロフェッショナル サービスの Snowflake から BigQuery への移行ツールをご覧ください。

エクスポートの準備を行う

次の手順で、Snowflake データを Cloud Storage または Amazon Simple Storage Service(Amazon S3)バケットに抽出して、エクスポートの準備をすることができます。

Cloud Storage

このチュートリアルでは、PARQUET 形式でファイルを準備します。

  1. Snowflake SQL ステートメントを使用して、名前付きファイル形式の仕様を作成します。

    create or replace file format NAMED_FILE_FORMAT
        type = 'PARQUET'

    NAMED_FILE_FORMAT は、ファイル形式の名前に置き換えます。例: my_parquet_unload_format

  2. CREATE STORAGE INTEGRATION コマンドで統合を作成します。

    create storage integration INTEGRATION_NAME
        type = external_stage
        storage_provider = gcs
        enabled = true
        storage_allowed_locations = ('BUCKET_NAME')

    次のように置き換えます。

    • INTEGRATION_NAME: ストレージ統合の名前。例: gcs_int
    • BUCKET_NAME: Cloud Storage バケットのパス。例: gcs://mybucket/extract/
  3. DESCRIBE INTEGRATION コマンドを使用して、Snowflake の Cloud Storage サービス アカウントを取得します。

    desc storage integration INTEGRATION_NAME;

    出力は次のようになります。

    +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
    | property                    | property_type | property_value                                                              | property_default |
    +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------|
    | ENABLED                     | Boolean       | true                                                                        | false            |
    | STORAGE_ALLOWED_LOCATIONS   | List          | gcs://mybucket1/path1/,gcs://mybucket2/path2/                               | []               |
    | STORAGE_BLOCKED_LOCATIONS   | List          | gcs://mybucket1/path1/sensitivedata/,gcs://mybucket2/path2/sensitivedata/   | []               |
    | STORAGE_GCP_SERVICE_ACCOUNT | String        | service-account-id@iam.gserviceaccount.com                 |                  |
    +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
  4. STORAGE_GCP_SERVICE_ACCOUNT としてリストされているサービス アカウントに、ストレージ統合コマンドで指定されたバケットに対する読み取り / 書き込みアクセス権を付与します。この例では、service-account-id@ サービス アカウントに <var>UNLOAD_BUCKET</var> バケットに対する読み取り / 書き込みアクセス権を付与します。

  5. 以前に作成した統合を参照する外部 Cloud Storage ステージを作成します。

    create or replace stage STAGE_NAME
        url='UNLOAD_BUCKET'
        storage_integration = INTEGRATION_NAME
        file_format = NAMED_FILE_FORMAT;

    次のように置き換えます。

    • STAGE_NAME: Cloud Storage ステージ オブジェクトの名前。例: my_ext_unload_stage

Amazon S3

次の例は、Snowflake テーブルから Amazon S3 バケットにデータを移行する方法を示しています。

  1. Snowflake で、ストレージ統合オブジェクトを構成して、外部の Cloud Storage ステージで参照される Amazon S3 バケットに Snowflake が書き込めるようにします。

    この手順には、Amazon S3 バケットへのアクセス権限の構成アマゾン ウェブ サービス(AWS)IAM ロールの作成CREATE STORAGE INTEGRATION コマンドによる Snowflake でのストレージ統合の作成が含まれます。

    create storage integration INTEGRATION_NAME
    type = external_stage
    storage_provider = s3
    enabled = true
    storage_aws_role_arn = 'arn:aws:iam::001234567890:role/myrole'
    storage_allowed_locations = ('BUCKET_NAME')

    次のように置き換えます。

    • INTEGRATION_NAME: ストレージ統合の名前。例: s3_int
    • BUCKET_NAME: ファイルを読み込む Amazon S3 バケットのパス。例: s3://unload/files/
  2. DESCRIBE INTEGRATION コマンドを使用して、AWS IAM ユーザーを取得します。

    desc integration INTEGRATION_NAME;

    出力は次のようになります。

    +---------------------------+---------------+================================================================================+------------------+
    | property                  | property_type | property_value                                                                 | property_default |
    +---------------------------+---------------+================================================================================+------------------|
    | ENABLED                   | Boolean       | true                                                                           | false            |
    | STORAGE_ALLOWED_LOCATIONS | List          | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/                                | []               |
    | STORAGE_BLOCKED_LOCATIONS | List          | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/    | []               |
    | STORAGE_AWS_IAM_USER_ARN  | String        | arn:aws:iam::123456789001:user/abc1-b-self1234                                 |                  |
    | STORAGE_AWS_ROLE_ARN      | String        | arn:aws:iam::001234567890:role/myrole                                          |                  |
    | STORAGE_AWS_EXTERNAL_ID   | String        | MYACCOUNT_SFCRole=                                                   |                  |
    +---------------------------+---------------+================================================================================+------------------+
  3. スキーマに対する CREATE STAGE 権限と、ストレージ統合に対する USAGE 権限を含むロールを作成します。

        CREATE role ROLE_NAME;  
        GRANT CREATE STAGE ON SCHEMA public TO ROLE ROLE_NAME;
        GRANT USAGE ON INTEGRATION s3_int TO ROLE ROLE_NAME;

    ROLE_NAME は、ロールの名前に置き換えます。例: myrole

  4. AWS IAM ユーザーに Amazon S3 バケットにアクセスするための権限を付与し、CREATE STAGE コマンドを使用して外部ステージを作成します。

        USE SCHEMA mydb.public;
    
        create or replace stage STAGE_NAME
            url='BUCKET_NAME'
            storage_integration = INTEGRATION_NAMEt
            file_format = NAMED_FILE_FORMAT;

    次のように置き換えます。

    • STAGE_NAME: Cloud Storage ステージ オブジェクトの名前。例: my_ext_unload_stage

Snowflake データをエクスポートする

データを準備したら、 Google Cloudにデータを移動できます。COPY INTO コマンドを使用して、外部ステージ オブジェクト STAGE_NAME を指定し、Snowflake データベース テーブルから Cloud Storage または Amazon S3 バケットにデータをコピーします。

    copy into @STAGE_NAME/d1
    from TABLE_NAME;

TABLE_NAME は、Snowflake データベース テーブルの名前に置き換えます。

このコマンドの結果、テーブルデータは Cloud Storage または Amazon S3 バケットにリンクされているステージ オブジェクトにコピーされます。ファイルには d1 という接頭辞が付きます。

その他のエクスポート方法

データのエクスポートに Azure Blob Storage を使用するには、Microsoft Azure へのアンロードの説明に従います。次に、Storage Transfer Service を使用して、エクスポートされたファイルを Cloud Storage に転送します。