すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:Query Acceleration (MCQA)

最終更新日:Dec 03, 2025

このトピックでは、MaxCompute Query Acceleration (MCQA) 機能のシステムアーキテクチャー、主要な特徴、および一般的な利用シーンについて説明します。

重要

MaxCompute は、Alibaba Cloud 中国サイト (www.aliyun.com) では 2025年11月24日 (月) (UTC+8) に、Alibaba Cloud 国際サイト (www.alibabacloud.com) では 2025年11月27日 (木) (UTC+8) に、MaxQA (MaxCompute Query Accelerator 2.0) をリリースする予定です。リリース後、このドキュメントで説明されている MCQA 機能は、新規のお客様にはご利用いただけなくなります。

概要

MaxCompute Query Acceleration (MCQA) 機能は、以下の機能を提供します。

  • 中小規模のデータセットに対するクエリを高速化および最適化します。この機能により、クエリ時間が数分から数秒に短縮され、既存の MaxCompute クエリ機能と完全に互換性があります。

  • アドホッククエリや BI 分析のために、主要なビジネスインテリジェンス (BI) ツールをサポートします。

  • オフラインコンピューティングリソースを占有しない独立したリソースプールを使用します。この機能はクエリジョブを自動的に識別し、キューイングのプレッシャーを軽減し、ユーザーエクスペリエンスを向上させます。

  • MCQA ジョブの結果を一時キャッシュに書き込みます。同じクエリジョブを再度実行すると、MaxCompute はキャッシュされた結果を返し、実行を高速化します。

クエリフロー

以下の図は、MaxCompute のクエリ処理アーキテクチャーを示しています。クエリが受信されると、スマートルーティング機能がそれを特定のルールツリーにルーティングし、Query Acceleration (MCQA)、標準 SQL 実行、またはマルチエンジンコンピューティングによって処理します。

上記のアーキテクチャーでは、MCQA はクエリジョブの結果を一時キャッシュに書き込みます。同じクエリジョブを再度実行すると、MaxCompute はキャッシュされた結果を返し、実行を高速化します。キャッシュ機構の詳細については、「キャッシュ機構」をご参照ください。

利用シーン

利用シーン

説明

特徴

アドホッククエリ

MCQA を使用して、最大数百ギガバイトの中小規模データセットでのクエリパフォーマンスを最適化できます。これにより、MaxCompute テーブルに対して直接低レイテンシのクエリを実行し、データ開発とデータ分析を迅速に完了できます。

  • クエリ条件を柔軟に選択してクエリ結果を迅速に取得し、必要に応じてクエリロジックを調整します。

  • クエリレイテンシの要件は数十秒以内です。

  • ユーザーは通常、SQL スキルを持つデータ開発者またはデータアナリストであり、使い慣れたクライアントツールでクエリ分析を行いたいと考えています。

ビジネスインテリジェンス (BI)

MaxCompute を使用してエンタープライズデータウェアハウスを構築する際、抽出、変換、ロード (ETL) プロセスはデータをビジネス指向の集計データに変換します。MCQA は低レイテンシ、エラスティックな同時実行性、およびデータキャッシングを提供します。MaxCompute のテーブルパーティションやバケット化などの最適化と組み合わせることで、レポート生成、統計分析、および固定レポート分析のニーズを、高い同時実行性と高速応答で低コストで満たすことができます。

  • クエリ対象のデータオブジェクトは通常、集計された結果データです。

  • 小規模データ量、多次元クエリ、固定クエリ、高頻度クエリのシナリオに適しています。

  • 秒単位の応答が求められる低いクエリレイテンシが必要です。例えば、ほとんどのクエリは 5 秒を超えてはなりません。クエリ時間はデータ量とクエリの複雑さによって大きく異なります。

大量データの詳細なクエリ分析

MCQA はクエリジョブの特徴を自動的に識別できます。小規模なジョブには迅速に応答し、大規模なジョブにはリソース要件を自動的に適合させます。これにより、さまざまな規模と複雑さのクエリジョブを扱うアナリストのニーズを満たします。

  • 大量の履歴データを探索する作業が含まれ、必要な有効データは少なく、クエリレイテンシの要件は中程度です。

  • ユーザーは通常、詳細データからビジネスパターンを探索し、機会を特定し、仮説を検証する必要があるビジネスアナリストです。

