この記事は Getting the most out of MySQL HeatWave Lakehouse with Autopilot の翻訳版です。
はじめに
MySQL HeatWave Lakehouseは、MySQL HeatWaveの機能とパフォーマンス、使いやすさをオブジェクト・ストレージのデータに対するクエリ実行にも有効にします。HeatWave Lakehouseの最初のブログでは、HeatWave Lakehouseの概要と、ユーザーがCSV、Parquet、クラウド・データベース・エクスポート(Aurora、Redshiftなど)などの様々なファイル形式でオブジェクト・ストア内の数百テラバイトのデータを処理、およびクエリ実行をできるようにすることでMySQL HeatWaveのポートフォリオを拡張する方法について説明しています。別のブログでは、システム設定、データのロード、ロードされたデータに対するクエリ実行など、MySQL HeatWave Lakehouseの使用を開始する方法をご紹介しました。
このブログでは、引き続きMySQL Autopilotの新機能がHeatWave Lakehouseのデータ管理タスクをどのように自動化するか、特に外部ソースからデータを取り込むプロセスの自動化とクエリ実行を改善する方法について説明します。これらの新機能について紹介する前に、Autopilotの既存の機能について簡単に説明します。
MySQL Autopilotの背景
MySQL Autopilot は、スケーラブルで高速なクエリパフォーマンスを実現する上で最も重要かつ難しい側面 ―プロビジョニング、データのロード、クエリ実行改善、障害対応などを自動化します。つまり、機械学習ベースの自動化機能を使用して、データ管理の3つの主要なステージ(システム設定、データロードおよびクエリ実行)を容易にし、強化します。また、障害発生時の対処も容易に行えるようにします。
強調表示されている項目(四角の部分)は、MySQL HeatWave Lakhouseに関連する新機能または拡張された機能です。
- システム設定(System Setup): 自動プロビジョニング機能(Auto Provisioning)と自動シェイプ予測機能(Auto Shape Prediction)は、分析処理とトランザクション処理などユーザーのニーズに合わせて適切なリソース量を割り当てる支援をします。
- データロード(Data Load): 自動エンコーディング(Auto Encoding)と自動データ配置(Auto Data Placement)は、必要なリソースの量(ひいては全体的なコスト)を最小限に抑えつつ、クエリ実行性能を最適化するために適切なデータの表現とパーティショニングを決定します。自動パラレルロードおよび自動アンロードは、テーブルのメモリ使用量を予測することによって、HeatWaveへのデータのロードおよびアンロードのプロセスを自動化し、最適化します。
- クエリ実行(Query Execution): 自動的な実行計画の改善(Auto Query Plan Improvement)と時間推定(Time Estimation)、自動スケジューリング(Auto Scheduling)、および自動スレッドプーリング(Auto Thread Pooling)をまとめて使用することで、最適なパフォーマンスを実現するために問合せを処理するタイミングと方法がインテリジェントに決定されます。自動変更伝播(Auto Change Propagation)によって、MySQL DatabaseからHeatWaveに変更を伝播する最適な時間が決定され、実行中のクエリのパフォーマンスを低下させることなく、データの鮮度が維持されます。
- 障害対応(Failure Handling): 自動リカバリ(Auto Error Recovery)によって、新しいノードが自動的にプロビジョニングされ、障害発生時に必要なデータが再ロードされます。
このブログの後半では、MySQL HeatWave Lakehouseに関連したMySQL Autopilotの新機能について説明します。
Lakehouse向けMySQL Autopilot
システム設定(System Setup): アダプティブ・データサンプリングと自動スキーマ推論(Adaptive Data Sampling, Auto Schema Inference)
このセクションでは以下の疑問にお答えします:
- どのようにスキーマを認識して、オブジェクトストアに格納されている外部ファイルに対してスキーマを作成するのか?
- どのくらいの規模のクラスタが必要か?
- データのロードにどのくらいの時間を要するか?
Autopilotの自動プロビジョニング機能(Auto Provisioning)は、ワークロードの実行に必要なHeatWaveの推奨ノード数を提示します。InnoDBテーブルの場合、データサイズは既知でスキーマはすでに定義されており、システムには表の統計/メタデータがあり、データサンプリングを介してAutopilotにより詳細を収集できます。しかし、レイクハウスとその外部テーブルのコンテキストでは、これらの情報のほとんどが欠落しており、オブジェクトストアに保存されているデータファイルから推測する必要があります。
Autopilotの2つの新機能がこの問題を解決し、データの取り込みを容易にします。アダプティブ・データサンプリング(Adaptive Data Sampling)を使用して、Autopilotはオブジェクトストアに保存されたファイルから必要な統計情報を直接収集します。インテリジェントかつ柔軟なサンプリング技術を使用することで、このプロセスは迅速かつ正確に行われます。収集された情報は自動スキーマ推測(Auto Schema Inference)によって、まだ定義されていないテーブルのスキーマ定義を提供し、自動プロビジョニング(Auto Provisioning)と自動パラレルロード(Auto Parallel Load)によって、必要なHeatWaveノードの数とロードに要する時間を推定します。全てのプロセスは、既存の自動パラレルロードのインターフェイスと統合されており、ユーザーは1回の呼び出しでInnoDB上のテーブルと外部にあるLakehouseテーブルを一緒に取り込むことができます。
自動パラレルロードのインタフェース(`sys.heatwave_load`)が拡張され、ユーザーがHeatWaveにロードする外部データに関する必要な情報を渡すことができる新しいオプション`external_tables`が追加されました。この新しいオプションの詳細は、ドキュメントを参照してください。このオプションを使用すると、アダプティブ・データサンプリングと自動スキーマ推論を使用して入力データから洞察を収集し、それらを使用して完全なデータロードスクリプト(推測されたスキーマに基づいて作成されていないデータベース/テーブルに対する`CREATE DATABASE`および`CREATE TABLE`コマンドを含む)を生成し、データのロードに必要なメモリと時間を予測します。次のセクションでは、生成されたスクリプトを自動的に実行してデータをロードする方法をご紹介しますが、その前に、この新機能の使用例をいくつかご紹介します。
以前のブログ以前のブログでは、自動パラレル・ロードがデータのロードに関連する作業や手作業をどのように削減するかについて説明しました。同じ構文とインタフェースを使用して、tpchスキーマの3つのテーブルをHeatWaveにロードしてみましょう。このスキーマにはすでにInnoDB上のテーブル(`nation_int`)が含まれているため、2つの新しいレイクハウス上の外部テーブル(`customer_ext`と`supplier_ext`)を作成したます。ロードコマンド全体を1行で定義することは可能ですが、読みやすくするために、SET コマンドを使用してオプション定義と分割します。
--Set the database name(s) to be loaded.
mysql> SET @db_list = '["tpch"]';
-- Set the external table parameters that provide information on how data is organized.
-- We can specify several databases and tables, with each table having its own options.
mysql> SET @ext_tables = '[{
"db_name": "tpch",
"tables": [{
"table_name": "customer_ext",
"dialect": {
"format": "parquet"
},
"file": [{
"par": "https://objectstorage.../customer.pq"
}]
},
{
"table_name": "supplier_ext",
"dialect": {
"format": "csv",
"field_delimiter": "|",
"record_delimiter": "|\\n"
},
"file": [{
"prefix": "src_data/tpch/supplier",
"bucket": "myBucket",
"namespace": "myNamespace",
"region": "myRegion"
}]
}]
}]';
-- Set the options and invoke Auto Parallel Load with the specified options.
mysql> SET @options = JSON_OBJECT('external_tables', CAST(@ext_tables AS JSON));
mysql> CALL sys.heatwave_load(@db_list, @options);
上記の設定コマンドを実行すると、複数のパネルが表示されます。まず「Lakehouse Auto Schema Inference」パネルには、ロードする各外部テーブルごとに未加工のファイル・サイズ、推測される列数・行数、処理中に発生した問題など、全体的な情報が表示されます。このパネルには、入力データベースにすでに作成されている(しかし、まだロードされていない)外部テーブルも表示されます。そのため、パネルには作成されるテーブルの数も表示されます。
次に、「Offload Analysis」パネルには、入力スキーマに関する情報、サポートされていない表/列があるかどうか、およびHeatWaveにロードされている表/列の合計数が表示されます。
「Capacity Estimation」パネルでは、このデータのロードに必要なメモリー量と、このロード操作にかかる時間に関する Autopilotの推定に関する情報を提供します。この場合、クラスタにはすべてのデータをロードするのに十分なノードが1つしかないため、Autopilotは自動的に「dryrun」モードになり、ロード・スクリプトのみを生成します。
なお、HeatWaveクラスタがすでに有効になっていて、かつ全てのテーブルが作成済み (正、まだロードされていない)であれば、OCIコンソールから自動プロビジョニング機能を使用してノード数の見積りを行うこともできます。OCIコンソールでノード数の見積りを生成する方法の詳細は、OCIのドキュメントOCIのドキュメントを参照してください。
「Load Script Generation」パネルには生成されたスクリプトとその操作方法に関する情報が表示されます。この例では、全てのデータに対応できるようにクラスタのサイズを変更してHeatWaveへのデータのロードを再試行する必要があります。
自動パラレルロードでは、実際にHeatWaveへのデータロードを実行せずにロードに関する情報を確認できる「dryrun」モードと、十分な容量が指定されていると仮定して生成されたロードスクリプトを自動的に実行する「normal」モードの2つのモードがサポートされています。前述の例では、「dryrun」モードを使用しました。(リソース不足のためにシステムが自動的にこのモードに切り替わりますが、この例のように入力オプションの一部としてこのモードを選択することも可能です) 収集された情報に基づいて完全なロードクリプトがAutopilotによって生成されます。
前述のコードスニペットに示すように、Autopilotで生成されたスクリプトには、自動スキーマ推論機能の結果に基づいて生成される、作成されていない2つの外部テーブルに対するCREATE TABLEコマンドが含まれています。スクリプトには、InnoDB上のテーブルとレイクハウス上の外部テーブルの両方を含むすべてのテーブルに関するロードコマンド(`ALTER TABLE …SECONDARY_LOAD`)も含まれます。
mysql> SELECT log->>"$.sql" AS "Load Script"
FROM sys.heatwave_autopilot_report
WHERE type = "sql" ORDER BY id;
+--------------------------------------------------------------------------------+
| Load Script |
+--------------------------------------------------------------------------------+
| CREATE TABLE `tpch`.`customer_ext`( |
| `col_1` bigint unsigned NOT NULL, |
| `col_2` varchar(20) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN', |
| `col_3` varchar(40) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN', |
| `col_4` tinyint unsigned NOT NULL, |
| `col_5` varchar(15) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN', |
| `col_6` decimal(6,2) NOT NULL, |
| `col_7` varchar(10) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN', |
| `col_8` varchar(116) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN' |
| ) ENGINE=lakehouse SECONDARY_ENGINE=RAPID |
| ENGINE_ATTRIBUTE='{"file": [{"par": "https://objectstorage.../customer.pq"], |
| "dialect": {"format": "parquet"}}'; |
| ALTER TABLE `tpch`.`customer_ext` SECONDARY_LOAD; |
| SET SESSION innodb_parallel_read_threads = 1; |
| ALTER TABLE `tpch`.`nation` SECONDARY_ENGINE=RAPID; |
| ALTER TABLE `tpch`.`nation` SECONDARY_LOAD; |
| CREATE TABLE `tpch`.`supplier_ext`( |
| `col_1` int unsigned NOT NULL, |
| `col_2` varchar(20) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN', |
| `col_3` varchar(40) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN', |
| `col_4` tinyint unsigned NOT NULL, |
| `col_5` varchar(15) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN', |
| `col_6` decimal(6,2) NOT NULL, |
| `col_7` varchar(100) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=VARLEN' |
| ) ENGINE=lakehouse SECONDARY_ENGINE=RAPID |
| ENGINE_ATTRIBUTE='{"file": [{"prefix": "src_data/tpch/supplier", |
| "bucket": "myBucket", "namespace": "myNamespace", |
| "region": "myRegion"}], |
| "dialect": {"format": "csv", "field_delimiter": "|", |
| "record_delimiter": "|\\n"}}'; |
| ALTER TABLE `tpch`.`supplier_ext` SECONDARY_LOAD; |
+--------------------------------------------------------------------------------+
自動パラレルロードによって生成された、CREATE TABLE文を含むロードスクリプト。出力結果は読み取り可能な形式で表示されます。
また、実際のCREATE TABLE出力は1行で生成されます。
データロード: 自動パラレルロード(Auto Parallel Load)および自動データフロー(Auto Data Flow)
前のセクションでは、自動パラレルロードを使用して、レイクハウス上の外部テーブルをInnoDB上のテーブルと共に処理し、データをHeatWaveにロードするシステムを準備する方法を示しました。「dryrun」モードは、データのロードを試みる前にデータセットの概要と必要なリソース量をすばやく把握したい場合に有用です。生成したCREATE TABLEコマンドを必要に応じてカラム名またはデータ型を修正することも可能です。次に、自動パラレルロードで生成されたスクリプトを実行する方法を確認します。また、レイクハウス上の外部テーブルのロードに使用できるAutopilot機能についても説明します。
mysql> SET @db_list = '["tpch"]';
mysql> SET @ext_tables = '[{
"db_name": "tpch",
"tables": [{
"table_name": "supplier_ext",
"dialect": {
"format": "csv",
"field_delimiter": "|",
"record_delimiter": "|\\n"
},
"file": [{
"prefix": "src_data/tpch/supplier",
"bucket": "myBucket",
"namespace": "myNamespace",
"region": "myRegion"
}]
}]
}]';
mysql> SET @options = JSON_OBJECT('external_tables', CAST(@ext_tables AS JSON));
mysql> CALL sys.heatwave_load(@db_list, @options);
より少ないテーブルでデータロードを再試行すると、必要なメモリ量も少なくなります。
以下の例では、1ノードのHeatWaveクラスタに収まる前述の2つのテーブルのみをロードします。
「normal」モードで実行すると、全てのテーブルをロードするためのロードスクリプトの一部として実行されるコマンドと、データロードにかかった時間のレポートが追加のパネルに出力されます。
Autopilotには、アダプティブ・データフローと呼ばれるレイクハウス固有の新しい機能が追加されており、大規模なクラスタ全体でオブジェクトストアへのネットワーク帯域幅使用率を制御および調整します。Autopilotは、オブジェクトストアのパフォーマンスに順応することで、システム全体のパフォーマンスと信頼性を向上させます。
外部テーブルのロードには、クラスタ全体にロード処理をインテリジェントに分散させるというスマートスケジューラの様な効果もあり、クラスタノード間で負荷を分散させることで最大のパフォーマンスが得られます。スケジューラは、ノード数やファイルタイプ(ParquetやCSV等)、ファイル構造(ファイル数や各ファイルの大きさ)など、いくつかの要素を考慮して最も効率的なタスク分散を行います。
クエリ実行
データをロードしたら、今度はロードしたデータに対してクエリを実行してみましょう。Autopilotの既存のクエリ実行機能は、InnoDB上のテーブルがこれまでサポートされていたのと同じように、レイクハウス上のテーブルをサポートするように拡張されています。Autopilotは、クエリ実行中に継続して統計情報を収集し、クエリの実行計画を改善するために使用されます。
同様に、Autopilotのアドバイザー機能もレイクハウス上の外部テーブルに対応できるよう拡張されており、自動データ配置、クエリインサイト、アンロードなどのアドバイザーの機能を活用して最適化することが可能です。
まとめ
MySQL HeatWaveは、OLTP、OLAP、機械学習アプリケーションを一括で対応できるデータベースを提供し、パフォーマンスとコストの面で大きなメリットをもたらします。MySQL Autopilotは、HeatWaveのパフォーマンス、スケーラビリティ、使いやすさについて機械学習を利用して自動的に向上させる機能を提供します。MySQL Autopilotのレイクハウスに対応した拡張機能は、システムのセットアップ、データのロード、オブジェクトストアに保存されたデータに対するクエリの実行プロセスを簡素化します。ユーザーは、InnoDB上のテーブルとレイクハウス上の外部テーブルを同時に操作する際に、MySQL Autopilotの機能をシームレスに活用することができます。
参考資料:
- MySQL HeatWave webサイト
- MySQL HeatWave Lakehouse技術概要
- MySQL Autopilotについて
- MySQL HeatWave Lakehouseを使うには Oracle Cloud にログイン (または ここから登録)
