本文介紹MaxCompute查詢加速MCQA(MaxCompute Query Acceleration)功能的系統架構、關鍵特性和應用情境。
MaxCompute計劃於北京時間2025年11月24日(星期一)、北京時間2025年11月27日(星期四)分別在中國站和國際站上線查詢加速MaxQA(MaxCompute Query Accelerator 2.0),屆時該文檔查詢加速MCQA功能將不再對新客戶開放。
功能介紹
MaxCompute MCQA功能提供如下能力。
支援中、小資料量查詢作業的加速最佳化,將執行時間為分鐘級的查詢作業縮減至秒級,同時完全相容原MaxCompute的查詢功能。
支援主流BI工具,開展即席查詢(Ad Hoc)或商業智慧(BI)分析。
支援使用獨立的資源集區,不佔用離線計算資源,可以自動識別查詢作業,緩解排隊壓力,最佳化使用體驗。
支援將MCQA(MaxCompute Query Acceleration)查詢作業的運行結果寫入臨時緩衝中。當使用者後續執行相同的查詢作業時,MaxCompute會優先返回緩衝中的結果,加快執行速度。
查詢流程
下圖展示MaxCompute的查詢處理架構,所有查詢在接入後會被智能路由到不同的計算路徑:查詢加速(MCQA)、普通SQL執行或多引擎計算。
上圖中MCQA(MaxCompute Query Acceleration)將查詢作業的運行結果寫入臨時緩衝中。當後續執行相同的查詢作業時,MaxCompute會優先返回緩衝中的結果,加快執行速度。對緩衝機制的詳細介紹請參考緩衝機制。
應用情境
情境 | 說明 | 情境特點 |
即席查詢(Ad Hoc) | 可以通過MCQA最佳化中小規模資料集(百GB規模內)的查詢效能,直接對MaxCompute表開展低時延的查詢操作,以便快速完成資料開發及資料分析。 |
|
商業智慧(BI) | 利用MaxCompute搭建企業級資料倉儲時,ETL會將資料加工處理為面向業務可消費的彙總資料。藉助MCQA的低延時、彈性並發、資料緩衝等特性,結合MaxCompute表分區、分桶等最佳化設計,可以低成本滿足多並發、快速響應的報告產生、統計分析及固定報表分析需求。 |
|
海量資料明細查詢分析 | MCQA可以自動識別查詢作業特徵,既能快速響應,處理小規模作業,同時還可以自動匹配大規模作業資源需求,滿足分析人員分析不同規模和複雜度的查詢作業的需求。 |
|
適用範圍
版本要求:
MaxCompute用戶端(odpscmd)要求v0.40.8及以上版本。
ODPS-JDBC要求v3.3.0及以上版本。
ODPS-SDK要求v0.40.8-public及以上版本。
僅支援資料查詢(SELECT開頭)語句。如果提交了MCQA不支援的語句,MaxCompute用戶端、JDBC和SDK可通過配置回退到普通離線模式執行,其他工具暫不支援回退到普通離線模式執行。查詢作業回退為普通SQL作業後,按原SQL作業計費模式計費。
資料行數限制:預設最大查詢100W行資料,可通過在SQL語句中增加Limit關鍵字突破此限制。
功能使用限制:
限制項
說明
功能
支援標準版、隨用隨付的MaxCompute服務。
支援訂用帳戶計費模式。
不支援開發人員版的MaxCompute服務,需要升級為標準版。
查詢
單次執行的作業支援並發的Worker數上限為2000個。
通過用戶端提交的MCQA作業預設30s逾時,通過DataWorks臨時查詢提交的MCQA作業預設20s逾時,逾時後MCQA作業將預設回退為普通查詢作業。
僅儲存格式為ALIORC的表的資料才可能被緩衝至記憶體中加速。
查詢並發
訂用帳戶模式。
免費版(未劃分MCQA互動式資源群組)。
每天每個專案並發限制5個,每天每個專案最多運行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最大配額值需一致,否則不生效。
互動式資源類型需要滿足以下要求,否則不能提交。
預留CU量[minCU]=預留CU量[maxCU]。預留CU量需大於等於
50CU。
配置了互動式資源配額組後,所有Project僅支援可識別為加速的作業提交到互動式資源配額組,且查詢加速功能不再享有免費體驗。
互動式資源類型的配額組不支援作為Project的預設Quota使用,使用查詢加速功能時互動式配額組無需綁定Project即對所有Project生效。
隨用隨付模式。
單個MaxCompute專案的MCQA作業最大並發數為120,超過部分會回退到普通作業模式運行。
緩衝機制
對於每個MCQA查詢作業,MaxCompute都會在內部建立臨時資料集來緩衝查詢結果,臨時資料集的緩衝大小限制為10 GB。
臨時資料集的所有者即當前執行查詢作業產生緩衝結果的使用者;
該臨時資料集對使用者不可見,不支援查看臨時資料集內容;
MaxCompute會自動為執行查詢作業的使用者授予對臨時資料集的存取權限。
如果希望從緩衝的查詢結果中檢索資料,執行的查詢作業以及查詢的上下文配置必須與原始查詢作業完全相同。當運行重複的查詢作業時,MaxCompute會重複使用緩衝結果。
緩衝計費規則
緩衝的查詢結果不會產生任何儲存及計算費用,可以有效降低資源使用費用。
刪除緩衝結果
出現如下情況時,MaxCompute會刪除緩衝結果:
MaxCompute專案的資源使用率較高時,MaxCompute會提前刪除緩衝結果。
緩衝結果所引用的表或視圖變更後,緩衝結果立即失效,MaxCompute會刪除失效的緩衝結果,此時再次執行相同的查詢作業,不會檢索到快取資料。
緩衝結果已到期。
緩衝驗證
使用Logview 2.0可以擷取查詢作業的Logview資訊。如下圖所示,在Job Details頁簽,可以看到查詢作業運行結果已寫入緩衝中:

訂用帳戶規格開通MCQA
操作步驟
使用查詢加速功能加速訂用帳戶MaxCompute執行個體的專案步驟如下。
訂用帳戶MCQA Quota決定了查詢時的掃描並發度,進而影響掃描目標表的資料量,大概比例是1 CU可以掃描0.6 GB資料。例如購買50 CU的MCQA Quota,正常同時掃描資料量在30 GB左右,目前MCQA最大掃描數量可以支援掃描300 GB。
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列,選擇 。
在Quota管理頁面,單擊目標Quota對應操作列的Quota配置。
Quota基礎配置
在Quota配置頁面,選擇基础配置頁簽,單擊编辑基础配置。
單擊新增二级Quota或為現有的二級Quota配置基礎參數。
Quota名称自訂輸入,类型選擇交互式。詳細參數參考配置Quota。
Quota伸縮配置
在Quota配置頁面,選擇伸缩配置頁簽。
在伸缩配置頁簽,單擊新增配置方案或單擊已有的配置方案對應的操作列的编辑,更新配置方案。
在新增配置方案或编辑配置方案對話方塊的MCQA資源群組上配置预留CU量[minCU,maxCU]。
最小CU數(minCU)需要等於最大CU數(maxCU)。
最小CU數要大於等於
50CU。如果不需要互動式資源,設定為0。互動式類型的Quota不支援彈性預留CU。
單擊確定,完成Quota配置錄入。
在伸缩配置頁簽,單擊目標配置方案對應的操作列的立即生效,可使該配置方案立即生效。也可在分时管理配置時使用已有方案。
配置時間計劃。
配置時間計劃設定每日不同時間點啟用不同的Quota計劃,以此實現對Quota配置的分時邏輯。
調度策略
互動式配額組不支援顯式指定,由服務端根據規則自動進行調度,具體調度策略取決於租戶下的互動式配額組數量:
只有一個互動式配額組,則租戶下的所有查詢加速作業都會調度到這個配額組上。
如果租戶開通了多個互動式配額組,自動路由規則根據使用者配置進行選擇,詳情請參見Quota規則。
回退策略
如果因使用限制發生查詢加速作業回退為普通查詢作業,訂用帳戶規格下專用於跑MCQA的配額回退為當前Project綁定的配額資源(Quota)。
可通過SDK(版本高於0.40.7)指定回退作業的執行配額資源(Quota)。
SQLExecutorBuilder builder = SQLExecutorBuilder.builder(); builder.quotaName("<OfflineQuotaName>");通過JDBC串連串參數
fallbackQuota=XXX指定回退作業的執行配額資源(Quota)。不允許指定回退作業運行配額為互動式配額組,否則會報錯。
MCQA渠道接入說明
MCQA功能支援的接入方式如下:
方式一:基於MaxCompute用戶端啟用MCQA功能
下載最新版MaxCompute用戶端(odpscmd)。
安裝並配置用戶端,詳情請參見安裝並配置MaxCompute用戶端。
修改用戶端安裝目錄conf下的設定檔odps_config.ini,在設定檔增加如下命令:
enable_interactive_mode=true -- 開啟MCQA interactive_auto_rerun=true -- 代表MCQA失敗後自動回退到普通作業執行運行用戶端安裝目錄bin下的MaxCompute用戶端(Linux系統下運行./bin/odpscmd,Windows下運行./bin/odpscmd.bat)。出現如下資訊,表示運行成功。

執行查詢作業後,用戶端介面返回結果中的Logview如果包含如下資訊表明MCQA功能已開啟。

