All Products
Search
Document Center

MaxCompute:Percepatan Kueri (MCQA)

Last Updated:Jun 13, 2026

Topik ini menjelaskan arsitektur sistem, fitur utama, dan skenario penggunaan MaxCompute Query Acceleration (MCQA).

Penting

MCQA (Query Acceleration 1.0) telah ditingkatkan menjadi MaxQA dan tidak lagi terbuka untuk pelanggan baru.

MaxCompute meluncurkan MaxQA (MaxCompute Query Accelerator 2.0) di situs China dan situs Internasional masing-masing pada 24 November 2025 (Senin) dan 27 November 2025 (Kamis) (UTC+8).

Untuk menggunakan percepatan kueri, lihat Ikhtisar MaxQA dan Percepatan Kueri MaxQA. Konten berikut hanya sebagai referensi bagi pengguna MCQA yang sudah ada.

Pendahuluan

MaxCompute MCQA menyediakan kemampuan berikut:

  • Mempercepat kueri pada dataset kecil hingga menengah, mengurangi waktu eksekusi dari hitungan menit menjadi detik. Sepenuhnya kompatibel dengan fitur kueri MaxCompute yang sudah ada.

  • Mendukung alat BI utama untuk kueri ad hoc dan analisis BI.

  • Menggunakan kolam sumber daya independen tanpa mengonsumsi sumber daya komputasi offline. Secara otomatis mengidentifikasi pekerjaan kueri untuk mengurangi tekanan antrean.

  • Menyimpan hasil kueri MCQA dalam cache temporary. Ketika kueri yang sama dijalankan kembali, MaxCompute mengembalikan hasil dari cache untuk eksekusi yang lebih cepat.

Alur kueri

Gambar berikut menunjukkan arsitektur pemrosesan kueri MaxCompute. Setelah kueri diterima, perutean pintar mengarahkannya ke salah satu dari tiga jalur: Percepatan Kueri (MCQA), eksekusi SQL standar, atau komputasi multi-engine.

Dalam arsitektur ini, MCQA menulis hasil kueri ke temporary cache. Ketika kueri yang sama dijalankan kembali, MaxCompute mengembalikan hasil dari cache untuk eksekusi yang lebih cepat. Mekanisme caching.

Skenario penggunaan

Skenario

Deskripsi

Karakteristik

Ad hoc queries

Mengoptimalkan performa kueri pada dataset kecil hingga menengah (hingga ratusan GB) dengan latensi rendah untuk pengembangan dan analisis data yang cepat.

  • Kondisi kueri fleksibel dengan hasil cepat dan penyesuaian logika iteratif.

  • Persyaratan latensi: dalam hitungan puluhan detik.

  • Pengguna tipikal: developer data atau analis yang memiliki kemampuan SQL dan menggunakan alat client yang sudah dikenal.

Business Intelligence (BI)

Untuk gudang data enterprise di MaxCompute tempat ETL menghasilkan agregasi siap bisnis. Latensi rendah, konkurensi elastis, dan caching MCQA, dikombinasikan dengan partisi dan bucketing, mendukung pelaporan dan analitik konkuren secara hemat biaya.

  • Target kueri biasanya berupa data hasil agregasi yang telah diproses sebelumnya.

  • Cocok untuk dataset kecil, kueri multidimensi, kueri tetap, dan kueri frekuensi tinggi.

  • Memerlukan tanggapan tingkat kedua. Sebagian besar kueri selesai dalam waktu 5 detik, meskipun durasinya bervariasi tergantung pada volume dan kompleksitas data.

Large-scale data exploration

MCQA secara otomatis mengidentifikasi karakteristik kueri, menangani pekerjaan kecil dengan respons cepat, dan menskalakan sumber daya untuk pekerjaan yang lebih besar guna memenuhi berbagai kebutuhan analisis.

  • Dataset historis berskala besar, namun hanya memerlukan volume data efektif yang kecil, dengan persyaratan latensi moderat.

  • Pengguna tipikal: analis bisnis yang mengeksplorasi data detail untuk menemukan pola, peluang, dan memvalidasi hipotesis.

