MaxCompute連載13:RDS for MySQL からMaxComputeへ連携する方法

Hi, データエンジニアの大原です。 Alibaba Cloudのデータ処理プラットフォーム「MaxCompute」についての連載記事の13回目です。

今回はRDS for MySQL からMaxComputeへ連携する方法について説明します。

前回の記事はこちらをご覧ください。 www.sbcloud.co.jp

f:id:sbc_ohara:20210104091159p:plain

前書き

MaxComputeの概要をこのblogにて記載しました。

MaxCompute (旧プロダクト名 ODPS) は、大規模データウェアハウジングのためのフルマネージドかつマルチテナント形式のデータ処理プラットフォームです。さまざまなデータインポートソリューションと分散計算モデルにより、大規模データの効率的な照会、運用コストの削減、データセキュリティを実現します。

f:id:sbc_ohara:20210104133726p:plain

少し前になりますが、MaxComputeについての資料をSlideShareへアップロードしていますので、こちらも参考になればと思います。

www.slideshare.net

今回はAlibaba Cloud RDS for MySQL からMaxComputeへデータを連携します(データベース移行)。構成図で、こんな感じです。

f:id:sbc_ohara:20210311220708p:plain



共通作業(MaxCompute全体で共通事項)

RAM ユーザー作成&権限付与

もしMaxComputeを操作するユーザがRAMユーザーの場合は以下を実施してください。

RAMより対象のユーザーを選定します。ユーザーが無い場合は新規作成します。 このときにAccessKey IDとAccessKey Secretをメモとして残してください。AccessKey IDとAccessKey SecretはDataWorks DataIntegrationの処理に必要となります。

f:id:sbc_ohara:20210305025953p:plain

対象のユーザーには権限ロールとしてAliyunDataWorksFullAccessをアタッチします。 これはDataWorksを操作するためのFull権限です。
DataWorks側にてユーザーごとに読み取り専用や一部プロジェクト・テーブルなどのきめ細かい権限付与ができますが、ここでは割愛します。

f:id:sbc_ohara:20210305025809p:plain

今回は、RDSからMaxComputeへ連携する方法なので、AliyunRDSFullAccessもアタッチします。

Workspace作成

MaxComputeを操作するためにはワークスペースおよびプロジェクトが必要なので新たに作成します。DataWorksコンソールから 「Create Project」を選択し、起動します。
Modeは「Basic Mode(基本モード)」「と「Standard Mode(標準モード)」の2種類があります。ここは「Basic Mode(基本モード)」として選定します。
基本モードと標準モードは過去記事にて説明しています。

f:id:sbc_ohara:20210304212211p:plain

続けて、MaxCompute を選定します。料金は初めて操作するなら Pay-As-You-Go(使った分だけ課金) が良いと思います。

f:id:sbc_ohara:20210304220348p:plain

MaxComputeに関する必要な情報を設定し、Workspaceを作成します。

f:id:sbc_ohara:20210304220459p:plain

同期タスクをサブミットする方法(基本モード(basic mode))

作業の途中で 同期タスクをサブミットする旨のアクションが発生しますが、こちらの手順を参考にいただければ幸いです。    

DataWorks DataStdioで、操作が終わったら [Commit to Production Environment] をクリックし開発環境から本番環境へ直接コミットします。

f:id:sbc_ohara:20210311222112p:plain

同期タスクをサブミットする方法(標準モード(standard mode))

DataWorks DataStdioの右側にあるProperitiesをクリックします。

f:id:sbc_ohara:20210311221338p:plain

プロパティRerunを設定して、[Use Root Node]ボタンをクリックします。

f:id:sbc_ohara:20210311221142p:plain

開発環境にサブミットします。

f:id:sbc_ohara:20210311221120p:plain

あとは開発環境から本番環境にデプロイします。
具体的な方法は【MaxCompute連載】DataWorksにおける基本モードと標準モード、開発環境と本番環境について をご参照ください。

www.sbcloud.co.jp

Maxcomputeのデータをクエリする方法

DataWorks DataStdioのAd-Hoc Query画面に入って、[ODPS SQL]のノードを作成します。

f:id:sbc_ohara:20210311222431p:plain

