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

MaxCompute:クエリアクセラレーション (MCQA)

最終更新日:Jun 13, 2026

このトピックでは、MaxCompute クエリアクセラレーション (MCQA) のシステムアーキテクチャー、主な機能、ユースケースについて説明します。

重要

MCQA(クエリアクセラレーション 1.0)は MaxQA にアップグレードされ、新規のお客様への提供は終了しています。

MaxCompute は、中国サイトおよび国際サイトでそれぞれ 2025 年 11 月 24 日(月曜日)および 2025 年 11 月 27 日(木曜日)(UTC + 08:00)に MaxQA(MaxCompute クエリアクセラレーター 2.0)をリリースしました。

クエリアクセラレーションをご利用になる場合は、「MaxQA の概要」および「クエリアクセラレーション MaxQA」をご参照ください。以下の内容は、既存の MCQA ユーザー向けの参考情報です。

概要

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

  • 小規模~中規模データセットに対するクエリを高速化し、実行時間を数分から数秒に短縮します。既存の MaxCompute クエリ機能と完全互換です。

  • アドホッククエリや BI 分析のために、主要な BI ツールをサポートします。

  • オフラインコンピューティングリソースを消費しない独立したリソースプールを使用します。クエリタスクを自動的に識別して、キューイングの負荷を軽減します。

  • MCQA クエリの結果を一時キャッシュに保存します。同じクエリが再度実行された場合、MaxCompute はキャッシュされた結果を返して高速に処理します。

クエリフロー

次の図は、MaxCompute クエリ処理アーキテクチャーを示しています。クエリを受信すると、スマートルーティングにより、クエリアクセラレーション (MCQA)、標準 SQL 実行、マルチエンジンコンピューティングのいずれかのパスにルーティングされます。

このアーキテクチャーにおいて、MCQA はクエリ結果を 一時キャッシュ に書き込みます。同じクエリが再度実行された場合、MaxCompute はキャッシュされた結果を返して高速に処理します。キャッシュメカニズム

ユースケース

シナリオ

説明

特徴

アドホッククエリ

小規模~中規模データセット(数百 GB まで)に対するクエリパフォーマンスを最適化し、低レイテンシーで迅速なデータ開発および分析を実現します。

  • 柔軟なクエリ条件で高速な結果取得と反復的なロジック調整が可能。

  • レイテンシー要件:数十秒以内。

  • 典型的なユーザー:SQL スキルを持つデータ開発者またはアナリストで、使い慣れたクライアントツールを使用。

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

MaxCompute 上のエンタープライズデータウェアハウスにおいて、ETL によってビジネス対応可能な集約データが生成される場合、MCQA の低レイテンシー、弾力的な同時実行性、キャッシュ機能が、パーティショニングおよびバケット化と組み合わさって、同時実行するレポートおよび分析をコスト効率よくサポートします。

  • クエリ対象は通常、事前に集約された結果データ。

  • 小規模データ、多次元クエリ、固定クエリ、高頻度クエリに適している。

  • 秒レベルの応答が必要です。ほとんどのクエリは 5 秒以内に完了しますが、データ量や複雑さによって時間が異なる場合があります。

大規模データ探索

MCQA はクエリの特性を自動的に識別し、小規模なタスクには高速応答を提供し、より大規模なタスクにはリソースをスケーリングして、さまざまな分析ニーズに対応します。

  • 大規模な既存データセットに対して必要な有効データ量は小さく、中程度のレイテンシー要件。

  • 典型的なユーザー:詳細データを探索してパターン、機会を発見し、仮説を検証するビジネスアナリスト。