制限事項

  • バージョン要件:

  • SELECT で始まるデータクエリ文のみがサポートされています。MCQA でサポートされていない文を送信した場合、MaxCompute クライアント、Java Database Connectivity (JDBC)、およびソフトウェア開発キット (SDK) は、標準のオフライン実行モードにフォールバックするように設定できます。他のツールはこのフォールバックをサポートしていません。クエリジョブが標準 SQL ジョブにフォールバックした後、標準 SQL ジョブの課金方法に基づいて課金されます。

  • 行制限:デフォルトでは、最大 1,000,000 行のデータをクエリできます。SQL 文に LIMIT キーワードを追加することで、この制限を超えることができます。

  • 機能制限

    制限

    説明

    特徴

    • MaxCompute Standard Edition および従量課金サービスをサポートします。

    • サブスクリプション課金方法をサポートします。

    • MaxCompute の Developer Edition はサポートしていません。Standard Edition にアップグレードする必要があります。

    クエリ

    • 1 回の実行ジョブでサポートされる同時実行ワーカーは最大 2,000 です。

    • クライアント経由で送信された MCQA ジョブは、デフォルトで 30 秒後にタイムアウトします。DataWorks のアドホッククエリ経由で送信された MCQA ジョブは、デフォルトで 20 秒後にタイムアウトします。タイムアウト後、MCQA ジョブはデフォルトで標準クエリジョブにフォールバックします。

    • ALIORC ストレージ形式のテーブルのデータのみが、高速化のためにメモリにキャッシュできます。

    クエリの同時実行

    • サブスクリプションモード。

      • Free Edition (MCQA インタラクティブリソースグループなし)。

        各プロジェクトは 5 つの同時ジョブに制限され、1 日あたりのジョブ数は最大 500 です。制限を超えると、ジョブはデフォルトで自動的に標準ジョブにフォールバックします。フォールバックが無効になっている場合、システムは次のエラーを報告します:

        ODPS-1800001: Session exception - Failed to submit sub-query in session because:Prepaid project run outoffree query quota.
      • MCQA インタラクティブリソースグループ。

        • 各プロジェクトの MCQA ジョブの最大同時実行数は 120 です。この制限を超えると、送信されたジョブは標準ジョブモードにフォールバックします。

        • インタラクティブリソースタイプのクォータグループを構成する場合、MCQA ジョブの最小および最大予約 CU は同じでなければなりません。そうでない場合、構成は有効になりません。

        • インタラクティブリソースタイプは、以下の要件を満たす必要があります。そうでない場合、ジョブは送信できません。

          • 予約 CU [minCU]予約 CU [maxCU] と等しくなければなりません。

          • 予約 CU の数は 50 以上でなければなりません。

        • インタラクティブリソースクォータグループを設定すると、高速化が識別できるジョブのみが、すべてのプロジェクトのインタラクティブリソースクォータグループに送信できます。クエリ高速化機能の無料トライアルは利用できなくなります。

        • インタラクティブリソースタイプのクォータグループは、プロジェクトのデフォルトクォータとして使用できません。クエリ高速化機能を使用する場合、インタラクティブクォータグループは、プロジェクトにアタッチされることなく、すべてのプロジェクトで有効になります。

    • 従量課金モード。

      単一の MaxCompute プロジェクトの MCQA ジョブの最大同時実行数は 120 です。この制限を超えると、ジョブは標準ジョブモードにフォールバックします。

キャッシュメカニズム

各 MCQA クエリジョブに対して、MaxCompute はクエリ結果をキャッシュするための一時データセットを作成します。一時データセットのキャッシュサイズは 10 GB に制限されています。

  • 一時データセットのオーナーは、キャッシュされた結果を生成したクエリジョブを実行したユーザーです。

  • 一時データセットはユーザーには表示されず、その内容は表示できません。

  • MaxCompute は、クエリジョブを実行したユーザーに一時データセットへのアクセス権限を自動的に付与します。

  • キャッシュされたクエリ結果からデータを取得するには、クエリジョブとそのコンテキスト設定が元のクエリジョブと同一である必要があります。重複したクエリジョブを実行すると、MaxCompute はキャッシュされた結果を再利用します。

キャッシュされた結果の課金

キャッシュされたクエリ結果には、ストレージ料金やコンピューティング料金は発生しません。これにより、リソース使用コストを効果的に削減できます。

キャッシュされた結果の削除

MaxCompute は、以下の状況でキャッシュされた結果を削除します:

  • MaxCompute プロジェクトのリソース使用率が高い場合、MaxCompute はキャッシュされた結果を事前に削除します。

  • キャッシュされた結果が参照するテーブルまたはビューが変更された場合、キャッシュされた結果は直ちに無効になります。MaxCompute は無効なキャッシュされた結果を削除します。同じクエリジョブを再度実行しても、キャッシュデータは取得されません。

  • キャッシュされた結果の有効期限が切れています。