SQLクエリ文を作成したら、上書き保存してから、Run SQLボタンを押します。
その後、SQLクエリの実行コストらお金が出ますが、ここも考慮のうえ、Run、で実行します。
実行結果としてレコード数が無事表示されます。

f:id:sbc_ohara:20210311222939p:plain



(事前準備)RDS for MySQLの準備

RDSコンソールに入り、RDS for MySQLのインスタンスを作成します。
インスタンス生成後、そのインスタンスIDをメモします。このIDは後述する作業にて必要となります。

f:id:sbc_ohara:20210311225949p:plain

DataworksのデフォルトリソースグループのIPをMySQLインスタンのホワイトリストに追加します。
東京リジョンのIPアドレスは次の通りです。

100.105.55.0/24,11.192.147.0/24,11.192.148.0/24,11.192.149.0/24,100.64.0.0/10,47.91.12.0/24,47.91.13.0/24,47.91.9.0/24,11.199.250.0/24,47.91.27.0/24,11.59.59.0/24,47.245.51.128/26,47.245.51.192/26,47.91.0.128/26,47.91.0.192/26

f:id:sbc_ohara:20210311230107p:plain

MySQLを接続する用のホストのIPもホワイトリストに追加します。
f:id:sbc_ohara:20210311230145p:plain

MySQLのパブリックエンドポイントを申請します。
f:id:sbc_ohara:20210311230216p:plain

表示されたPublic Endpointをメモします。これも後述する作業にて必要となります。
f:id:sbc_ohara:20210311230305p:plain

MySQLにてアカウントとDatabaseを作成します。
f:id:sbc_ohara:20210311230359p:plain

アカウントとパブリックエンドポイントを使ってDMSなどでMySQLに接続して、作成したDBにテーブルとデータを作成します。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255),
  `email` varchar(255),
  `password` varchar(30),  
  PRIMARY KEY (`id`)
) ENGINE=InnoDB ROW_FORMAT=dynamic DEFAULT 
CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `users` VALUES ('1', '加藤', '123@nice.com', 'niceday123@#2980');
INSERT INTO `users` VALUES ('2', '三島', '993@hello.com', '3ofoshfslk$&klj*2K');
INSERT INTO `users` VALUES ('3', '田島', '5ddd@happy.com', '*(&sjhvskjdhvks^%');
INSERT INTO `users` VALUES ('4', '三橋', '398@kkk.com', 'feifuwe^&%*&6rf4');
INSERT INTO `users` VALUES ('5', '渋谷', '898@cccc.com', 'vwejh^(&*(efwj4r');
INSERT INTO `users` VALUES ('6', '斉藤', '93839@cdfsf.com', '347r9^%*&3r234t');
INSERT INTO `users` VALUES ('7', '石井', 'mini@aaa.com', '4398^&%^*jkdv');

f:id:sbc_ohara:20210311230525p:plain

今度はDataWorks側での作業に移ります。
RDS for MySQLをDataWorks DataIntegrationデータソースに追加します。

f:id:sbc_ohara:20210311230553p:plain

データソース追加をクリックして、MySQLを選択します。
f:id:sbc_ohara:20210311230909p:plain

データソースとしてMySQLのインスタンスID、UID、DB Name、アカウントなどの情報を入力し、接続テストを実行します。

f:id:sbc_ohara:20210311231021p:plain

接続テストで問題なければ、Completeボタンをクリックすることで、MySQLのデータソースが追加されます。
これでMySQL側の設定は完了です。次はMaxCompute Tableの準備を進めます。

f:id:sbc_ohara:20210311231130p:plain

(事前準備)MaxCompute Tableの準備

DataWorks DataIntegrationから、新規オフライン同期タスクをクリックし、DataStdio画面へ遷移します。
DataStdio画面にて、「Create Node」らダイアログが表示されますが、ここではクローズします。

f:id:sbc_ohara:20210311231235p:plain

Workspace Tables画面に入って、テーブルを作成します。

f:id:sbc_ohara:20210311231300p:plain

DDL Statementボタンをクリックして、MySQL Tableに対応するDDL Statementを入力します。