Lingkup

  • Persyaratan versi:

  • Hanya pernyataan kueri data (SELECT) yang didukung. Jika pernyataan yang tidak didukung dikirimkan, client MaxCompute, JDBC, dan SDK dapat kembali ke mode offline standar. Alat lain tidak mendukung fallback. Setelah kueri kembali ke SQL standar, penagihan dilakukan berdasarkan model penagihan SQL asli.

  • Batas baris: Batas maksimum default adalah 1.000.000 baris. Tambahkan kata kunci LIMIT pada pernyataan SQL Anda untuk melebihi batas ini.

  • Pembatasan fitur:

    Pembatasan

    Deskripsi

    Fitur

    • Didukung: MaxCompute edisi Standard dan bayar sesuai penggunaan.

    • Didukung: Penagihan langganan.

    • Tidak didukung: Edisi Developer. Diperlukan peningkatan ke edisi Standard.

    Kueri

    • Maksimal 2.000 worker konkuren per pekerjaan.

    • Timeout default: 30 detik untuk pekerjaan yang dikirimkan melalui client, 20 detik untuk kueri ad hoc DataWorks. Setelah timeout, pekerjaan kembali ke mode kueri standar.

    • Hanya tabel dalam format penyimpanan ALIORC yang dapat di-cache di memori untuk akselerasi.

    Konkurensi kueri

    • Mode langganan:

      • Tier gratis (tidak dialokasikan kelompok sumber daya interaktif MCQA):

        Maksimal 5 pekerjaan konkuren per proyek per hari, hingga total 500 pekerjaan per proyek per hari. Pekerjaan yang melebihi batas ini secara otomatis kembali ke mode standar. Jika fallback dinonaktifkan, error berikut akan dikembalikan:

        ODPS-1800001: Session exception - Failed to submit sub-query in session because:Prepaid project run outoffree query quota.
      • Kelompok sumber daya interaktif MCQA:

        • Maksimal 120 pekerjaan MCQA konkuren per proyek. Pekerjaan yang melebihi batas ini kembali ke mode standar.

        • Minimum CU yang dicadangkan harus sama dengan maksimum CU yang dicadangkan untuk kelompok kuota sumber daya interaktif. Jika tidak, konfigurasi tidak berlaku.

        • Persyaratan jenis sumber daya interaktif (pekerjaan ditolak jika tidak terpenuhi):

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

          • CU yang dicadangkan harus ≥ 50 CU.

        • Setelah mengonfigurasi kelompok kuota sumber daya interaktif, semua proyek hanya mendukung pengiriman pekerjaan yang memenuhi syarat akselerasi ke kelompok kuota interaktif. Uji coba gratis MCQA tidak lagi tersedia.

        • Kelompok kuota sumber daya interaktif tidak dapat berfungsi sebagai kuota default untuk suatu proyek. Saat menggunakan MCQA, kelompok kuota interaktif berlaku untuk semua proyek tanpa perlu binding eksplisit.

    • Mode bayar sesuai penggunaan:

      Maksimal 120 pekerjaan MCQA konkuren per proyek MaxCompute. Pekerjaan yang melebihi batas ini kembali ke mode standar.

Mekanisme caching

Untuk setiap kueri MCQA, MaxCompute membuat dataset temporary untuk menyimpan hasilnya dalam cache. Batas ukuran cache adalah 10 GB per dataset temporary.

  • Pemilik dataset temporary adalah pengguna yang menjalankan kueri dan menghasilkan hasil yang di-cache.

  • Dataset temporary tidak terlihat oleh pengguna dan tidak dapat dilihat.

  • MaxCompute secara otomatis memberikan akses kepada pengguna yang menjalankan kueri ke dataset temporary tersebut.

  • Untuk mengambil hasil dari cache, kueri dan konfigurasi konteks harus identik dengan kueri aslinya. MaxCompute menggunakan kembali hasil yang di-cache untuk kueri duplikat.

Penagihan cache

Hasil kueri yang di-cache tidak dikenai biaya penyimpanan atau komputasi, sehingga secara efektif mengurangi biaya penggunaan sumber daya.

Penghapusan cache