適用範囲

  • バージョン要件:

  • データクエリ (SELECT) 文のみサポートされています。サポートされていない文を送信した場合、MaxCompute クライアント、JDBC、SDK は標準のオフラインモードにフォールバックできます。その他のツールはフォールバックをサポートしていません。クエリが標準 SQL にフォールバックされた場合、元の SQL 課金モデルに基づいて課金されます。

  • 行数制限:デフォルトの最大値は 1,000,000 行です。この制限を超えるには、SQL 文に LIMIT キーワードを追加してください。

  • 機能制限

    制限

    説明

    機能

    • サポート対象:Standard Edition および従量課金の MaxCompute。

    • サポート対象:サブスクリプション課金。

    • 非サポート:Developer Edition。Standard Edition へのアップグレードが必要です。

    クエリ

    • 1 ジョブあたり最大 2,000 の同時ワーカー。

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

    • ALIORC ストレージフォーマットのテーブルのみ、メモリ内キャッシュによる高速化が可能です。

    クエリ同時実行数

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

      • 無料枠(MCQA インタラクティブリソースグループが割り当てられていない場合):

        プロジェクトあたり 1 日の最大同時ジョブ数は 5、プロジェクトあたり 1 日の合計ジョブ数は 500 まで。上限を超えたジョブは自動的に標準モードにフォールバックされます。フォールバックが無効の場合、次のエラーが返されます:

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

        • プロジェクトあたり最大 120 の同時 MCQA ジョブ。上限を超えたジョブは標準モードにフォールバックされます。

        • インタラクティブリソースクォータグループの予約 CU 最小値は、予約 CU 最大値と等しくする必要があります。そうでない場合、設定は有効になりません。

        • インタラクティブリソースタイプ要件(要件を満たさない場合、ジョブは拒否されます):

          • Reserved CU [minCU]=Reserved CU [maxCU]

          • 予約 CU は 50 CU 以上である必要があります。

        • インタラクティブリソースクォータグループを構成した後、すべてのプロジェクトはアクセラレーション対応ジョブのみをインタラクティブクォータグループに送信できるようになります。MCQA の無料トライアルは利用できなくなります。

        • インタラクティブリソースクォータグループは、プロジェクトのデフォルトクォータとして機能できません。MCQA を使用する場合、明示的なバインドがなくても、インタラクティブクォータグループがすべてのプロジェクトに適用されます。

    • 従量課金モード:

      MaxCompute プロジェクトあたり最大 120 の同時 MCQA ジョブ。上限を超えたジョブは標準モードにフォールバックされます。

キャッシュメカニズム

各 MCQA クエリに対して、MaxCompute は結果をキャッシュするために一時データセットを作成します。一時データセットあたりのキャッシュサイズ上限は 10 GB です。

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

  • 一時データセットはユーザーからは非表示であり、閲覧できません。

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

  • キャッシュ結果を取得するには、クエリおよびコンテキスト構成が元のクエリと同一である必要があります。MaxCompute は重複クエリに対してキャッシュ結果を再利用します。

キャッシュ課金

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

キャッシュエビクション

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

  • プロジェクトのリソース使用率が高い場合 — MaxCompute はキャッシュ結果を早期にエビクションすることがあります。

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

  • キャッシュ結果の有効期限が切れた場合。

キャッシュ検証

Logview 2.0 は、クエリジョブの Logview 情報を提供します。ジョブの詳細 タブで、クエリ結果がキャッシュに書き込まれたことを確認できます。

進行状況チャート ビューで、RESULTCACHE ノードに R/W が 0/0 行と表示されている場合、結果がキャッシュから取得されたことを示します。

サブスクリプションプランでの MCQA 有効化

操作手順

サブスクリプションの MaxCompute インスタンスで MCQA を有効にするには、次の手順に従います。

説明

サブスクリプション MCQA クォータはスキャン同時実行数を決定し、スキャンされるデータ量に影響します。おおよそ 1 CU で 0.6 GB をスキャンできます。たとえば、50 CU では同時に約 30 GB をスキャンでき、最大で 300 GB まで対応可能です。

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

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

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

  4. クォータ基本構成

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

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

      カスタムの クォータ名 を設定し、データ型 として インタラクティブ を選択します。クォータの構成

  5. クォータスケーリング構成

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

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

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

      • minCU は maxCU と等しくする必要があります。

      • minCU は 50CU 以上である必要があります。インタラクティブリソースが不要な場合は 0 に設定します。

      • インタラクティブクォータグループは、弾力的な予約 CU をサポートしていません。

    4. OK をクリックして、クォータ構成を保存します。

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

  6. タイムプランの構成

    タイムプランを使用すると、1 日の異なる時間帯に異なるクォータ構成を適用できます。

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