CREATE TABLE IF NOT EXISTS mysql_users (
    `id` INT COMMENT '',
    `username` VARCHAR(255) COMMENT  '',
    `email` VARCHAR (255) COMMENT  '',
    `password` VARCHAR (30) COMMENT  ''
);

f:id:sbc_ohara:20210311231559p:plain

Display Nameを入力し、テーブルをコミットします。その後はテーブルが作成されてることが確認できます。
※標準モードプロジェクトの場合は本番環境にもコミットする必要があります。

f:id:sbc_ohara:20210311231644p:plain

この準備が終わり次第、データを移行してみます。データ移行にはGUIモードとスクリプトモードの2つのパターンがあります。まずはGUIモードで移行します。
スクリプトモードはtemplateな扱いができるため、後日この作業の自動化したい場合、活用できればと思います。

MySQLをMaxComputeへ移行(GUIモード)

STEP1: workflow作成

DataWorks DataIntegrationから、新規オフライン同期タスクをクリックし、DataStdio画面へ遷移します。
DataStdio画面にて、「Create Node」らダイアログが表示されますが、ここではクローズします。

f:id:sbc_ohara:20210311231235p:plain

DataStdio画面にてWorkflowを作成します。

f:id:sbc_ohara:20210311232629p:plain

STEP2: DI 同期タスクを作成

同期タスクを作成します。
f:id:sbc_ohara:20210311232713p:plain

ソースをMySQLに選択して、テーブルを選択します。そのあとはPreviewボタンをクリックします。

f:id:sbc_ohara:20210311232808p:plain

ターゲットをODPSに選択します。
f:id:sbc_ohara:20210311232841p:plain

Maxcomputeテーブルを選択します。
f:id:sbc_ohara:20210311232931p:plain

すると、自動でマッピングが表示されます。
f:id:sbc_ohara:20210311233002p:plain

STEP3: DI 同期タスクを実行

タスクを実行します。
f:id:sbc_ohara:20210311233055p:plain

タスクが成功すると、Logが表示されます。
f:id:sbc_ohara:20210311233146p:plain

あとはAd-Hoc クエリで確認します(手順は上記の共通手順にて記載しています)

select * from nelly_test_dev.mysql_users;

f:id:sbc_ohara:20210311233321p:plain

これにより、GUIモードでMySQLのデータをMaxCompute Tableへ取り込んだことが確認できました。

MySQLをMaxComputeへ移行(スクリプトモード)

STEP1: workflow作成

DataWorks DataIntegrationから、新規オフライン同期タスクをクリックし、DataStdio画面へ遷移します。
DataStdio画面にて、「Create Node」らダイアログが表示されますが、ここではクローズします。

f:id:sbc_ohara:20210311231235p:plain

DataStdio画面にてWorkflowを作成します。

f:id:sbc_ohara:20210311232629p:plain

STEP2: DI 同期タスクを作成

同期タスクを作成します。
f:id:sbc_ohara:20210311232713p:plain

STEP3: スクリプトモードにスイッチ

Switch to Code Editorボタンをクリックし、スクリプトモードにスイッチします。
f:id:sbc_ohara:20210311233608p:plain

するとスクリプトが表示されます。これは先述、GUIモードで選択した設定が自動でスクリプトに反映されます。
f:id:sbc_ohara:20210311233726p:plain

STEP4: DI 同期タスクを実行

スクリプト(タスク)を実行します。
f:id:sbc_ohara:20210311233756p:plain

スクリプト(タスク)が成功すると、タスクとしてLogが表示されます。
f:id:sbc_ohara:20210311233814p:plain

あとはAd-Hoc クエリで確認します(手順は上記の共通手順にて記載しています)

select * from nelly_test_dev.mysql_users;

f:id:sbc_ohara:20210311233321p:plain


最後に

本記事では、RDS for MySQL からMaxComputeへ連携する方法を簡単に説明しました。
RDSでデータ量が肥大化した場合は、この方法でMaxComputeへデータ移植、コスト削減およびDWHとしての運用ができれば幸いです。

最後までお読みいただきありがとうございました。

MaxCompute連載シリーズ

www.sbcloud.co.jp www.sbcloud.co.jp www.sbcloud.co.jp www.sbcloud.co.jp