キャッシュの検証

Logview 2.0 を使用して、クエリジョブの Logview 情報を表示できます。次の図に示すように、[ジョブ詳細] タブで、クエリジョブの結果がキャッシュに書き込まれたことを確認できます:

Cache

サブスクリプションインスタンスで MCQA を有効にする

手順

サブスクリプションの MaxCompute インスタンスでプロジェクトを高速化するために、クエリ高速化機能を使用するには、次の手順に従います。

説明

サブスクリプションの MCQA クォータは、クエリ中のスキャン同時実行性を決定し、それがターゲットテーブルでスキャンされるデータ量に影響します。おおよその比率は、1 CU で 0.6 GB のデータをスキャンできるということです。たとえば、50 CU の MCQA クォータを購入した場合、同時に約 30 GB のデータをスキャンできます。現在、MCQA は最大 300 GB のスキャンをサポートしています。

  1. MaxCompute コンソールにログインし、左上隅でリージョンを選択します。

  2. 左側のナビゲーションウィンドウで、構成の管理 > クォータ管理 を選択します。

  3. クォータ管理 ページで、対象のクォータを見つけ、操作 列の クォータ設定 をクリックします。

  4. 基本的なクォータ設定を構成します。

    1. クォータ設定 ページで、基本設定 タブを選択し、基本設定の編集 をクリックします。

    2. 新しいレベル2クォータ をクリックするか、既存のレベル 2 クォータの基本パラメーターを設定します。

      カスタムの クォータ名 を入力し、データ型インタラクティブ に設定します。パラメーターの詳細については、「クォータの設定」をご参照ください。

  5. クォータのスケーリングを設定します。

    1. クォータ設定 ページで、スケーリング設定 タブを選択します。

    2. スケーリング設定 タブで、新しい構成スキーム をクリックするか、既存の設定プランを見つけて 操作 列の 編集 をクリックしてプランを更新します。

    3. 新しい構成スキーム または 設定シナリオの編集 ダイアログボックスで、MCQA リソースグループの 予約cu数量 [mincu、maxcu] を設定します。

      • 最小 CU 数 (minCU) は、最大 CU 数 (maxCU) と等しくなければなりません。

      • 最小 CU 数は 50 以上でなければなりません。インタラクティブリソースが不要な場合は、このパラメーターを 0 に設定します。

      • インタラクティブクォータでは、エラスティック予約 CU はサポートされていません。

    4. OK をクリックしてクォータ設定を保存します。

    5. スケーリング設定 タブで、対象の設定プランを見つけ、操作 列の すぐに有効 をクリックしてプランをすぐに適用します。また、タイムシェアリング管理 を設定する際に既存のプランを使用することもできます。

  6. 時間ベースのプランを設定します。

    時間ベースのプランを設定して、1 日の異なる時間に異なるクォータプランを有効にすることができます。これにより、クォータ設定の時間ベースのロジックが実装されます。

スケジューリングポリシー

インタラクティブクォータグループは明示的に指定できません。これらはルールに基づいてサービスによって自動的にスケジュールされます。具体的なスケジューリングポリシーは、テナント下のインタラクティブクォータグループの数によって異なります:

  • インタラクティブクォータグループが 1 つしかない場合、テナント下のすべてのクエリ高速化ジョブはこのクォータグループにスケジュールされます。

  • テナントに複数のインタラクティブクォータグループがある場合、自動ルーティングルールがユーザー設定に基づいて 1 つを選択します。詳細については、「クォータルール」をご参照ください。

フォールバックポリシー

  • 使用制限のためにクエリ高速化ジョブが標準クエリジョブにフォールバックする場合、サブスクリプションインスタンスで MCQA ジョブを実行するための専用クォータは、現在のプロジェクトにアタッチされたクォータリソースにフォールバックします。

  • SDK (バージョン 0.40.7 以降) を使用して、フォールバックジョブの実行クォータリソースを指定できます。

    SQLExecutorBuilder builder = SQLExecutorBuilder.builder();
    builder.quotaName("<OfflineQuotaName>");
  • JDBC 接続文字列パラメーター fallbackQuota=XXX を使用して、フォールバックジョブの実行クォータリソースを指定できます。インタラクティブクォータグループをフォールバックジョブの実行クォータとして指定することはできません。指定した場合、エラーが報告されます。

MCQA の接続方法