MaxCompute menghapus hasil yang di-cache ketika:

  • Pemanfaatan sumber daya proyek tinggi — MaxCompute dapat menghapus hasil yang di-cache lebih awal.

  • Tabel atau tampilan yang direferensikan berubah — hasil yang di-cache langsung tidak valid. Menjalankan kembali kueri yang sama tidak akan mengambil data dari cache.

  • Hasil yang di-cache telah kedaluwarsa.

Verifikasi cache

Logview 2.0 menyediakan informasi Logview pekerjaan kueri. Pada tab Job Details, Anda dapat memverifikasi bahwa hasil kueri telah ditulis ke cache:

Dalam tampilan Progress Chart, node RESULTCACHE menunjukkan R/W sebesar 0/0 baris, yang mengindikasikan hasil diambil dari cache.

Aktifkan MCQA untuk paket langganan

Prosedur

Ikuti langkah-langkah berikut untuk mengaktifkan MCQA pada instans MaxCompute dengan paket langganan:

Catatan

Kuota MCQA untuk paket langganan menentukan konkurensi pemindaian, yang memengaruhi volume data yang dipindai. Sekitar 1 CU memindai 0,6 GB. Misalnya, 50 CU mendukung pemindaian sekitar 30 GB secara simultan, dengan maksimum 300 GB.

  1. Login ke Konsol MaxCompute dan pilih wilayah di pojok kiri atas.

  2. Pada panel navigasi kiri, pilih Manage Configurations > Quotas.

  3. Pada halaman Quotas, klik Quota Configuration pada kolom Actions untuk kuota target.

  4. Konfigurasi dasar kuota

    1. Pada halaman Quota Configuration, pilih tab Basic Configurations dan klik Edit Basic Configurations.

    2. Klik Add Level-2 Quota, atau konfigurasi parameter dasar untuk kuota level-2 yang sudah ada.

      Tetapkan Quota Name kustom dan pilih Interactive untuk Type. Konfigurasi kuota.

  5. Konfigurasi penskalaan kuota

    1. Pada halaman Quota Configuration, pilih tab Scaling Configuration.

    2. Pada tab Scaling Configuration, klik Add Configuration Plan, atau klik Edit pada kolom Actions untuk rencana yang sudah ada agar diperbarui.

    3. Pada kotak dialog Add Configuration Plan atau Edit Configuration Plan, konfigurasi Reserved CUs [minCU,maxCU] untuk kelompok sumber daya Interactive (MaxQA/MCQA).

      • minCU harus sama dengan maxCU.

      • minCU harus ≥ 50CU. Tetapkan ke 0 jika sumber daya interaktif tidak diperlukan.

      • Kelompok kuota interaktif tidak mendukung CU cadangan elastis.

    4. Klik OK untuk menyimpan konfigurasi kuota.

    5. Pada tab Scaling Configuration, klik Apply Immediately pada kolom Actions untuk rencana target agar diterapkan segera. Anda juga dapat menggunakan rencana yang sudah ada saat mengonfigurasi Scheduled Scaling Management.

  6. Konfigurasi rencana waktu.

    Rencana waktu memungkinkan Anda menerapkan konfigurasi kuota berbeda pada waktu berbeda dalam sehari.

Kebijakan penjadwalan

Kelompok kuota interaktif dijadwalkan secara otomatis oleh server. Kebijakan penjadwalan bergantung pada jumlah kelompok kuota interaktif dalam tenant Anda:

  • Satu kelompok kuota interaktif: semua pekerjaan MCQA dalam tenant dijadwalkan ke kelompok ini.

  • Beberapa kelompok kuota interaktif: perutean otomatis memilih kelompok berdasarkan konfigurasi Anda. Menggunakan kuota untuk sumber daya komputasi.

Kebijakan fallback

  • Ketika pekerjaan MCQA kembali ke mode kueri standar karena pembatasan penggunaan, paket langganan menggunakan kuota yang terikat pada proyek saat ini.

  • Gunakan SDK (versi lebih tinggi dari v0.40.7) untuk menentukan kuota eksekusi fallback:

    SQLExecutorBuilder builder = SQLExecutorBuilder.builder();
    builder.quotaName("<OfflineQuotaName>");
  • Gunakan parameter string koneksi JDBC fallbackQuota=XXX untuk menentukan kuota eksekusi fallback. Anda tidak dapat menentukan kelompok kuota interaktif sebagai target fallback; tindakan tersebut akan menyebabkan error.

