EnterpriseZine(エンタープライズジン)

EnterpriseZine(エンタープライズジン)

テーマ別に探す

MySQL Autopilotによるクラウドデータベースの機械学習を応用した運用自動化 第6回

edited by DB Online   2021/08/30 14:00

 この連載ではMySQLの開発チームが開発、運用、サポートを行っているクラウド・データベースであるOracle MySQL Database Serviceと、分析処理を爆速化する分析エンジンHeatWaveについて、製品の特徴や使い方を解説していきます。2021年8月にオンラインで開催されたオラクルのイベントOracle LiveにてHeatWaveの最新機能が数多く発表されました。第6回はこれらの新機能についてご紹介いたします。

 HeatWaveはMySQLをベースとしたOracle Cloud InfrastructureのクラウドデータベースMySQL Database Serviceの分析系の処理を高速化するモジュールです。このHeatWaveはオラクルの研究開発部門であるOracle Labsでの「インメモリのデータ分析の費用対効果を最大化する研究」から生まれています。Oracle Labsでは機械学習に関する研究も数多く行われており、HeatWaveの運用管理を効率化するための仕組みに取り込まれています。

MySQL Autopilot: 機械学習を応用したHeatWaveの運用自動化

 MySQL Autopilotと名付けられた仕組みによって、データベース管理者による手動での設定や運用をHeatWaveが自動化します。自動化の裏側では機械学習による学習と判断が広く活用されています。MySQL Autopilotで提供される自動化の機能は以下の通りです。

  • 自動プロビジョニング (Auto Provisioning):HeatWaveノードのメモリ上にMySQLサーバーから展開されるデータ量の見積もりを最小のサンプリングになるように自動調整して時間を短縮し、最適なクラスタサイズを予測
  • 自動並列ロード (Auto Parallel Loading):MySQLサーバーからHeatWaveノードへのデータロードに最適な並列度をテーブルごとに予測し、ロード時間とメモリ使用を最適化
  • 自動データ配置 (Auto Data Placement):連載第5回でご紹介したテーブルをパーティショニングのために利用する列「データ・プレイスメント・キー」を予測
  • 自動エンコーディング (Auto Encoding):テーブル内の文字列型のレコードの格納方式をHeatWaveノードに格納するか、MySQLサーバーノードのメモリー上に格納するかについて、実行されたクエリからどちらの形式が最適化を予測し推奨
  • 自動クエリー計画改善 (Auto Query Plan Improvement):実行されたSQLからの各種統計情報をHeatWaveノードが学習し、以後のHeatWave内での実行計画を改善
  • 自動クエリー時間予測 (Auto Query Time Estimation):クエリの実行時間を実行前に予測し、ユーザーが処理時間の長いクエリを実行するかの判断を支援
  • 自動変更伝播 (Atuo Change Propagation):MySQLサーバー内で行われた変更点をHeatWaveノードのスケールアウト・データ管理レイヤーに反映するタイミングを学習結果から決定
  • 自動スケジューリング (Auto Scheduling):実行前のクエリについて実行時間が短いものを優先して実行に移すことで、全体的な処理待ちの時間を短縮
  • 自動エラーリカバリ (Auto Error Recovery):HeatWaveノードの障害時に自動的にノードとプロビジョニングにして復旧
Autopilot概要 (Oracle Liveのプレゼンテーションより)[クリックして拡大]

HeatWaveクラスターの構築とデータロード時に利用できるAutopilotの機能

 自動プロビジョニングではサンプリングの割合と想定されたエラー率から最適なバランスを予測します。

自動プロビジョニングの例[クリックして拡大]

 自動プロビジョニングによりデータ量の台数を行うと、対象のテーブルをHeatWaveノードにロードするためのコマンドを集約したストアド・プロシージャheatwave_loadがMySQLサーバーノード内のsysスキーマに自動的に作成されます。自動プロビジョニング画面下部にはこのストアド・プロシージャを呼び出すためのコマンドも表示されます。

データロード用のストアド・プロシージャ実行例