方法 1:MaxCompute クライアントを使用して MCQA を有効にする

  1. 最新バージョンの MaxCompute クライアント (odpscmd) をダウンロードします。

  2. クライアントをインストールして設定します。詳細については、「MaxCompute クライアントのインストールと設定」をご参照ください。

  3. クライアントのインストールパスの conf ディレクトリにある odps_config.ini ファイルを変更します。設定ファイルに次のコマンドを追加します:

    enable_interactive_mode=true -- MCQA を有効にします
    interactive_auto_rerun=true  -- MCQA ジョブが失敗した場合、自動的に標準ジョブにフォールバックすることを指定します。
  4. クライアントのインストールパスの bin ディレクトリで MaxCompute クライアントを実行します。Linux の場合は ./bin/odpscmd を、Windows の場合は ./bin/odpscmd.bat を実行します。次の情報は、操作が成功したことを示します:客户端运行成功

  5. クエリジョブを実行した後、クライアントインターフェイスの Logview に次の情報が含まれている場合、MCQA が有効になっています:logviiew

方法 2:DataWorks のアドホッククエリまたはデータ開発機能を使用して MCQA を有効にする

DataWorks のアドホッククエリおよび手動トリガーワークフローモジュールでは、MCQA がデフォルトで有効になっています。手動で有効にする必要はありません。

  • [アドホッククエリ] モジュールでクエリジョブを実行します。返された結果に次の情報が含まれている場合、MCQA が有効になっています:临时查询

  • [手動トリガーワークフロー] モジュールでクエリジョブを実行します。返された結果に次の情報が含まれている場合、MCQA が有効になっています:手动业务流程

方法 3:JDBC を使用して MCQA を有効にする

JDBC を使用して MaxCompute に接続する場合、次の操作を実行して MCQA を有効にできます。JDBC を使用して MaxCompute に接続する方法の詳細については、「JDBC の使用」をご参照ください。

  1. MCQA をサポートする JDBC_JAR またはコンパイル可能な ソースコードをダウンロードします。

  2. Maven を使用して Pom 依存関係を構成します。

    <dependency>
      <groupId>com.aliyun.odps</groupId>
      <artifactId>odps-jdbc</artifactId>
      <version>3.3.0</version>
      <classifier>jar-with-dependencies</classifier>
    </dependency>
  3. ソースコードに基づいて Java プログラムを作成し、実際の情報に合わせて調整します。詳細については、「MaxCompute JDBC」をご参照ください。次のコードは例です。

    // Alibaba Cloud アカウントの AccessKey は、すべての API に対して完全な権限を持ち、高いセキュリティリスクをもたらします。RAM ユーザーを作成して使用し、API 呼び出しや O&M を実行することを推奨します。RAM ユーザーを作成するには、RAM コンソールにログインしてください。
    // この例では、AccessKey ID と AccessKey Secret を環境変数に保存する方法を示します。必要に応じて、設定ファイルに保存することもできます。
    // コードに AccessKey ID と AccessKey Secret をハードコーディングしないことを強く推奨します。これはセキュリティリスクにつながる可能性があります。
    private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
    private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
    // your_project_name は、MCQA を有効にしたいプロジェクトの名前です。
    String conn = "jdbc:odps:http://service.<regionid>.maxcompute.aliyun.com/api?project=<YOUR_PROJECT_NAME>"&accessId&accessKey&charset=UTF-8&interactiveMode=true&alwaysFallback=false&autoSelectLimit=1000000000";
    Statement stmt = conn.createStatement();
    Connection conn = DriverManager.getConnection(conn, accessId, accessKey);
    Statement stmt = conn.createStatement();
    String tableName = "testOdpsDriverTable";
    stmt.execute("DROP TABLE IF EXISTS " + tableName);
    stmt.execute("CREATE TABLE " + tableName + " (key int, value string)");

    接続文字列で次のパラメーターを構成して、処理ロジックを調整できます。

    パラメーター

    説明

    enableOdpsLogger

    ログ出力に使用されます。SLF4J が構成されていない場合は、このパラメーターを True に設定することをお勧めします。

    fallbackForUnknownError

    デフォルト値は False です。True に設定すると、不明なエラーが発生した場合にシステムはオフラインモードにフォールバックします。

    fallbackForResourceNotEnough

    デフォルト値は False です。True に設定すると、リソースが不足している場合にシステムはオフラインモードにフォールバックします。

    fallbackForUpgrading

    デフォルト値は False です。True に設定すると、アップグレード中にシステムはオフラインモードにフォールバックします。

    fallbackForRunningTimeout

    デフォルト値は False です。True に設定すると、タイムアウトが発生した場合にシステムはオフラインモードにフォールバックします。

    fallbackForUnsupportedFeature

    デフォルト値は False です。True に設定すると、サポートされていない MCQA シナリオに遭遇した場合にシステムはオフラインモードにフォールバックします。

    alwaysFallback

    デフォルト値は False です。True に設定すると、上記のすべてのシナリオでシステムはオフラインモードにフォールバックします。これは JDBC 3.2.3 以降のバージョンでのみサポートされています。