Metode akses MCQA

Metode 1: Aktifkan MCQA melalui client MaxCompute

  1. Unduh client MaxCompute (odpscmd) terbaru.

  2. Instal dan konfigurasikan client. Instal dan konfigurasikan odpscmd.

  3. Edit file konfigurasi odps_config.ini di direktori conf pada path instalasi client. Tambahkan pengaturan berikut:

    enable_interactive_mode=true -- Enable MCQA
    interactive_auto_rerun=true  -- Auto-fallback to standard mode on MCQA failure
  4. Jalankan client MaxCompute dari direktori bin (Linux: ./bin/odpscmd, Windows: ./bin/odpscmd.bat). Koneksi yang berhasil menghasilkan output:

    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. Setelah menjalankan kueri, jika Logview dalam hasil yang dikembalikan berisi informasi terkait MCQA, fitur tersebut telah diaktifkan. Pada tab Summary LogView, jika ditampilkan Job run mode: session job 2.0, mode MCQA (interaktif) aktif.

Metode 2: Aktifkan MCQA melalui kueri ad hoc DataWorks atau pengembangan data

Kueri ad hoc DataWorks dan modul alur kerja manual memiliki MCQA yang diaktifkan secara default.

  • Jalankan kueri di Ad Hoc Query. Jika MCQA aktif, log eksekusi menampilkan Congratulations! Your task was selected to run in MaxCompute query acceleration mode dan MaxCompute query acceleration mode ran SQL successfully.

  • Jalankan kueri di Manual Workflow. Log eksekusi menampilkan Congratulations! Your task was selected to run in MaxCompute query acceleration mode dan MaxCompute query acceleration mode ran SQL successfully.

Metode 3: Aktifkan MCQA melalui JDBC

Hubungkan ke MaxCompute melalui JDBC dan aktifkan MCQA. Referensi JDBC.

  1. Unduh JDBC_JAR yang kompatibel dengan MCQA atau kode sumber yang dapat dikompilasi.

  2. Konfigurasikan dependensi POM melalui Maven.

    <dependency>
      <groupId>com.aliyun.odps</groupId>
      <artifactId>odps-jdbc</artifactId>
      <version>3.3.0</version>
      <classifier>jar-with-dependencies</classifier>
    </dependency>
  3. Buat program Java berdasarkan kode sumber. Sesuaikan dengan konfigurasi Anda. JDBC MaxCompute. Contoh:

    // AccessKey akun Alibaba Cloud memiliki akses ke semua operasi API, yang menimbulkan risiko keamanan tinggi. 
    // Kami sangat menyarankan Anda membuat dan menggunakan Pengguna RAM untuk akses API atau O&M rutin. Login ke konsol RAM untuk membuat Pengguna RAM.
    // Contoh ini menggunakan AccessKey dan AccessKeySecret yang disimpan dalam variabel lingkungan. 
    // Anda juga dapat menyimpannya dalam file konfigurasi sesuai kebutuhan bisnis Anda.
    // Kami sangat menyarankan Anda tidak menyimpan AccessKey dan AccessKeySecret dalam kode Anda. Hal ini dapat menyebabkan kebocoran pasangan Kunci Akses.
    
    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 adalah nama proyek tempat Anda ingin mengaktifkan 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)");

    Anda dapat mengonfigurasi parameter berikut dalam string koneksi:

    Parameter

    Deskripsi

    enableOdpsLogger

    Mengaktifkan logging. Tetapkan ke True jika SLF4J tidak dikonfigurasi.

    fallbackForUnknownError

    Default: False. Tetapkan ke True untuk kembali ke mode offline saat terjadi error tak dikenal.

    fallbackForResourceNotEnough

    Default: False. Tetapkan ke True untuk kembali ke mode offline saat sumber daya tidak mencukupi.

    fallbackForUpgrading

    Default: False. Tetapkan ke True untuk kembali ke mode offline selama pemutakhiran.

    fallbackForRunningTimeout

    Default: False. Tetapkan ke True untuk kembali ke mode offline saat terjadi timeout eksekusi.

    fallbackForUnsupportedFeature

    Default: False. Tetapkan ke True untuk kembali ke mode offline untuk skenario MCQA yang tidak didukung.

    alwaysFallback

    Default: False. Tetapkan ke True untuk kembali ke mode offline dalam semua skenario di atas. Memerlukan JDBC 3.2.3 atau lebih baru.

