このトピックでは、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 まで)に対するクエリパフォーマンスを最適化し、低レイテンシーで迅速なデータ開発および分析を実現します。 |
|
ビジネスインテリジェンス (BI) | MaxCompute 上のエンタープライズデータウェアハウスにおいて、ETL によってビジネス対応可能な集約データが生成される場合、MCQA の低レイテンシー、弾力的な同時実行性、キャッシュ機能が、パーティショニングおよびバケット化と組み合わさって、同時実行するレポートおよび分析をコスト効率よくサポートします。 |
|
大規模データ探索 | MCQA はクエリの特性を自動的に識別し、小規模なタスクには高速応答を提供し、より大規模なタスクにはリソースをスケーリングして、さまざまな分析ニーズに対応します。 |
|
適用範囲
バージョン要件:
MaxCompute クライアント (odpscmd):v0.40.8 以降。
ODPS-JDBC:v3.3.0 以降。
ODPS-SDK:v0.40.8-public 以降。
データクエリ (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 は
50CU 以上である必要があります。
インタラクティブリソースクォータグループを構成した後、すべてのプロジェクトはアクセラレーション対応ジョブのみをインタラクティブクォータグループに送信できるようになります。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 まで対応可能です。
MaxCompute コンソール にログインし、左上隅でリージョンを選択します。
左側のナビゲーションウィンドウで、 を選択します。
クォータ管理 ページで、対象クォータの 操作 列にある クォータ設定 をクリックします。
クォータ基本構成
クォータ設定 ページで、基本設定 タブを選択し、基本設定の編集 をクリックします。
新しいレベル2クォータ をクリックするか、既存のレベル 2 クォータの基本パラメーターを構成します。
カスタムの クォータ名 を設定し、データ型 として インタラクティブ を選択します。クォータの構成。
クォータスケーリング構成
クォータ設定 ページで、スケーリング設定 タブを選択します。
スケーリング設定 タブで、新しい構成スキーム をクリックするか、既存プランの 操作 列にある 編集 をクリックして更新します。
新しい構成スキーム または 設定シナリオの編集 ダイアログボックスで、インタラクティブ (MaxQA/MCQA) リソースグループの 予約cu数量 [mincu、maxcu] を構成します。
minCU は maxCU と等しくする必要があります。
minCU は
50CU以上である必要があります。インタラクティブリソースが不要な場合は0に設定します。インタラクティブクォータグループは、弾力的な予約 CU をサポートしていません。
OK をクリックして、クォータ構成を保存します。
スケーリング設定 タブで、対象プランの 操作 列にある すぐに有効 をクリックして、すぐに適用します。また、タイムシェアリング管理 を構成する際に、既存のプランを使用することもできます。
タイムプランの構成
タイムプランを使用すると、1 日の異なる時間帯に異なるクォータ構成を適用できます。
スケジューリングポリシー
インタラクティブクォータグループは、サーバーによって自動的にスケジューリングされます。スケジューリングポリシーは、テナント内のインタラクティブクォータグループの数に依存します。
インタラクティブクォータグループが 1 つの場合:テナント内のすべての MCQA ジョブがこのグループにスケジューリングされます。
インタラクティブクォータグループが複数ある場合:自動ルーティングにより、構成に基づいてグループが選択されます。コンピューティングリソースのクォータ使用。
フォールバックポリシー
MCQA ジョブが使用制限により標準クエリモードにフォールバックする場合、サブスクリプションプランでは現在のプロジェクトにバインドされているクォータが使用されます。
v0.40.7 より高い SDK を使用して、フォールバック実行クォータを指定します。
SQLExecutorBuilder builder = SQLExecutorBuilder.builder(); builder.quotaName("<OfflineQuotaName>");JDBC 接続文字列パラメーター
fallbackQuota=XXXを使用して、フォールバック実行クォータを指定します。インタラクティブクォータグループをフォールバック先として指定することはできません。指定するとエラーが発生します。
MCQA アクセス方法
MCQA は、以下のアクセス方法をサポートしています。
方法 1:MaxCompute クライアント経由で MCQA を有効化
最新の MaxCompute クライアント (odpscmd) をダウンロードします。
クライアントをインストールおよび構成します。odpscmd のインストールおよび構成。
クライアントのインストールパスの
confディレクトリにある設定ファイルodps_config.iniを編集し、次の設定を追加します。enable_interactive_mode=true -- MCQA を有効化 interactive_auto_rerun=true -- MCQA 失敗時に標準モードに自動フォールバック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!クエリを実行した後、返された結果の 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 リファレンス。
Maven を使用して POM 依存関係を構成します。
<dependency> <groupId>com.aliyun.odps</groupId> <artifactId>odps-jdbc</artifactId> <version>3.3.0</version> <classifier>jar-with-dependencies</classifier> </dependency>ソースコードに基づいて 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 でサポートされていないシナリオ時にオフラインモードにフォールバックします。default:fallback_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 に出力されます。