使用例

  • 例 1:Tableau で MCQA を使用する

    サーバーに interactiveMode=true プロパティを追加して MCQA を有効にします。ログ出力のために enableOdpsLogger=true プロパティも追加することを推奨します。設定の詳細については、「Tableau を使用するための JDBC の設定」をご参照ください。

    次のコードは、完全なサーバー設定の例です。

    http://service.cn-beijing.maxcompute.aliyun.com/api?
    project=****_beijing&interactiveMode=true&enableOdpsLogger=true&autoSelectLimit=1000000000"

    プロジェクト内の一部のテーブルでのみ Tableau 操作を実行する場合は、サーバーパラメーターに table_list=table_name1, table_name2 プロパティを追加して、必要なテーブルを選択できます。テーブル名はカンマ (,) で区切ります。テーブルが多すぎると、Tableau の起動が遅くなる可能性があります。この方法を使用して、必要なテーブルのみをロードすることを強く推奨します。次のコードは例です。多くのパーティションを持つテーブルの場合、すべてのパーティションデータをデータソースとして設定することは推奨しません。必要なパーティションをフィルターするか、カスタム SQL を使用して必要なデータを取得できます。

    http://service.cn-beijing.maxcompute.aliyun.com/api?project=****_beijing
    &interactiveMode=true&alwaysFallback=true&enableOdpsLogger=true&autoSelectLimit=1000000000"
    &table_list=orders,customers
  • 例 2:SQL Workbench/J で MCQA を使用する

    JDBC ドライバーを設定した後、プロファイル設定インターフェイスで JDBC URL を変更して、SQL Workbench/J が MCQA を使用できるようにすることができます。プロファイル設定の詳細については、「SQL Workbench/J を使用するための JDBC の設定」をご参照ください。

    URL は次のフォーマットである必要があります:

    jdbc:odps:<MaxCompute_endpoint>?
    project=<MaxCompute_project_name>&accessId=<AccessKey ID>&accessKey=<AccessKey Secret>
    &charset=UTF-8&interactiveMode=true&autoSelectLimit=1000000000"

    次の表にパラメーターを説明します。

    パラメーター

    説明

    MaxCompute_endpoint

    MaxCompute サービスが配置されているリージョンのエンドポイント。詳細については、「エンドポイント」をご参照ください。

    MaxCompute_project_name

    MaxCompute プロジェクトの名前。

    AccessKey ID

    指定されたプロジェクトへのアクセス権限を持つ AccessKey ID。

    [AccessKey 管理] ページで AccessKey ID を取得できます。

    AccessKey Secret

    AccessKey ID に対応する AccessKey Secret。

    [AccessKey 管理] ページで AccessKey Secret を取得できます。

    charset=UTF-8

    文字セットのエンコード形式。

    interactiveMode

    MCQA 機能のスイッチ。true は MCQA を有効にします。

    autoSelectLimit

    データ量が 1,000,000 行の制限を超える場合に、このパラメーターを設定する必要があります。

方法 4:Java SDK を使用して MCQA を有効にする

Java SDK の詳細については、「Java SDK の概要」をご参照ください。Maven で Pom 依存関係を設定する必要があります。次のコードは設定例です。

<dependency>
  <groupId>com.aliyun.odps</groupId>
  <artifactId>odps-sdk-core</artifactId>
  <version>3.3.0</version>
</dependency>

以下は、Java プログラムを作成するためのコマンド例です。

import com.aliyun.odps.Odps;
import com.aliyun.odps.OdpsException;
import com.aliyun.odps.OdpsType;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;
import com.aliyun.odps.data.Record;
import com.aliyun.odps.data.ResultSet;
import com.aliyun.odps.sqa.*;

import java.io.IOException;
import java.util.*;

public class SQLExecutorExample {

