記事内容の修正を行いました。データサイエンスチームのmotchieです。データウェアハウス(DWH)を使うことで、大規模なデータに対する高速なクエリ処理が実現し、BIを初めとした様々なデータ活用が可能になります。BigQueryなどが有名です。ノードが発表されました。Systemベースの次世代コンピュートインスタンスで、頻繁にアクセスされるデータはノード上のSSD、それ以外はS3へ自動で配置されるマネージドストレージを備えています。RA3ノードによって、以下のように、Redshiftは大きな進歩を遂げました。Redshift(※執筆現在プレビュー期間)によって、他のクラウドDWHに比べて最大10倍もの処理速度が実現するとのことです。クラウドDWHは日々進歩を続けています。今回の記事では、クラウドDWH間でのデータ移行について紹介したいと思います。APIを使う方法がありますが、BigQueryからRedshiftに移行する場合(GCP->AWS)については、あまり情報が見当たらないように思います。そこでこの記事では、BigQueryからRedshiftにデータを移行する手順を1つご紹介します。GlueでETLを行い、Redshiftにデータを格納してみたいと思います。事前に稼働中のRedshiftクラスターや自前のBigQueryデータがない場合でもお試しいただけます。前提条件として、AWS・GCP上でリソースにアクセスできる十分な権限が必要になります。CloudFormationテンプレートをベースに、Redshiftクラスターを作成していきたいと思います。クラスターの作成を自動化する上記のテンプレートを活用することで、ベストプラクティスに沿って設計されたRedshiftクラスターが一発で作成できます。設計とテンプレートの詳細については、上記ブログ記事をご確認ください。上記ブログ記事のCloudFormationテンプレートを取得します。今回、BigQueryのデータをRedshiftに移行する際に、追加のリソースが必要になります。・GCSからS3へデータをコピーするための、IAMユーザー認証情報とS3バケット・GlueからRedshiftへアクセスするためのネットワーク設定テンプレートをカスタマイズして、リソースを追加してからデプロイしたいと思います。(Bastionスタック用テンプレート)を修正していきます。修正後のテンプレートは以下で確認できます。linux-bastion-blog.template追加したリソースを赤色でハイライトしています。内容は以下の通りです。Managerテンプレートの修正箇所をハイライトしています。---Outputs:Redshiftスタックでデータ格納用S3バケット名が必要なため、以下の修正によって値を出力しています。修正後のテンプレートは以下で確認できます。redshift-blog.template追加したネットワーク設定が用いられる経路を赤色でハイライトしています。GlueからVPC内のRedshiftにアクセスする際、ネットワークインターフェース(ENI)が必要になります。ポートに対する自己参照のインバウンドルールを追加しています。ENI本体は、GlueからRedshiftへの接続を作成し、ETLジョブを実行する際に作成されます。テンプレートの修正箇所をハイライトしています。RedshiftLoggingS3Bucket:テンプレートの修正は以上です。それでは、各スタックをデプロイしていきます。スタックの作成VPCスタック、Bastionスタック、Redshiftスタックの順で作成します。パラメータをまとめて作成しておきます。(事前にEC2キーペアの作成が必要です)は自身の値に変更してください。値は、Glueの接続設定とRedshiftへアクセスする際に必要になります。自身で設定した値を失念しないよう、気を付けてください。@resolver1.opendns.com)/32"VPCスタックを作成します。完了まで数分かかります。CAPABILITY_IAMマネジメントコンソールでCloudFormationを開き、スタック作成の完了を確認してから、Bastionスタックの作成に移ってください。Bastionスタックを作成します。以下のコマンドを実行します。CAPABILITY_NAMED_IAMスタックの作成まで数分かかります。スタックの出力する以下の値は、以降の手順で必要になるため、マネジメントコンソールで確認・取得しておいてください。最後に、Redshiftスタックを作成します。以下のコマンドを実行します。同様に、スタックの出力する以下の値は、以降の手順で必要になるため、マネジメントコンソールで確認・取得しておいてください。以上でAWSのリソースが作成できました。作成したリソースを赤色でハイライトしています。Glue関連のリソースは後ほど手順3で作成します。BigQueryの一般公開データセットを、GCS経由でS3に出力する次はGCPに移ってバケットの作成、データの移行を行っていきます。下の構成図において、赤色でハイライトした部分が関連するリソースになります。一般公開データセットBigQueryでは、一般公開データセットと呼ばれる様々なデータがあらかじめ用意されており、ユーザーは自身のデータと組み合わせて分析を行うことができます。Sampleのデータを使いたいと思います。以下のようなクエリが実行できます。後ほど、Redshiftでも同様のクエリを投げてみたいと思います。Shellを起動します。Shellから実行します。GCSのバケットを作成します。バケット名は適宜変更して実行してください。BigQueryからGCSにエクスポートデータをBigQueryからGCSに出力します。コマンドを使用します。使用して、データを分割する必要があることに注意してください。GCSからS3にデータをコピーgsutilツールを利用して、GCSからS3にデータをコピーすることが出来ます。そのためには、S3にアクセスできるIAMユーザー認証情報を.boto構成ファイル(~/.boto)に追加する必要があります。詳細については、以下のドキュメントをご覧ください。Managersを開き、先ほどBastionスタック内で作成したIAMユーザー認証情報を取得します。Shellに戻って、お好きなエディターで.boto構成ファイル(~/.boto)を開き、IAMユーザーの認証情報を書き込みます。他のリージョンにおけるエンドポイントの値については、以下をご確認ください。s3.ap-northeast-1.amazonaws.comgsutilを使って、GCSからS3にファイルをコピーします。して出力されていたバケット名を入力してください。MiB.以上で、BigQueryのデータをS3に出力できました。次は再びAWSのマネジメントコンソールに戻って、Glueの設定を行っていきます。Glueは、データの抽出、変換、ロードという、ETL処理をスムーズに行うためのマネージドサービスです。今回、Glueを使って、S3のデータからデータカタログを構築、Redshiftへの接続を設定、ETLジョブを作成、実行し、S3のデータを変換してRedshiftにロードしてみたいと思います。以下の構成図において、関連するリソースを赤色でハイライトしています。データカタログの構築S3にコピーされたBigQuery一般公開データセットをGlueクローラでクロールし、データカタログを構築します。以下の画像の手順で、クローラの設定を行っていきます。クローラの実行は1分ほどで完了します。構築されたデータカタログはテーブルとして確認できます。次に、GlueからRedshiftへの接続(Connection)を設定します。接続の設定が上手くいっているか、テストしてみます。無事に接続の設定が完了しました。最後にGlueジョブを作成し、S3からRedshiftへデータのETLを行います。データソースの選択では、先ほどGlueクローラを使って構築したデータカタログのテーブルを選択します。RedshiftはArray・Structのデータ型に対応していないため、ETLで型を変換してからRedshiftに読み込む必要があります。下の画像の通り、デフォルトでArrayはstring型へ変換されているようです。Arrayの中身を展開し、適切なデータ型を付与して格納したい場合、自身で変換を追加する必要があります。してRedshiftに格納してみたいと思います。コード例は以下のようになります。GlueのDynamicFrameからSparkのDataFrameに一旦変換し、Sparkのexplode関数でArrayの中身を展開した後、GlueのDynamicFrameに戻しています。"datasink4")job.commit()修正箇所をハイライトしています。修正箇所以外の部分には、テータカタログのテーブル名、GlueのConnection名、RedshiftのDB名など、環境ごとに異なる値が含まれているため、修正箇所以外も含めてコピペするとエラーになる恐れがあります。変換ステップが追加されます。ETLジョブを実行します。ジョブ実行から数分ほどで実行ステータスがSucceededに変わり、ジョブが完了し、データがRedshiftに読み込まれます。Redshiftに接続してクエリを投げてみるRedshiftに接続し、クエリを投げてみたいと思います。Bastionサーバにssh接続するコマンド、Redshiftの接続コマンド/DB名/ユーザー名は、それぞれBastionスタック・Redshiftスタックの出力で確認できます。Bastionサーバにssh接続します。ec2-user@xxx.xxx.xxx.xxxRedshiftに接続します。変数で指定した値)になります。rsdev01Redshiftにテーブルが作成されていることを確認します。|BigQueryと同様のクエリを投げてみます。DESC;以下の通り、同じ実行結果が確認できました。rows)以上でBigQueryからRedshiftへの移行手順は終了です。削除が必要なリソースは以下の通りです。(GCS_BUCKET_NAME)Glueのジョブ/接続/クローラCloudFormationのRedshiftスタック・Bastionスタック・VPCスタックAWSリソースの削除に関して、いくつか注意点があります。開き、各リソースを手動で削除してください。ネットワークインターフェース)。不要なコストを避けるため、検証後はAWS/GCPのマネジメントコンソールからリソースの削除をお願いします。Redshiftにデータを移行する流れをご紹介しました。コマンドでGCSに出力、.boto構成ファイルに認証情報を追加し、gsutilツールでGCSからS3にデータをコピー、Glueを使って、S3からRedshiftへETLジョブを実行し、Redshiftにクエリを投げてデータを確認しました。この記事の内容が少しでも参考になれば幸いです。Platformmotchie2017年4月、NHNテコラスに新卒入社。データサイエンスチームに所属し、AWSを活用したデータ分析サービスの設計開発を担当。注力分野は自然言語処理、好きなAWSサービスはEMR、SageMaker。