Contoh penggunaan

  • Contoh 1: Gunakan MCQA dengan Tableau:

    Tambahkan interactiveMode=true ke URL server untuk mengaktifkan MCQA. Tambahkan juga enableOdpsLogger=true untuk logging. Konfigurasi JDBC MaxCompute di Tableau.

    Contoh konfigurasi server lengkap:

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

    Untuk membatasi Tableau hanya pada tabel tertentu, tambahkan table_list=table_name1, table_name2 ke URL server (dipisahkan koma). Terlalu banyak tabel dapat memperlambat pemuatan Tableau. Untuk tabel yang sangat terpartisi, filter partisi atau gunakan SQL kustom. Contoh:

    http://service.cn-beijing.maxcompute.aliyun.com/api?project=****_beijing
    &interactiveMode=true&alwaysFallback=true&enableOdpsLogger=true&autoSelectLimit=1000000000"
    &table_list=orders,customers
  • Contoh 2: Gunakan MCQA dengan SQLWorkbench.

    Setelah mengonfigurasi driver JDBC, ubah URL JDBC di pengaturan Profil. Konfigurasi JDBC MaxCompute di SQL Workbench/J.

    Format URL:

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

    Deskripsi parameter:

    Parameter

    Deskripsi

    MaxCompute_endpoint

    Titik akhir wilayah tempat MaxCompute berjalan. Titik akhir.

    MaxCompute_project_name

    Nama proyek MaxCompute.

    AccessKey ID

    ID AccessKey dengan akses ke proyek yang ditentukan.

    Peroleh dari halaman Manajemen AccessKey.

    AccessKey Secret

    Secret AccessKey untuk ID AccessKey tersebut.

    Peroleh dari halaman Manajemen AccessKey.

    charset=UTF-8

    Format encoding karakter.

    interactiveMode

    Sakelar MCQA. Tetapkan true untuk mengaktifkan MCQA.

    autoSelectLimit

    Diperlukan saat data melebihi batas 1.000.000 baris.

Metode 4: Aktifkan MCQA melalui Java SDK

Ikhtisar Java SDK. Konfigurasikan dependensi POM melalui Maven:

<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() {
    // Setel informasi akun dan proyek.
    // AccessKey akun Alibaba Cloud memiliki akses ke semua operasi API, yang menimbulkan risiko keamanan tinggi. 
    // Kami sangat menyarankan Anda membuat dan menggunakan Pengguna RAM untuk akses API atau O&M rutin. Login ke konsol RAM untuk membuat Pengguna RAM.
    // Contoh ini menggunakan AccessKey dan AccessKeySecret yang disimpan dalam variabel lingkungan. Anda juga dapat menyimpannya dalam file konfigurasi sesuai kebutuhan bisnis Anda.
    // Kami sangat menyarankan Anda tidak menyimpan AccessKey dan AccessKeySecret dalam kode Anda. Hal ini dapat menyebabkan kebocoran pasangan Kunci Akses.
    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");

    // Siapkan untuk membangun SQLExecutor.
    SQLExecutorBuilder builder = SQLExecutorBuilder.builder();

    SQLExecutor sqlExecutor = null;
    try {
      // jalankan dalam mode offline atau jalankan dalam mode interaktif
      if (false) {
        // Buat Executor yang menjalankan SQL offline secara default.
        sqlExecutor = builder.odps(odps).executeMode(ExecuteMode.OFFLINE).build();
      } else {
        // Buat Executor yang menjalankan SQL dalam mode percepatan kueri secara default dan secara otomatis kembali ke mode offline saat gagal.
        sqlExecutor = builder.odps(odps).executeMode(ExecuteMode.INTERACTIVE).fallbackPolicy(FallbackPolicy.alwaysFallbackPolicy()).build();
      }
      // Kirim pengaturan kueri kustom jika diperlukan.
      Map<String, String> queryHint = new HashMap<>();
      queryHint.put("odps.sql.mapper.split.size", "128");
      // Kirim pekerjaan kueri. Hint didukung.
      sqlExecutor.run("select count(1) from test_table;", queryHint);

      // Daftar metode umum untuk mengambil informasi.
      // UUID
      System.out.println("ExecutorId:" + sqlExecutor.getId());
      // Logview dari pekerjaan kueri saat ini.
      System.out.println("Logview:" + sqlExecutor.getLogView());
      // Objek Instans dari pekerjaan kueri saat ini (dalam mode Interaktif, beberapa pekerjaan kueri dapat berbagi Instans yang sama).
      System.out.println("InstanceId:" + sqlExecutor.getInstance().getId());
      // Kemajuan tahap dari pekerjaan kueri saat ini (progress bar konsol).
      System.out.println("QueryStageProgress:" + sqlExecutor.getProgress());
      // Log perubahan status eksekusi dari pekerjaan kueri saat ini, seperti informasi fallback.
      System.out.println("QueryExecutionLog:" + sqlExecutor.getExecutionLog());

      // Dua metode disediakan untuk mengambil hasil.
      if(false) {
        // Ambil semua hasil kueri sekaligus. Metode sinkron ini dapat memblokir thread saat ini hingga kueri berhasil atau gagal.
        // Membaca semua data hasil ke memori sekaligus. Tidak disarankan untuk dataset besar karena potensi masalah memori.
        List<Record> records = sqlExecutor.getResult();
        printRecords(records);
      } else {
        // Ambil iterator ResultSet untuk hasil kueri. Metode sinkron ini dapat memblokir thread saat ini hingga kueri berhasil atau gagal.
        // Disarankan untuk set hasil besar. Membaca hasil kueri secara batch.
        ResultSet resultSet = sqlExecutor.getResultSet();
        while (resultSet.hasNext()) {
          printRecord(resultSet.next());
        }
      }

      // jalankan kueri lain
      sqlExecutor.run("select * from test_table;", new HashMap<>());
      if(false) {
        // Ambil semua hasil kueri sekaligus. Metode sinkron ini dapat memblokir thread saat ini hingga kueri berhasil atau gagal.
        // Membaca semua data hasil ke memori sekaligus. Tidak disarankan untuk dataset besar karena potensi masalah memori.
        List<Record> records = sqlExecutor.getResult();
                printRecords(records);
            } else {
        // Ambil iterator ResultSet untuk hasil kueri. Metode sinkron ini dapat memblokir thread saat ini hingga kueri berhasil atau gagal.
        // Disarankan untuk set hasil besar. Membaca hasil kueri secara batch.
                ResultSet resultSet = sqlExecutor.getResultSet();
                while (resultSet.hasNext()) {
                    printRecord(resultSet.next());
                }
            }
        } catch (OdpsException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (sqlExecutor != null) {
                // Tutup Executor untuk melepaskan sumber daya.
                sqlExecutor.close();
            }
        }
    }

    // SQLExecutor dapat digunakan kembali dengan mode pool
    public static void ExampleWithPool() {
        // Jalankan kueri menggunakan kolam koneksi.
        // AccessKey akun Alibaba Cloud memiliki akses ke semua operasi API, yang menimbulkan risiko keamanan tinggi. 
        // Kami sangat menyarankan Anda membuat dan menggunakan Pengguna RAM untuk akses API atau O&M rutin. Login ke konsol RAM untuk membuat Pengguna RAM.
        // Contoh ini menggunakan AccessKey dan AccessKeySecret yang disimpan dalam variabel lingkungan. Anda juga dapat menyimpannya dalam file konfigurasi sesuai kebutuhan bisnis Anda.
        // Kami sangat menyarankan Anda tidak menyimpan AccessKey dan AccessKeySecret dalam kode Anda. Hal ini dapat menyebabkan kebocoran pasangan Kunci Akses.
        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");

        // Siapkan kolam koneksi dan atur ukuran pool serta mode eksekusi default.
        SQLExecutorPool sqlExecutorPool = null;
        SQLExecutor sqlExecutor = null;
        try {
            // Siapkan kolam koneksi dan atur ukuran pool serta mode eksekusi default.
            SQLExecutorPoolBuilder builder = SQLExecutorPoolBuilder.builder();
            builder.odps(odps)
                    .initPoolSize(1) // jumlah executor awal pool
                    .maxPoolSize(5)  // executor maksimum dalam pool
                    .executeMode(ExecuteMode.INTERACTIVE); // jalankan dalam mode interaktif

            sqlExecutorPool = builder.build();
            // Dapatkan Executor dari kolam koneksi. Jika tidak tersedia, executor baru dibuat dalam batas maksimum.
            sqlExecutor = sqlExecutorPool.getExecutor();

            // Penggunaan Executor sama seperti pada contoh sebelumnya.
            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();
    }
}