  public static void SimpleExample() {
    // アカウントとプロジェクト情報を設定します。
    // Alibaba Cloud アカウントの AccessKey は、すべての API に対して完全な権限を持ち、高いセキュリティリスクをもたらします。RAM ユーザーを作成して使用し、API 呼び出しや O&M を実行することを推奨します。RAM ユーザーを作成するには、RAM コンソールにログインしてください。
    // この例では、AccessKey ID と AccessKey Secret を環境変数に保存する方法を示します。必要に応じて、設定ファイルに保存することもできます。
    // コードに AccessKey ID と AccessKey Secret をハードコーディングしないことを強く推奨します。これはセキュリティリスクにつながる可能性があります。
    Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    Odps odps = new Odps(account);
    odps.setDefaultProject("<YOUR_PROJECT_NAME>");
    odps.setEndpoint("http://service.<regionid>.maxcompute.aliyun.com/api");

    // SQLExecutor のビルドを準備します。
    SQLExecutorBuilder builder = SQLExecutorBuilder.builder();

    SQLExecutor sqlExecutor = null;
    try {
      // オフラインモードで実行するか、インタラクティブモードで実行します
      if (false) {
        // デフォルトでオフライン SQL 文を実行するエグゼキュータを作成します。
        sqlExecutor = builder.odps(odps).executeMode(ExecuteMode.OFFLINE).build();
      } else {
        // デフォルトで高速化された SQL クエリを実行し、高速化が失敗した場合は自動的にオフラインクエリモードにフォールバックするエグゼキュータを作成します。
        sqlExecutor = builder.odps(odps).executeMode(ExecuteMode.INTERACTIVE).fallbackPolicy(FallbackPolicy.alwaysFallbackPolicy()).build();
      }
      // 必要に応じて、クエリに特別な設定を渡すことができます。
      Map<String, String> queryHint = new HashMap<>();
      queryHint.put("odps.sql.mapper.split.size", "128");
      // クエリジョブを送信します。ヒントがサポートされています。
      sqlExecutor.run("select count(1) from test_table;", queryHint);

      // 次のコードは、情報を取得するための一般的なメソッドをいくつか提供します。
      // UUID
      System.out.println("ExecutorId:" + sqlExecutor.getId());
      // 現在のクエリジョブの Logview。
      System.out.println("Logview:" + sqlExecutor.getLogView());
      // 現在のクエリジョブの Instance オブジェクト。インタラクティブモードでは、複数のクエリジョブが同じインスタンスを共有する場合があります。
      System.out.println("InstanceId:" + sqlExecutor.getInstance().getId());
      // 現在のクエリジョブのステージ進行状況 (コンソールのプログレスバー)。
      System.out.println("QueryStageProgress:" + sqlExecutor.getProgress());
      // 現在のクエリジョブの実行ステータス変更ログ (フォールバック情報など)。
      System.out.println("QueryExecutionLog:" + sqlExecutor.getExecutionLog());

      // 結果を取得するための 2 つのメソッドが提供されています。
      if(false) {
        // すべてのクエリ結果を直接取得します。これは同期メソッドであり、クエリが成功または失敗するまで現在のスレッドを占有する可能性があります。
        // このメソッドはすべての結果データを一度にメモリに読み込むため、大規模なデータセットにはメモリの問題が発生する可能性があるため推奨されません。
        List<Record> records = sqlExecutor.getResult();
        printRecords(records);
      } else {
        // クエリ結果のイテレータ (ResultSet) を取得します。これは同期メソッドであり、クエリが成功または失敗するまで現在のスレッドを占有する可能性があります。
        // このメソッドはクエリ結果をバッチで読み込むため、大規模なデータセットを取得する際に推奨されます。
        ResultSet resultSet = sqlExecutor.getResultSet();
        while (resultSet.hasNext()) {
          printRecord(resultSet.next());
        }
      }

      // 別のクエリを実行します
      sqlExecutor.run("select * from test_table;", new HashMap<>());
      if(false) {
        // すべてのクエリ結果を直接取得します。これは同期メソッドであり、クエリが成功または失敗するまで現在のスレッドを占有する可能性があります。
        // このメソッドはすべての結果データを一度にメモリに読み込むため、大規模なデータセットにはメモリの問題が発生する可能性があるため推奨されません。
        List<Record> records = sqlExecutor.getResult();
                printRecords(records);
            } else {
                // クエリ結果のイテレータ (ResultSet) を取得します。これは同期メソッドであり、クエリが成功または失敗するまで現在のスレッドを占有する可能性があります。
                // このメソッドはクエリ結果をバッチで読み込むため、大規模なデータセットを取得する際に推奨されます。
                ResultSet resultSet = sqlExecutor.getResultSet();
                while (resultSet.hasNext()) {
                    printRecord(resultSet.next());
                }
            }
        } catch (OdpsException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (sqlExecutor != null) {
                // リソースを解放するためにエグゼキュータを閉じます。
                sqlExecutor.close();
            }
        }
    }

