MySQL のデータに対して全文検索、多次元クエリ、統計分析などの操作を実行するには、Alibaba Cloud Elasticsearch を使用します。 このトピックでは、DataWorks の Data Integration サービスを使用して、MySQL から Alibaba Cloud Elasticsearch インスタンスにデータを迅速に同期する方法について説明します。
背景
DataWorks は、ビッグデータエンジンを基盤とするエンドツーエンドのビッグデータ開発およびガバナンスプラットフォームです。 データ開発、タスクスケジューリング、データ管理などの機能が統合されています。 DataWorks の同期タスクを使用すると、さまざまなデータソースから Alibaba Cloud Elasticsearch にデータを迅速に同期できます。
-
サポートされているデータソース:
-
Alibaba Cloud データベース (MySQL、PostgreSQL、SQL Server、MongoDB、HBase)
-
Alibaba Cloud PolarDB-X (DRDS からアップグレード)
-
Alibaba Cloud MaxCompute
-
Alibaba Cloud OSS
-
Alibaba Cloud Tablestore
-
HDFS、Oracle、FTP、DB2、およびその他のサポートされているデータベースタイプのセルフマネージドバージョン
-
-
シナリオ:
-
ビッグデータの Alibaba Cloud Elasticsearch へのオフライン同期。 データベース全体または特定のテーブルのすべてのデータを同期できます。 詳細については、「MySQL データベース全体の Elasticsearch へのオフライン同期」をご参照ください。
-
ビッグデータの Alibaba Cloud Elasticsearch へのリアルタイム同期。 この方法は、完全同期と増分同期の両方をサポートしています。 詳細については、「MySQL データベース全体の Elasticsearch へのリアルタイム同期」をご参照ください。
-
前提条件
-
RDS for MySQL インスタンスを作成しておきます。 詳細については、「RDS for MySQL インスタンスの作成」をご参照ください。 このトピックでは、MySQL 5.7 を例として使用します。
-
Alibaba Cloud Elasticsearch インスタンスを作成し、その自動インデックス作成機能を有効にしておきます。 詳細については、「Alibaba Cloud Elasticsearch インスタンスの作成」および「YML パラメーターの設定」をご参照ください。
-
DataWorks ワークスペースを作成しておきます。 詳細については、「ワークスペースの作成」をご参照ください。
-
データを同期できるのは Alibaba Cloud Elasticsearch インスタンスのみです。 セルフマネージドの Elasticsearch クラスターはサポートされていません。
-
RDS for MySQL インスタンス、Elasticsearch インスタンス、および DataWorks ワークスペースは、同じリージョンにある必要があります。
-
RDS for MySQL インスタンス、Elasticsearch インスタンス、および DataWorks ワークスペースは、同じタイムゾーンにある必要があります。 そうでない場合、時間関連のデータを同期するときに時差が発生する可能性があります。
課金
-
Alibaba Cloud Elasticsearch インスタンスの料金については、「Elasticsearch の課金項目」をご参照ください。
-
Data Integration リソースグループの料金については、「リソースグループの料金」をご参照ください。
手順
このトピックでは、オフライン同期タスクを例に説明します。 リアルタイムでデータを同期する場合は、「MySQL データベース全体の Elasticsearch へのリアルタイム同期」をご参照ください。
ステップ1:ソースデータの準備
RDS for MySQL インスタンスでデータベースとテーブルを作成します。
-
Alibaba Cloud RDS データベース、またはローカルサーバー上のセルフマネージドデータベースを使用できます。 このトピックでは、RDS for MySQL データベースを例に説明します。 詳細については、「クイックスタート」をご参照ください。
-
次のサンプルコードは、テーブルを作成してデータを挿入する方法を示しています。
-- テーブルの作成 CREATE TABLE `es_test` ( `id` bigint(32) NOT NULL, `name` varchar(32) NULL, `age` bigint(32) NULL, `hobby` varchar(32) NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -- データの挿入 INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (1,'user1',22,'music'); INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (2,'user2',23,'sport'); INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (3,'user3',43,'game'); INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (4,'user4',24,'run'); INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (5,'user5',42,'basketball');
ステップ2:リソースグループの購入と設定
Data Integration リソースグループを購入し、VPC とワークスペースをリソースグループに関連付けます。
-
DataWorks コンソールにログインします。
-
上部メニューでリージョンを選択します。 左側のナビゲーションペインで、リソースグループ をクリックします。
-
リソースグループの作成 をクリックし、プロンプトに従ってパラメーターを設定します。
-
作成したリソースグループの Actions 列で、ネットワーク設定 をクリックして VPC をリソースグループに関連付けます。 詳細については、「ネットワーク設定の構成」をご参照ください。
データ同期を可能にするには、リソースグループが RDS for MySQL インスタンスと Elasticsearch インスタンスの両方に接続できる必要があります。 したがって、リソースグループをインスタンスと同じ [Virtual Private Cloud (VPC)]、Zone、vSwitch に関連付ける必要があります。 インスタンスの VPC 情報を確認するには、「RDS for MySQL インスタンスの VPC と vSwitch の切り替え」および「Elasticsearch インスタンスの基本情報の表示」をご参照ください。
重要vSwitch CIDR ブロック の CIDR ブロックを、RDS for MySQL インスタンスと Elasticsearch インスタンスの両方の IP ホワイトリストに追加する必要があります。 詳細については、「RDS for MySQL インスタンスの IP ホワイトリストの設定」および「Elasticsearch インスタンスのパブリックまたはプライベート IP ホワイトリストの設定」をご参照ください。
-
ページの左上隅にある戻るアイコンをクリックして、Resource List ページに戻ります。
-
作成したリソースグループの Actions 列で、[ワークスペースのバインド] をクリックして、ターゲットワークスペースをリソースグループに関連付けます。
ステップ3:データソースの追加
RDS for MySQL と Elasticsearch のデータソースを DataWorks の Data Integration サービスに追加します。
-
DataWorks の Data Integration ページに移動します。
-
DataWorks コンソールにログインします。
-
左側のナビゲーションペインで、ワークスペース をクリックします。
-
ターゲットワークスペースの Actions 列で、 の順に選択します。
-
-
左側のナビゲーションペインで、データソース をクリックします。
-
RDS for MySQL データソースを追加します。
-
ソースインスタンス ページで、ソースインスタンスの追加 をクリックします。
-
ソースインスタンスの追加 ページで、MySQL を検索して選択します。
-
[MySQL データソースの追加] ダイアログボックスの 基本情報 セクションで、データソースのパラメーターを設定します。
詳細については、「MySQL データソースの設定」をご参照ください。
-
接続設定 セクションで、接続テスト をクリックします。 ステータスが [到達可能]の場合は、接続が成功したことを示します。
-
完了 をクリックします。
-
-
同じ方法で Elasticsearch データソースを追加します。 詳細については、「Elasticsearch データソースの設定」をご参照ください。
ステップ4:オフライン同期タスクの設定と実行
オフライン同期タスクは、コンピューティングリソースとして機能するリソースグループで実行されます。 リソースグループは、設定されたデータソースからデータを取得し、Elasticsearch に書き込みます。
-
オフライン同期タスクは、ウィザードモードまたはスクリプトモードで設定できます。 このトピックでは、ウィザードモードを例に説明します。 スクリプトモードの詳細については、「スクリプトモードでの同期ノードの設定」、「MySQL Reader」、および「Elasticsearch Writer」をご参照ください。
-
以下の手順は レガシ Data Development (DataStudio) ページで実行されます。
-
DataWorks の データ開発 ページに移動します。
-
DataWorks コンソールにログインします。
-
左側のナビゲーションペインで、ワークスペース をクリックします。
-
ターゲットワークスペースの Actions 列で、 の順に選択します。
-
-
オフライン同期ノードを作成します。
-
左側のナビゲーションペインの Data Studio タブ (
アイコン) で、 の順に選択します。 次に、プロンプトに従ってワークフローを作成します。 -
作成したワークフローを右クリックし、 の順に選択します。
-
ノードの作成 ダイアログボックスで、ノード名を入力し、OK をクリックします。
-
-
ネットワークとリソースを設定します。
-
データソース エリアの データソース で MySQL を選択し、ソースインスタンス名 で同期するデータソースの名前を選択します。
-
リソースグループ セクションで、リソースグループを選択します。
-
データ宛先 セクションの データ宛先 で Elasticsearch を選択し、ソースインスタンス名 で同期するデータソースの名前を選択します。
-
-
Next step をクリックします。
-
タスクを設定します。
-
データソース セクションで、同期するテーブルを選択します。
-
データ宛先 セクションで、宛先のパラメーターを設定します。
-
フィールドマッピング セクションで、ソースフィールド と ターゲットフィールド 間のマッピングを設定します。
-
チャンネル制御 セクションで、チャネルパラメーターを設定します。
設定の詳細については、「ウィザードを使用した同期タスクの設定」をご参照ください。
-
-
タスクを実行します。
-
(オプション) タスクのスケジューリングプロパティを設定します。 右側のペインで スケジューリング設定 をクリックし、必要に応じてスケジューリングパラメーターを設定します。 パラメーターの詳細については、「スケジューリングプロパティの設定」をご参照ください。
-
ノードエディターの左上隅にある保存アイコンをクリックして、タスクを保存します。
-
ノードエディターの左上隅にある送信アイコンをクリックして、タスクを送信します。
スケジューリングプロパティを設定した場合、タスクはスケジュールに基づいて自動的に実行されます。 ノードエディターの左上隅にある実行アイコンをクリックして、すぐにタスクを実行することもできます。
操作ログに
Shell run successfully!というメッセージが表示されたら、タスクが正常に実行されたことを示します。
-
ステップ5:結果の検証
-
宛先の Alibaba Cloud Elasticsearch インスタンスの Kibana コンソールにログインします。 詳細については、「Kibana コンソールへのログイン」をご参照ください。
-
Kibana ページの左上隅にあるアイコンをクリックし、[開発ツール] を選択します。
-
[コンソール] で、次のコマンドを実行して同期されたデータを表示します。
POST /es_test/_search?pretty { "query": { "match_all": {}} }説明es_testを、データ同期タスクで指定したインデックス名に置き換えます。データが正常に同期されると、次の結果が返されます。
POST /es_test/_search?pretty { "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 5, "max_score" : 1.0, "hits" : [ { "_index" : "es_test", "_type" : "es_test", "_id" : "2", "_score" : 1.0, "_source" : { "age" : 23, "hobby" : "sport", "id" : 2, "name" : "user2" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "1", "_score" : 1.0, "_source" : { "age" : 22, "hobby" : "music", "id" : 1, "name" : "user1" } } ] } }