Metode 5: Aktifkan MCQA melalui PyODPS dengan SQLAlchemy atau alat lain yang kompatibel dengan SQLAlchemy

PyODPS mengintegrasikan SQLAlchemy untuk mengkueri data MaxCompute. Tentukan parameter berikut dalam string koneksi untuk mengaktifkan MCQA:

  • interactive_mode=true: Wajib. Sakelar utama MCQA.

  • reuse_odps=true: Opsional. Memaksa penggunaan kembali koneksi. Meningkatkan performa dengan beberapa alat pihak ketiga (misalnya, Apache Superset).

Konfigurasikan fallback_policy=<policy1>,<policy2>,... dalam string koneksi untuk mengontrol perilaku fallback, mirip dengan parameter JDBC.

  • generic: Default: False. Kembali ke mode offline saat terjadi error tak dikenal.

  • noresource: Default: False. Kembali ke mode offline saat sumber daya tidak mencukupi.

  • upgrading: Default: False. Kembali ke mode offline selama pemutakhiran.

  • timeout: Default: False. Kembali ke mode offline saat terjadi timeout eksekusi.

  • unsupported: Default: False. Kembali ke mode offline untuk skenario MCQA yang tidak didukung.

  • default: Setara dengan menentukan unsupported, upgrading, noresource, dan timeout. Ini adalah kebijakan default jika fallback_policy tidak ditentukan.

  • all: Default: False. Kembali ke mode offline dalam semua skenario di atas.

Contoh penggunaan

String koneksi dengan MCQA diaktifkan, penggunaan kembali koneksi dipaksa, dan fallback untuk skenario unsupported/upgrading/noresource:

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

FAQ

  • Q1: Saat menggunakan JDBC untuk terhubung ke MaxCompute dan mengeksekusi tugas SQL dengan sumber daya langganan, terjadi error 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.
    • Penyebab kemungkinan:

      Selama pratinjau publik MCQA, pengguna paket langganan dapat mencoba MCQA secara gratis. Uji coba gratis memungkinkan maksimal 5 pekerjaan MCQA konkuren per proyek dan hingga 500 pekerjaan akselerasi gratis per proyek per hari. Melebihi 500 pekerjaan memicu error ini.

    • Solusi:

      Tetapkan alwaysFallback=true dalam konfigurasi MCQA JDBC. Pekerjaan dalam batas 500 menggunakan MCQA; pekerjaan yang melebihi batas tersebut kembali ke mode offline. Metode akses MCQA.

  • Q2: Waktu respons permintaan PyODPS lebih lama daripada DataWorks.

    • Kemungkinan penyebab:

      • Menggunakan metode wait_for_xxx, yang menambah latensi.

      • Interval polling panjang.

    • Solusi:

      • Untuk permintaan yang berjalan cepat, lewati metode wait_for_xxx dan gunakan Tunnel untuk mengunduh hasil secara langsung.

      • Kurangi interval polling: instance.wait_for_success(interval=0.1). Contoh:

        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: Bagaimana cara menggunakan Logview untuk troubleshooting error Java SDK?

    Solusi: Java SDK MaxCompute menyediakan antarmuka Logview. Gunakan kode berikut untuk mengambil log:

    String logview = sqlExecutor.getLogView();
  • Q4: Bagaimana cara mendapatkan URL Logview MaxCompute melalui JDBC?

    Solusi: MaxCompute JDBC Driver dibangun di atas Java SDK MaxCompute. Saat mengeksekusi SQL melalui JDBC, URL Logview dihasilkan untuk melacak status dan kemajuan tugas. Konfigurasikan output log (properties.log4j) untuk menangkap URL tersebut. Secara default, URL tersebut dicetak ke stdout.