インタラクティブクォータグループは、サーバーによって自動的にスケジューリングされます。スケジューリングポリシーは、テナント内のインタラクティブクォータグループの数に依存します。

  • インタラクティブクォータグループが 1 つの場合:テナント内のすべての MCQA ジョブがこのグループにスケジューリングされます。

  • インタラクティブクォータグループが複数ある場合:自動ルーティングにより、構成に基づいてグループが選択されます。コンピューティングリソースのクォータ使用

フォールバックポリシー

  • MCQA ジョブが使用制限により標準クエリモードにフォールバックする場合、サブスクリプションプランでは現在のプロジェクトにバインドされているクォータが使用されます。

  • v0.40.7 より高い SDK を使用して、フォールバック実行クォータを指定します。

    SQLExecutorBuilder builder = SQLExecutorBuilder.builder();
    builder.quotaName("<OfflineQuotaName>");
  • JDBC 接続文字列パラメーター fallbackQuota=XXX を使用して、フォールバック実行クォータを指定します。インタラクティブクォータグループをフォールバック先として指定することはできません。指定するとエラーが発生します。

MCQA アクセス方法

方法 1:MaxCompute クライアント経由で MCQA を有効化

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

  2. クライアントをインストールおよび構成します。odpscmd のインストールおよび構成

  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)。正常に接続されると、次のように出力されます。

    Aliyun ODPS Command Line Tool
    Version 0.35.1-public
    Connecting to http://service.cn-hangzhou.maxcompute.aliyun.com/api, project: 
    Project timezone: Asia/Shanghai
    Connected!
  5. クエリを実行した後、返された結果の Logview に MCQA 関連情報が含まれている場合、この機能は有効になっています。LogView の サマリー タブで、Job run mode: session job 2.0 と表示されている場合、MCQA(インタラクティブ)モードがアクティブです。

方法 2:DataWorks アドホッククエリまたはデータ開発経由で MCQA を有効化

DataWorks アドホッククエリおよびマニュアルワークフローモジュールでは、MCQA がデフォルトで有効になっています。

  • [アドホッククエリ] でクエリを実行します。MCQA がアクティブな場合、実行ログに Congratulations! Your task was selected to run in MaxCompute query acceleration mode および MaxCompute query acceleration mode ran SQL successfully と表示されます。

  • [マニュアルワークフロー] でクエリを実行します。実行ログに Congratulations! Your task was selected to run in MaxCompute query acceleration mode および MaxCompute query acceleration mode ran SQL successfully と表示されます。

方法 3:JDBC 経由で MCQA を有効化

JDBC 経由で MaxCompute に接続し、MCQA を有効にします。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 オペレーションにアクセス可能で、高いセキュリティリスクがあります。
    // API アクセスまたは日常的な運用管理 (O&M) には、RAM ユーザーを作成して使用することを強く推奨します。RAM コンソールにログインして RAM ユーザーを作成してください。
    // この例では、環境変数に保存された AccessKey および AccessKeySecret を使用しています。
    // ビジネス要件に基づいて、設定ファイルに保存することもできます。
    // コード内に AccessKey および AccessKeySecret を保存しないでください。AccessKey ペアが漏洩する可能性があります。
    
    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。MCQA でサポートされていないシナリオ時にオフラインモードにフォールバックするには True に設定します。

    alwaysFallback

    デフォルト:False。上記すべてのシナリオでオフラインモードにフォールバックするには True に設定します。JDBC 3.2.3 以降が必要です。

使用例

  • 例 1:Tableau で MCQA を使用

    サーバー URL に interactiveMode=true を追加して MCQA を有効にします。また、ログを有効にするには enableOdpsLogger=true を追加します。Tableau での MaxCompute JDBC の構成

    サーバー構成の完全な例:

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

    Tableau を特定のテーブルに限定するには、サーバー URL に 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:SQLWorkbench で MCQA を使用

    JDBC ドライバーを構成した後、プロファイル設定で JDBC URL を変更します。SQL Workbench/J での MaxCompute 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 Secret

    AccessKey ID の AccessKey Secret。

    AccessKey 管理ページから取得します。

    charset=UTF-8

    文字エンコード形式。

    interactiveMode

    MCQA の切り替え。MCQA を有効にするには true に設定します。

    autoSelectLimit

    データが 1,000,000 行の制限を超える場合に必要です。

方法 4:Java SDK 経由で MCQA を有効化