    // SQLExecutor はプールモードで再利用できます
    public static void ExampleWithPool() {
        // アカウントとプロジェクト情報を設定します。
      	// Alibaba Cloud アカウントの AccessKey は、すべての API に対して完全な権限を持ち、高いセキュリティリスクをもたらします。RAM ユーザーを作成して使用し、API 呼び出しや O&M を実行することを推奨します。RAM ユーザーを作成するには、RAM コンソールにログインしてください。
		// この例では、AccessKey ID と AccessKey Secret を環境変数に保存する方法を示します。必要に応じて、設定ファイルに保存することもできます。
		// コードに AccessKey ID と AccessKey Secret をハードコーディングしないことを強く推奨します。これはセキュリティリスクにつながる可能性があります。
        Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        Odps odps = new Odps(account);
        odps.setDefaultProject("your_project_name");
        odps.setEndpoint("http://service.<regionid>.maxcompute.aliyun.com/api");

        // 接続プールを使用してクエリを実行します。
        SQLExecutorPool sqlExecutorPool = null;
        SQLExecutor sqlExecutor = null;
        try {
            // 接続プールを準備し、プールサイズとデフォルトの実行モードを設定します。
            SQLExecutorPoolBuilder builder = SQLExecutorPoolBuilder.builder();
            builder.odps(odps)
                    .initPoolSize(1) // プールの初期エグゼキュータ数を設定
                    .maxPoolSize(5)  // プール内の最大エグゼキュータ数を設定
                    .executeMode(ExecuteMode.INTERACTIVE); // インタラクティブモードで実行

            sqlExecutorPool = builder.build();
            // 接続プールからエグゼキュータを取得します。プールが空の場合、最大制限内で新しいエグゼキュータが作成されます。
            sqlExecutor = sqlExecutorPool.getExecutor();

            // エグゼキュータの使用方法は前の例と同じです。
            sqlExecutor.run("select count(1) from test_table;", new HashMap<>());
            System.out.println("InstanceId:" + sqlExecutor.getId());
            System.out.println("Logview:" + sqlExecutor.getLogView());

            List<Record> records = sqlExecutor.getResult();
            printRecords(records);
        } catch (OdpsException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            sqlExecutor.close();
        }
        sqlExecutorPool.close();
    }

    private static void printRecord(Record record) {
        for (int k = 0; k < record.getColumnCount(); k++) {

            if (k != 0) {
                System.out.print("\t");
            }

            if (record.getColumns()[k].getType().equals(OdpsType.STRING)) {
                System.out.print(record.getString(k));
            } else if (record.getColumns()[k].getType().equals(OdpsType.BIGINT)) {
                System.out.print(record.getBigint(k));
            } else {
                System.out.print(record.get(k));
            }
        }
    }

    private static void printRecords(List<Record> records) {
        for (Record record : records) {
            printRecord(record);
            System.out.println();
        }
    }

    public static void main(String args[]) {
        SimpleExample();
        ExampleWithPool();
    }
}

方法 5:PyODPS と SQLAlchemy または他の SQLAlchemy 互換のサードパーティツールを使用してクエリを高速化する

PyODPS は SQLAlchemy と統合されており、SQLAlchemy を使用して MaxCompute データをクエリできます。クエリを高速化するには、接続文字列で次のパラメーターを指定する必要があります:

  • interactive_mode=true:必須。これはクエリ高速化機能のマスターイッチです。

  • reuse_odps=true: オプション。強制的な接続の再利用を有効にします。Apache Superset などの一部のサードパーティツールでは、このオプションを有効にするとパフォーマンスが向上する場合があります。

接続文字列で fallback_policy=<policy1>,<policy2>,... パラメーターを設定して、処理ロジックを詳細に定義できます。JDBC 設定と同様に、これは高速化が失敗した場合のフォールバック動作を制御します。

  • generic:デフォルト値は False です。True に設定すると、不明なエラーが発生した場合にシステムはオフラインモードにフォールバックします。

  • noresource:デフォルト値は False です。True に設定すると、リソースが不足している場合にシステムはオフラインモードにフォールバックします。

  • upgrading:デフォルト値は False です。True に設定すると、アップグレード中にシステムはオフラインモードにフォールバックします。

  • timeout:デフォルト値は False です。True に設定すると、タイムアウトが発生した場合にシステムはオフラインモードにフォールバックします。

  • unsupported:デフォルト値は False です。True に設定すると、サポートされていない MCQA シナリオに遭遇した場合にシステムはオフラインモードにフォールバックします。

  • default: unsupported、upgrading、noresource、timeout を同時に指定するのと同じです。fallback_policy が接続文字列で指定されていない場合、これがデフォルト値です。

  • all:デフォルト値は False です。True に設定すると、上記のすべてのシナリオでシステムはオフラインモードにフォールバックします。