mysql> call sys.heatwave_load(JSON_ARRAY('sample'),null);
+------------------------------------------+
| INITIALIZING HEATWAVE AUTO LOAD     |
+------------------------------------------+
| Version: 1.12              |
|                     |
| Load Mode: normal            |
| Load Policy: disable_unsupported_columns |
| Output Mode: normal           |
|                     |
+------------------------------------------+
6 rows in set (0.00 sec)
+-----------------------------------------------------------------------------------------+
| OFFLOAD ANALYSIS                                    |
+-----------------------------------------------------------------------------------------+
| Verifying input schemas: 1                               |
| User excluded items: 0                                 |
|                                             |
| SCHEMA            OFFLOADABLE  OFFLOADABLE   SUMMARY OF         |
| NAME               TABLES    COLUMNS   ISSUES           |
| ------            -----------  -----------   ----------         |
| `sample`               9       88   4 table(s) are not loadable |
|                                             |
| Total offloadable schemas: 1                              |
|                                             |
+-----------------------------------------------------------------------------------------+
10 rows in set (0.05 sec)
+-----------------------------------------------------------------------------------------------------------------------------+
| CAPACITY ESTIMATION                                                     |
+-----------------------------------------------------------------------------------------------------------------------------+
| Default load pool for tables: TRANSACTIONAL                                         |
| Default encoding for string columns: VARLEN (unless specified in the schema)                        |
| Estimating memory footprint for 1 schema(s)                                         |
|                                                               |
|                TOTAL    ESTIMATED    ESTIMATED    TOTAL   DICTIONARY   VARLEN    ESTIMATED |
| SCHEMA          OFFLOADABLE  HEATWAVE NODE   MYSQL NODE   STRING    ENCODED   ENCODED      LOAD |
| NAME             TABLES    FOOTPRINT    FOOTPRINT   COLUMNS    COLUMNS   COLUMNS      TIME |
| ------          -----------    ---------    ---------   -------   ----------   -------    --------- |
| `sample`             9    16.07 GiB    36.00 MiB     32       0     32     54.00 s |
|                                                               |
| Sufficient MySQL host memory available to load all tables.                                 |
| Sufficient HeatWave cluster memory available to load all tables.                              |
|                                                               |
+-----------------------------------------------------------------------------------------------------------------------------+
13 rows in set (0.06 sec)
+---------------------------------------------------------------------------------------------------------------------------------------+
| EXECUTING LOAD                                                            |
+---------------------------------------------------------------------------------------------------------------------------------------+
| HeatWave Load script generated                                                    |
|  Retrieve load script containing 25 generated DDL command(s) using the query below:                         |
|  SELECT log->>"$.sql" AS "Load Script" FROM sys.heatwave_load_report WHERE type = "sql" ORDER BY id;                 |
|                                                                    |
| Adjusting load parallelism dynamically per table                                           |
| Using current parallelism of 16 thread(s) as maximum                                         |
|                                                                    |
| Using SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
|                                                                    |
| Proceeding to load 9 tables into HeatWave                                               |
|                                                                    |
| Applying changes will take approximately 53.33 s                                           |
|                                                                    |
+---------------------------------------------------------------------------------------------------------------------------------------+
13 rows in set (0.07 sec)
+----------------------------------------+
| LOADING TABLE             |
+----------------------------------------+
| TABLE (1 of 9): `sample`.`caseww`   |
| Commands executed successfully: 2 of 3 |
| Warnings encountered: 0        |
| Table loaded successfully!       |
|  Total columns loaded: 19       |
|  Table loaded using 8 thread(s)    |
|                    |
+----------------------------------------+
7 rows in set (0.63 sec)
<略>
+-------------------------------------------------------------------------------+
| LOAD SUMMARY                                 |
+-------------------------------------------------------------------------------+
|                                        |
| SCHEMA             TABLES    TABLES   COLUMNS     LOAD |
| NAME              LOADED    FAILED    LOADED   DURATION |
| ------             ------    ------   -------   -------- |
| `sample`              9      0      88   28.59 s |
|                                        |
+-------------------------------------------------------------------------------+
6 rows in set (28.67 sec)
Query OK, 0 rows affected (28.67 sec)

 この仕組みによって第5回にご紹介したようなコマンドを個別に実行する必要がなくなり、作業効率の向上と人為的ミスの抑制につながります。

 このスクリプトの中では、自動並列ロードという仕組みによってテーブルごとにデータをロードする処理の並列度を機械学習により最適な値に自動的に調整しています。

自動並列ロードの例[クリックして拡大]

HeatWaveにロードされたテーブルのパーティショニング最適化

 MySQL Autopilotの自動データ配置アドバイザーでは、MySQLノード上のテーブルをHeatWaveノード群に展開する際に、HeatWave構成に対して「実行されたSQL文」を学習して最適なのパーティション・キーを提案します。同時にキーを変更した際に期待される性能改善、および変更にかかる時間の予測を提示します。

自動データ配置の例[クリックして拡大]

 ここでは例えばLINEITEMテーブルのパーティション・キーを下記のように変更することを提案しています。

  • 現状:l_orderkey, l_linenumber
  • 推奨: l_orderkey

 もう一つ変更を推奨されているPARTSUPPテーブルの定義をあわせて変更することで、処理時間として5.29分、29.3%の性能向上が期待できると推測しています。またこの2つのテーブルのパーティショニングを再構成するためには7.63時間かかることも推測されています。定義の変更に必要なDDLを生成するコマンドを最後に表示されています。

 特に自動データ配置と自動エンコーディングによる予測を利用して最適なデータ配置を設定すると同時に、内部的に利用される自動クエリー計画改善によってSQLを繰り返し実行していくことで処理性能が改善され、MySQL Autopilotを利用しない場合と比較して大幅な処理時間の短縮が見込めます。

自動データ配置による性能改善の予測と実際の値 (Oracle Liveのプレゼンテーションより)[クリックして拡大]

 このMySQL AutopilotはHeatWaveの標準機能となり、追加費用などは一切不要です。Autopilotは単に処理時間が短くなるだけではなく、機械学習を活用した予測によって最適化の度合いや最適にかかる時間をあわせて精度高く見積もることができます。

 他のクラウドデータベースでは類似した機能さえ提供されていない機械学習を活用した圧倒的に先進的な機構となっており、他社のサービスと比較しても分析処理性能が高く運用効率の良いクラウドデータベースをより安価に利用可能となっています。

HeatWaveと他社製品とのコストパフォーマンス比較 (Oracle Liveのプレゼンテーションより)[クリックして拡大]

 次回はHeatWaveノードの扱えるデータ容量を拡張し、再起動や障害からの復旧時のデータロード時間を短縮するMySQL Scale-out Data Managementについて解説します。

[クリックして拡大]


関連リンク

著者プロフィール

  • 梶山隆輔(カジヤマリュウスケ)

    日本オラクル株式会社 MySQL Global Business Unit Asia Pacific & Japan担当 MySQL Principal Sales Consultant オラクル社において、MySQLのお客様環境への導入支援や製品の技術解説を担当するセールスコンサルタントチームのアジア太平洋地域リーダー。多国籍なMySQL部門にて、台湾、オーストラリア、インドに在籍するチームメンバーを束ね、アジア太平洋地域の25以上の国や地域でのMySQL普及やビジネスの拡大をミッションとする。  

バックナンバー

連載:MySQLとHeatWaveが切り開くオープンソース・データベースの新基準
All contents copyright © 2007-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5