Java SDK の概要。Maven を使用して POM 依存関係を構成します。

<dependency>
          
  <groupId>com.aliyun.odps</groupId>
  <artifactId>odps-sdk-core</artifactId>
  <version>3.3.0</version>
</dependency>
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 オペレーションにアクセス可能で、高いセキュリティリスクがあります。
    // API アクセスまたは日常的な運用管理 (O&M) には、RAM ユーザーを作成して使用することを強く推奨します。RAM コンソールにログインして RAM ユーザーを作成してください。
    // この例では、環境変数に保存された AccessKey および AccessKeySecret を使用しています。ビジネス要件に基づいて、設定ファイルに保存することもできます。
    // コード内に AccessKey および AccessKeySecret を保存しないでください。AccessKey ペアが漏洩する可能性があります。
    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());
      // 現在のクエリジョブのインスタンスオブジェクト(インタラクティブモードでは、複数のクエリジョブが同じインスタンスを共有する場合があります)。
      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 オペレーションにアクセス可能で、高いセキュリティリスクがあります。
        // API アクセスまたは日常的な運用管理 (O&M) には、RAM ユーザーを作成して使用することを強く推奨します。RAM コンソールにログインして RAM ユーザーを作成してください。
        // この例では、環境変数に保存された AccessKey および AccessKeySecret を使用しています。ビジネス要件に基づいて、設定ファイルに保存することもできます。
        // コード内に AccessKey および AccessKeySecret を保存しないでください。AccessKey ペアが漏洩する可能性があります。
        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 互換ツール経由で MCQA を有効化

PyODPS は SQLAlchemy を統合して MaxCompute データをクエリします。MCQA を有効にするには、接続文字列で次のパラメーターを指定します。

  • interactive_mode=true:必須。MCQA のマスタースイッチ。

  • reuse_odps=true:任意。接続の再利用を強制します。一部のサードパーティ製ツール(例:Apache Superset)でパフォーマンスを向上させます。

接続文字列で fallback_policy=<policy1>,<policy2>,... を構成して、フォールバック動作を制御します。JDBC パラメーターと同様です。

  • generic:デフォルト:False。不明なエラー時にオフラインモードにフォールバックします。

  • noresource:デフォルト:False。リソース不足時にオフラインモードにフォールバックします。

  • upgrading:デフォルト:False。アップグレード中にオフラインモードにフォールバックします。

  • timeout:デフォルト:False。実行タイムアウト時にオフラインモードにフォールバックします。

  • unsupported:デフォルト:False。MCQA でサポートされていないシナリオ時にオフラインモードにフォールバックします。

  • defaultfallback_policy が指定されていない場合のデフォルトで、unsupported、upgrading、noresource、timeout を指定することと同等です。

  • all:デフォルト:False。上記すべてのシナリオでオフラインモードにフォールバックします。

使用例

MCQA 有効化、強制接続再利用、unsupported/upgrading/noresource シナリオでのフォールバックを有効にした接続文字列:

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

よくある質問

  • Q1: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.
    • 考えられる原因:

      MCQA パブリックプレビュー期間中、サブスクリプションプランのユーザーは MCQA を無料で試用できます。無料トライアルでは、プロジェクトあたり最大 5 の同時 MCQA ジョブ、およびプロジェクトあたり 1 日あたり最大 500 の無料アクセラレーションジョブが許可されています。500 ジョブを超えると、このエラーがトリガーされます。

    • 解決策:

      JDBC MCQA 構成で alwaysFallback=true を設定します。500 件の制限内のジョブは MCQA を使用し、超過したジョブはオフラインモードにフォールバックします。MCQA アクセス方法

  • Q2: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')
  • Q3:Java SDK エラーのトラブルシューティングに Logview を使用するにはどうすればよいですか?

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

    String logview = sqlExecutor.getLogView();
  • Q4:JDBC 経由で MaxCompute Logview URL を取得するにはどうすればよいですか?

    解決策:MaxCompute JDBC ドライバーは MaxCompute Java SDK 上に構築されています。JDBC 経由で SQL を実行する際、タスクのステータスおよび進行状況を追跡するための Logview URL が生成されます。ログ出力を構成(properties.log4j)して URL をキャプチャします。デフォルトでは stdout に出力されます。