方式二:基於DataWorks臨時查詢或資料開發啟用MCQA功能
DataWorks的臨時查詢及手動商務程序模組預設開啟MCQA功能,無需手動開啟。
方式三:基於JDBC啟用MCQA功能
使用JDBC串連MaxCompute,可以通過執行如下操作開啟MCQA功能。使用JDBC串連MaxCompute的操作詳情請參見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,樣本如下。
// 阿里雲帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM使用者進行API訪問或日常營運,請登入RAM控制台建立RAM使用者 // 此處以把AccessKey 和 AccessKeySecret 儲存在環境變數為例說明。您也可以根據業務需要,儲存到設定檔裡 // 強烈建議不要把 AccessKey 和 AccessKeySecret 儲存到代碼裡,會存在密鑰泄漏風險 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屬性,用於列印日誌。配置操作詳情請參見配置JDBC使用Tableau。完整的伺服器配置樣本如下。
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:SQLWorkBench使用MCQA。
完成JDBC驅動配置後,在Profile配置介面修改已填寫的JDBC URL,支援SQLWorkbench使用MCQA功能。Profile配置操作詳情請參見配置JDBC使用SQL Workbench/J。
需要配置的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服務所在地區的Endpoint,詳情請參見Endpoint。
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
資料量超過100萬限制時,需要配置此參數。
方式四:基於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() {
// 設定帳號和專案資訊。
// 阿里雲帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM使用者進行API訪問或日常營運,請登入RAM控制台建立RAM使用者
// 此處以把AccessKey 和 AccessKeySecret 儲存在環境變數為例說明。您也可以根據業務需要,儲存到設定檔裡
// 強烈建議不要把 AccessKey 和 AccessKeySecret 儲存到代碼裡,會存在密鑰泄漏風險
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 {
// run in offline mode or run in interactive mode
if (false) {
// 建立一個預設執行離線SQL的Executor。
sqlExecutor = builder.odps(odps).executeMode(ExecuteMode.OFFLINE).build();
} else {
// 建立一個預設執行查詢加速SQL的Executor,並且在查詢加速模式失敗後,自動回退到離線查詢。
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");
// 提交一個查詢作業,支援傳入Hint。
sqlExecutor.run("select count(1) from test_table;", queryHint);
// 列舉一些支援的常用擷取資訊的介面。
// UUID
System.out.println("ExecutorId:" + sqlExecutor.getId());
// 當前查詢作業的logview。
System.out.println("Logview:" + sqlExecutor.getLogView());
// 當前查詢作業的Instance對象(Interactive模式多個查詢作業可能為同一個Instance)。
System.out.println("InstanceId:" + sqlExecutor.getInstance().getId());
// 當前查詢作業的階段進度(Console的進度條)。
System.out.println("QueryStageProgress:" + sqlExecutor.getProgress());
// 當前查詢作業的執行狀態變化日誌,例如回退資訊。
System.out.println("QueryExecutionLog:" + sqlExecutor.getExecutionLog());
// 提供兩種擷取結果的介面。
if(false) {
// 直接擷取全部查詢作業結果,同步介面,可能會佔用本線程直到查詢成功或失敗。
// 一次性讀取全部結果資料到記憶體中,當資料量較大時不建議使用,可能會有記憶體問題。
List<Record> records = sqlExecutor.getResult();
printRecords(records);
} else {
// 擷取查詢結果的迭代器ResultSet,同步介面,可能會佔用本線程直到查詢成功或失敗。
// 擷取大量結果資料時推薦使用,分次讀取查詢結果。
ResultSet resultSet = sqlExecutor.getResultSet();
while (resultSet.hasNext()) {
printRecord(resultSet.next());
}
}
// run another query
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) {
// 關閉Executor釋放相關資源。
sqlExecutor.close();
}
}
}
// SQLExecutor can be reused by pool mode
public static void ExampleWithPool() {
// 設定帳號和專案資訊。
// 阿里雲帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM使用者進行API訪問或日常營運,請登入RAM控制台建立RAM使用者
// 此處以把AccessKey 和 AccessKeySecret 儲存在環境變數為例說明。您也可以根據業務需要,儲存到設定檔裡
// 強烈建議不要把 AccessKey 和 AccessKeySecret 儲存到代碼裡,會存在密鑰泄漏風險
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) // init pool executor number
.maxPoolSize(5) // max executors in pool
.executeMode(ExecuteMode.INTERACTIVE); // run in interactive mode
sqlExecutorPool = builder.build();
// 從串連池中擷取一個Executor,如果不夠將會在Max限制內新增Executor。
sqlExecutor = sqlExecutorPool.getExecutor();
// Executor具體用法和上一樣本一致。
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();
}
}方式五:基於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常見問題
問題一:使用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,日免費加速作業數累計為500個。如果作業數超過500個時,會出現上述報錯。
解決方案:
需要在配置JDBC啟用MCQA功能的配置過程中,設定alwaysFallback參數值為true,設定完成後,沒有超過500個作業數時,能正常使用MCQA進行查詢加速,超過500個的作業會退回至離線模式。配置的詳細操作及參數解釋請參見MCQA渠道接入說明。
問題二:基於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')
問題三:基於SDK如何使用Logview排查Java SDK報錯?
解決方案:MaxCompute Java SDK提供了Logview介面,請使用如下命令調用Logview介面擷取日誌。
String logview = sqlExecutor.getLogView();問題四:基於JDBC如何擷取MaxCompute Logview URL?
解決方案:MaxCompute JDBC Driver是基於MaxCompute Java SDK的封裝。因此使用時和MaxCompute用戶端、MaxCompute Studio以及DataWorks一樣,通過MaxCompute JDBC Driver執行SQL時,會產生Logview URL。您可以通過Logview查看任務執行狀態、追蹤任務進度、擷取任務執行結果。Logview URL可以通過配置日誌輸出(properties.log4j),預設以標準輸出列印到終端螢幕。