使用例

次の接続文字列は、クエリ高速化を有効にし、強制的な接続の再利用を有効にし、クエリ高速化機能がまだサポートされていない場合、アップグレード中、またはリソースが不足している場合にオフラインモードにフォールバックします。

odps://<access_id>:<ACCESS_KEY>@<project>/?endpoint=<endpoint>&interactive_mode=true&reuse_odps=true&fallback_policy=unsupported,upgrading,noresource

よくある質問

  • 質問 1:JDBC を使用して MaxCompute に接続し、サブスクリプションリソースで SQL タスクを実行すると、「ODPS-1800001」エラーが報告されます。詳細なエラーメッセージは次のとおりです:

    sError:com.aliyun.odps.OdpsException: ODPS-1800001: Session exception - Failed to submit sub-query in session because:Prepaid project run out of free query quota.
    • 考えられる原因:

      クエリ高速化機能は現在パブリックプレビュー中です。サブスクリプションパッケージを購入した場合、パブリックプレビュー期間中は追加の操作なしでクエリ高速化機能を無料で体験できます。無料トライアル中、単一の MaxCompute プロジェクトは最大 5 つの同時ジョブと、1 日あたり累計 500 の高速化ジョブをサポートします。ジョブ数が 500 を超えると、上記のエラーが発生します。

    • 解決策:

      JDBC を設定して MCQA を有効にする際、alwaysFallback パラメーターを true に設定します。このパラメーターを設定すると、ジョブ数が 500 を超えない限り、クエリ高速化に MCQA を使用できます。この制限を超えるジョブはオフラインモードにフォールバックします。設定とパラメーターの詳細については、「MCQA の接続方法」をご参照ください。

  • 質問 2:PyODPS を使用してリクエストを送信し、結果を取得するのに、DataWorks を使用するよりも時間がかかるのはなぜですか?

    • 考えられる原因:

      • wait_for_xxx メソッドが使用され、実行時間が増加しました。

      • ポーリング間隔が長いです。

    • 解決策:

      • リクエスト自体が迅速に実行される場合は、wait_for_xxx メソッドを使用しないでください。リクエストを送信した後、直接 Tunnel を使用して結果をダウンロードします。

      • ポーリング間隔を短縮します:instance.wait_for_success(interval=0.1)。次のコードはコマンド例です。

        from odps import ODPS, errors
        
        max_retry_times = 3
        
        def run_sql(odps, stmt):
            retry = 0
            while retry < max_retry_times:
                try:
                    inst = odps.run_sql_interactive(stmt)
                    print(inst.get_logview_address())
                    inst.wait_for_success(interval=0.1)
                    records = []
                    for each_record in inst.open_reader(tunnel=True):
                        records.append(each_record)
                    return records
                except errors.ODPSError as e:
                    retry = retry + 1
                    print("Error: " + str(e) + " retry: " + str(retry) + "/" + str(max_retry_times))
                    if retry >= max_retry_times:
                        raise e
        
        odps = ODPS(...)
        
        run_sql(odps, 'SELECT 1')
  • 質問 3:Java SDK のエラーをトラブルシューティングするために Logview を使用するにはどうすればよいですか?

    解決策:MaxCompute Java SDK は Logview インターフェイスを提供します。次のコマンドを使用して Logview インターフェイスを呼び出し、ログを取得できます。

    String logview = sqlExecutor.getLogView();
  • 質問 4:JDBC を使用しているときに MaxCompute Logview URL を取得するにはどうすればよいですか?

    解決策:MaxCompute JDBC Driver は MaxCompute Java SDK のカプセル化です。したがって、MaxCompute JDBC Driver を使用して SQL を実行すると、MaxCompute クライアント、MaxCompute Studio、および DataWorks と同様に Logview URL が生成されます。Logview を使用して、タスクの実行ステータスを表示し、タスクの進行状況を追跡し、タスクの実行結果を取得できます。Logview URL は、ログ出力 (properties.log4j) を設定して、デフォルトで標準出力を使用するようにすることで、ターミナル画面に出力できます。