全部产品
Search
文档中心

MaxCompute:Percepatan Kueri (MCQA)

更新时间:Dec 03, 2025

Topik ini menjelaskan arsitektur sistem, fitur utama, dan kasus penggunaan umum dari fitur Percepatan Kueri MaxCompute (MCQA).

Penting

MaxCompute dijadwalkan meluncurkan MaxQA (MaxCompute Query Accelerator 2.0) di website Alibaba Cloud China (www.aliyun.com) dan website Alibaba Cloud Internasional (www.alibabacloud.com) masing-masing pada hari Senin, 24 November 2025 (UTC+8) dan Kamis, 27 November 2025 (UTC+8). Setelah peluncuran tersebut, fitur MCQA yang dijelaskan dalam dokumen ini tidak akan lagi tersedia untuk pelanggan baru.

Pendahuluan

Fitur Percepatan Kueri MaxCompute (MCQA) menyediakan kemampuan berikut:

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

  • Mendukung alat business intelligence (BI) utama untuk kueri ad hoc dan analisis BI.

  • Menggunakan kolam sumber daya independen yang tidak memakai sumber daya komputasi offline. Fitur ini secara otomatis mengidentifikasi pekerjaan kueri untuk mengurangi tekanan antrean dan meningkatkan pengalaman pengguna.

  • Menulis hasil pekerjaan MCQA ke cache temporary. Saat Anda menjalankan kueri yang sama kembali, MaxCompute mengembalikan hasil yang telah di-cache guna mempercepat eksekusi.

Alur kueri

Gambar berikut menunjukkan arsitektur pemrosesan kueri MaxCompute. Setelah kueri diterima, fitur smart routing mengarahkannya ke pohon aturan tertentu untuk diproses oleh Percepatan Kueri (MCQA), eksekusi SQL standar, atau komputasi multi-engine.

Dalam arsitektur di atas, MCQA menulis hasil pekerjaan kueri ke cache temporary. Saat Anda menjalankan kueri yang sama kembali, MaxCompute mengembalikan hasil yang telah di-cache untuk mempercepat eksekusi. Untuk informasi lebih lanjut tentang mekanisme caching, lihat Mekanisme caching.

Kasus penggunaan

Kasus penggunaan

Deskripsi

Karakteristik

Kueri ad hoc

Anda dapat menggunakan MCQA untuk mengoptimalkan performa kueri pada dataset kecil hingga menengah hingga beberapa ratus gigabyte. Hal ini memungkinkan Anda melakukan kueri latensi rendah langsung pada tabel MaxCompute untuk menyelesaikan pengembangan data dan analitik data dengan cepat.

  • Secara fleksibel memilih kondisi kueri untuk segera mengambil hasil kueri dan menyesuaikan logika kueri sesuai kebutuhan.

  • Persyaratan latensi kueri berada dalam hitungan puluhan detik.

  • Pengguna biasanya merupakan developer data atau analis data yang memiliki kemampuan SQL dan ingin menggunakan alat client yang sudah dikenal untuk analisis kueri.

Intelijen bisnis (BI)

Saat Anda membangun gudang data perusahaan menggunakan MaxCompute, proses extract, transform, and load (ETL) mengubah data menjadi data agregat yang berorientasi bisnis. MCQA menyediakan latensi rendah, konkurensi elastis, dan caching data. Dikombinasikan dengan optimasi seperti partisi tabel MaxCompute dan bucketing, fitur ini dapat memenuhi kebutuhan pembuatan laporan, analisis statistik, dan analisis laporan tetap dengan konkurensi tinggi dan respons cepat dengan biaya rendah.

  • Objek data yang dikueri biasanya berupa data hasil agregasi.

  • Cocok untuk skenario dengan volume data kecil, kueri multidimensi, kueri tetap, dan kueri frekuensi tinggi.

  • Memerlukan latensi kueri rendah, dengan respons dalam hitungan detik. Misalnya, sebagian besar kueri sebaiknya tidak melebihi 5 detik. Waktu kueri sangat bervariasi tergantung pada volume data dan kompleksitas kueri.

Analisis kueri detail data masif

MCQA dapat secara otomatis mengidentifikasi karakteristik pekerjaan kueri. Fitur ini dapat merespons dengan cepat pekerjaan berskala kecil dan secara otomatis mencocokkan kebutuhan sumber daya untuk pekerjaan berskala besar. Hal ini memenuhi kebutuhan analis yang bekerja dengan pekerjaan kueri dengan berbagai skala dan kompleksitas.

  • Melibatkan eksplorasi volume besar data historis di mana data efektif yang dibutuhkan kecil dan persyaratan latensi kueri moderat.

  • Pengguna biasanya merupakan analis bisnis yang perlu mengeksplorasi pola bisnis, mengidentifikasi peluang, dan memvalidasi hipotesis dari data detail.

Batasan

  • Persyaratan versi:

    • Diperlukan client MaxCompute (odpscmd) versi 0.40.8 atau lebih baru.

    • Diperlukan ODPS-JDBC versi 3.3.0 atau lebih baru.

    • Diperlukan ODPS-SDK versi 0.40.8-public atau lebih baru.

  • Hanya mendukung pernyataan kueri data yang dimulai dengan SELECT. Jika Anda mengirimkan pernyataan yang tidak didukung oleh MCQA, client MaxCompute, Java Database Connectivity (JDBC), dan software development kit (SDK) dapat dikonfigurasi untuk fallback ke mode eksekusi offline standar. Alat lain tidak mendukung fallback ini. Setelah pekerjaan kueri fallback ke pekerjaan SQL standar, penagihannya mengikuti metode penagihan pekerjaan SQL standar.

  • Batas baris: Secara default, Anda dapat mengkueri maksimal 1.000.000 baris data. Anda dapat menambahkan kata kunci LIMIT ke pernyataan SQL Anda untuk melebihi batas ini.

  • Batasan fitur:

    Batasan

    Deskripsi

    Fitur

    • Mendukung layanan MaxCompute Edisi Standar dan pay-as-you-go.

    • Mendukung metode penagihan subscription.

    • Tidak mendukung Edisi Developer MaxCompute. Anda harus upgrade ke Edisi Standar.

    Kueri

    • Pekerjaan eksekusi satu kali mendukung maksimal 2.000 worker konkuren.

    • Pekerjaan MCQA yang dikirim melalui client timeout setelah 30 detik secara default. Pekerjaan MCQA yang dikirim melalui kueri ad hoc DataWorks timeout setelah 20 detik secara default. Setelah timeout, pekerjaan MCQA secara default fallback ke pekerjaan kueri standar.

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

    Konkurensi kueri

    • Mode subscription.

      • Edisi Gratis (tanpa kelompok sumber daya interaktif MCQA).

        Setiap proyek dibatasi hingga 5 pekerjaan konkuren dan maksimal 500 pekerjaan per hari. Jika batas ini terlampaui, pekerjaan secara otomatis fallback ke pekerjaan standar secara default. Jika fallback dinonaktifkan, sistem melaporkan error berikut:

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

        • Jumlah maksimum pekerjaan MCQA konkuren untuk setiap proyek adalah 120. Jika batas ini terlampaui, pekerjaan yang dikirimkan fallback ke mode pekerjaan standar.

        • Saat Anda mengonfigurasi grup kuota tipe sumber daya interaktif, CU yang dicadangkan minimum dan maksimum untuk pekerjaan MCQA harus sama. Jika tidak, konfigurasi tidak berlaku.

        • Tipe sumber daya interaktif harus memenuhi persyaratan berikut. Jika tidak, pekerjaan tidak dapat dikirimkan.

          • Reserved CUs [minCU] harus sama dengan Reserved CUs [maxCU].

          • Jumlah CU yang dicadangkan harus lebih besar dari atau sama dengan 50.

        • Setelah Anda mengonfigurasi kelompok kuota sumber daya interaktif, hanya pekerjaan yang dapat diidentifikasi untuk akselerasi yang dapat dikirimkan ke kelompok kuota sumber daya interaktif untuk semua proyek. Uji coba gratis untuk fitur percepatan kueri tidak lagi tersedia.

        • Grup kuota tipe sumber daya interaktif tidak dapat digunakan sebagai kuota default untuk proyek. Saat Anda menggunakan fitur percepatan kueri, grup kuota interaktif berlaku untuk semua proyek tanpa perlu disambungkan ke proyek tertentu.

    • Mode pay-as-you-go.

      Jumlah maksimum pekerjaan MCQA konkuren untuk satu proyek MaxCompute adalah 120. Jika batas ini terlampaui, pekerjaan fallback ke mode pekerjaan standar.

Mekanisme caching

Untuk setiap pekerjaan kueri MCQA, MaxCompute membuat dataset temporary untuk menyimpan cache hasil kueri. Ukuran cache dataset temporary dibatasi hingga 10 GB.

  • Pemilik dataset temporary adalah pengguna yang menjalankan pekerjaan kueri yang menghasilkan hasil cache.

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

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

  • Untuk mengambil data dari hasil kueri yang di-cache, pekerjaan kueri dan konfigurasi konteksnya harus identik dengan pekerjaan kueri aslinya. Saat Anda menjalankan pekerjaan kueri duplikat, MaxCompute menggunakan kembali hasil yang telah di-cache.

Penagihan untuk hasil cache

Hasil kueri yang di-cache tidak dikenakan biaya penyimpanan atau komputasi. Hal ini secara efektif mengurangi biaya penggunaan sumber daya.

Penghapusan hasil cache

MaxCompute menghapus hasil cache dalam situasi berikut:

  • MaxCompute menghapus hasil cache lebih awal saat penggunaan sumber daya proyek MaxCompute tinggi.

  • Jika tabel atau view yang direferensikan oleh hasil cache diubah, hasil cache tersebut langsung menjadi tidak valid. MaxCompute menghapus hasil cache yang tidak valid tersebut. Jika Anda menjalankan pekerjaan kueri yang sama lagi, data cache tidak diambil.

  • Hasil yang di-cache telah kedaluwarsa.

Verifikasi cache

Anda dapat menggunakan Logview 2.0 untuk melihat informasi Logview untuk pekerjaan kueri. Seperti yang ditunjukkan pada gambar berikut, pada tab Job Details, Anda dapat melihat bahwa hasil pekerjaan kueri telah ditulis ke cache:

Cache

Mengaktifkan MCQA untuk instansi langganan

Prosedur

Ikuti langkah-langkah berikut untuk menggunakan fitur percepatan kueri guna mempercepat proyek dalam instans MaxCompute subscription.

Catatan

Kuota MCQA subscription menentukan konkurensi pemindaian selama kueri, yang pada gilirannya memengaruhi jumlah data yang dipindai di tabel target. Perkiraan rasionya adalah 1 CU dapat memindai 0,6 GB data. Sebagai contoh, jika Anda membeli kuota MCQA sebesar 50 CU, Anda dapat memindai sekitar 30 GB data secara bersamaan. Saat ini, MCQA mendukung pemindaian maksimal hingga 300 GB.

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

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

  3. Pada halaman Quotas, temukan kuota target dan klik Quota Configuration di kolom Actions.

  4. Konfigurasi pengaturan 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.

      Masukkan Quota Name kustom dan atur Type ke Interactive. Untuk informasi lebih lanjut tentang parameter, lihat 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 temukan rencana konfigurasi yang sudah ada dan klik Edit di kolom Actions untuk memperbarui rencana tersebut.

    3. Pada dialog Add Configuration Plan atau Edit Configuration Plan, konfigurasi Reserved CUs [minCU,maxCU] untuk kelompok sumber daya MCQA.

      • Jumlah minimum CU (minCU) harus sama dengan jumlah maksimum CU (maxCU).

      • Jumlah minimum CU harus lebih besar dari atau sama dengan 50. Jika Anda tidak memerlukan sumber daya interaktif, atur parameter ini ke 0.

      • Cu cadangan elastis tidak didukung untuk kuota interaktif.

    4. Klik OK untuk menyimpan konfigurasi kuota.

    5. Pada tab Scaling Configuration, temukan rencana konfigurasi target dan klik Apply Immediately di kolom Actions untuk segera menerapkan rencana tersebut. Anda juga dapat menggunakan rencana yang sudah ada saat mengonfigurasi Scheduled Scaling Management.

  6. Konfigurasi rencana berbasis waktu.

    Anda dapat mengonfigurasi rencana berbasis waktu untuk mengaktifkan rencana kuota berbeda pada waktu berbeda dalam sehari. Hal ini menerapkan logika berbasis waktu untuk konfigurasi kuota.

Kebijakan Penjadwalan

Kelompok kuota interaktif tidak dapat ditentukan secara eksplisit. Kelompok tersebut dijadwalkan secara otomatis oleh layanan berdasarkan aturan. Kebijakan penjadwalan spesifik bergantung pada jumlah kelompok kuota interaktif di bawah tenant:

  • Jika hanya ada satu kelompok kuota interaktif, semua pekerjaan percepatan kueri di bawah tenant dijadwalkan ke kelompok kuota tersebut.

  • Jika tenant memiliki beberapa kelompok kuota interaktif, aturan perutean otomatis memilih salah satu berdasarkan konfigurasi pengguna. Untuk informasi lebih lanjut, lihat Aturan kuota.

Kebijakan fallback

  • Jika pekerjaan percepatan kueri fallback ke pekerjaan kueri standar karena batasan penggunaan, kuota yang didedikasikan untuk menjalankan pekerjaan MCQA dalam instans subscription fallback ke sumber daya kuota yang dilampirkan ke proyek saat ini.

  • Anda dapat menggunakan SDK (versi 0.40.7 atau lebih baru) untuk menentukan sumber daya kuota eksekusi untuk pekerjaan fallback.

    SQLExecutorBuilder builder = SQLExecutorBuilder.builder();
    builder.quotaName("<OfflineQuotaName>");
  • Anda dapat menggunakan parameter string koneksi JDBC fallbackQuota=XXX untuk menentukan sumber daya kuota eksekusi untuk pekerjaan fallback. Anda tidak dapat menentukan kelompok kuota interaktif sebagai kuota eksekusi untuk pekerjaan fallback. Jika dilakukan, sistem akan melaporkan error.

Metode koneksi untuk MCQA

Metode 1: Aktifkan MCQA menggunakan client MaxCompute

  1. Unduh versi terbaru client MaxCompute (odpscmd).

  2. Instal dan konfigurasikan client. Untuk informasi lebih lanjut, lihat Instal dan konfigurasi client MaxCompute.

  3. Modifikasi file odps_config.ini di direktori conf pada path instalasi client. Tambahkan perintah berikut ke file konfigurasi:

    enable_interactive_mode=true -- Mengaktifkan MCQA
    interactive_auto_rerun=true  -- Menentukan bahwa jika pekerjaan MCQA gagal, secara otomatis fallback ke pekerjaan standar.
  4. Jalankan client MaxCompute di direktori bin pada path instalasi client. Untuk Linux, jalankan ./bin/odpscmd. Untuk Windows, jalankan ./bin/odpscmd.bat. Informasi berikut menunjukkan bahwa operasi berhasil:客户端运行成功

  5. Setelah Anda menjalankan pekerjaan kueri, jika Logview pada antarmuka client berisi informasi berikut, MCQA telah diaktifkan:logviiew

Metode 2: Aktifkan MCQA menggunakan fitur kueri ad hoc atau pengembangan data di DataWorks

Modul kueri ad hoc dan alur kerja yang dipicu secara manual di DataWorks telah mengaktifkan MCQA secara default. Anda tidak perlu mengaktifkannya secara manual.

  • Jalankan pekerjaan kueri di modul Ad-hoc Query. Jika hasil yang dikembalikan berisi informasi berikut, MCQA telah diaktifkan:临时查询

  • Jalankan pekerjaan kueri di modul alur kerja yang dipicu secara manual. Jika hasil yang dikembalikan berisi informasi berikut, MCQA telah diaktifkan:手动业务流程

Metode 3: Aktifkan MCQA menggunakan JDBC

Saat Anda menggunakan JDBC untuk terhubung ke MaxCompute, Anda dapat melakukan operasi berikut untuk mengaktifkan MCQA. Untuk informasi lebih lanjut tentang cara menggunakan JDBC untuk terhubung ke MaxCompute, lihat Gunakan JDBC.

  1. Unduh JDBC_JAR yang mendukung MCQA atau kode sumber yang dapat dikompilasi.

  2. Konfigurasi dependensi Pom menggunakan 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 dan sesuaikan dengan informasi aktual Anda. Untuk informasi lebih lanjut, lihat MaxCompute JDBC. Kode berikut memberikan contoh.

    // AccessKey Akun Alibaba Cloud memiliki izin penuh pada semua API dan menimbulkan risiko keamanan tinggi. Kami menyarankan Anda membuat dan menggunakan Pengguna RAM untuk melakukan panggilan API atau O&M. Untuk membuat Pengguna RAM, login ke Konsol RAM.
    // Contoh ini menunjukkan cara menyimpan ID AccessKey dan Rahasia AccessKey dalam variabel lingkungan. Anda juga dapat menyimpannya dalam file konfigurasi sesuai kebutuhan.
    // Kami sangat menyarankan agar Anda tidak menyematkan ID AccessKey dan Rahasia AccessKey secara langsung dalam kode Anda. Hal ini dapat menimbulkan risiko keamanan.
    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 untuk memperhalus logika pemrosesan.

    Parameter

    Deskripsi

    enableOdpsLogger

    Digunakan untuk pencetakan log. Jika SLF4J tidak dikonfigurasi, kami menyarankan Anda mengatur parameter ini ke True.

    fallbackForUnknownError

    Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline saat terjadi error yang tidak dikenal.

    fallbackForResourceNotEnough

    Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline saat sumber daya tidak mencukupi.

    fallbackForUpgrading

    Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline selama proses peningkatan.

    fallbackForRunningTimeout

    Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline saat terjadi timeout.

    fallbackForUnsupportedFeature

    Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline saat menghadapi skenario MCQA yang tidak didukung.

    alwaysFallback

    Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline dalam semua skenario di atas. Ini hanya didukung di JDBC versi 3.2.3 dan yang lebih baru.

Contoh penggunaan

  • Contoh 1: Gunakan MCQA pada Tableau

    Tambahkan properti interactiveMode=true ke server untuk mengaktifkan MCQA. Kami juga menyarankan Anda menambahkan properti enableOdpsLogger=true untuk pencetakan log. Untuk informasi lebih lanjut tentang konfigurasi, lihat Konfigurasi JDBC untuk menggunakan Tableau.

    Kode berikut memberikan contoh konfigurasi server lengkap.

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

    Jika Anda hanya melakukan operasi Tableau pada beberapa tabel dalam proyek, Anda dapat menambahkan properti table_list=table_name1, table_name2 ke parameter server untuk memilih tabel yang diperlukan. Pisahkan nama tabel dengan koma (,). Jika terlalu banyak tabel, Tableau mungkin membuka dengan lambat. Kami sangat menyarankan Anda menggunakan metode ini untuk hanya memuat tabel yang diperlukan. Kode berikut memberikan contoh. Untuk tabel dengan banyak partisi, kami tidak menyarankan mengatur semua data partisi sebagai sumber data. Anda dapat memfilter partisi yang diperlukan atau menggunakan SQL kustom untuk mengambil data yang diperlukan.

    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 SQL Workbench/J

    Setelah Anda mengonfigurasi driver JDBC, Anda dapat memodifikasi URL JDBC di antarmuka konfigurasi Profile untuk mengaktifkan SQL Workbench/J menggunakan MCQA. Untuk informasi lebih lanjut tentang konfigurasi profil, lihat Konfigurasi JDBC untuk menggunakan SQL Workbench/J.

    URL harus dalam format berikut:

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

    Tabel berikut menjelaskan parameter-parameter tersebut.

    Parameter

    Deskripsi

    MaxCompute_endpoint

    Titik akhir wilayah tempat layanan MaxCompute berada. Untuk informasi lebih lanjut, lihat Titik akhir.

    MaxCompute_project_name

    Nama proyek MaxCompute.

    AccessKey ID

    ID AccessKey yang memiliki izin akses ke proyek yang ditentukan.

    Anda dapat membuka halaman Manajemen AccessKey untuk mendapatkan ID AccessKey.

    AccessKey Secret

    Rahasia AccessKey yang sesuai dengan ID AccessKey.

    Anda dapat membuka halaman Manajemen AccessKey untuk mendapatkan Rahasia AccessKey.

    charset=UTF-8

    Format encoding set karakter.

    interactiveMode

    Saklar untuk fitur MCQA. true mengaktifkan MCQA.

    autoSelectLimit

    Parameter ini harus dikonfigurasi saat volume data melebihi batas 1.000.000 baris.

Metode 4: Aktifkan MCQA menggunakan Java SDK

Untuk informasi lebih lanjut tentang Java SDK, lihat Ikhtisar Java SDK. Anda harus mengonfigurasi dependensi Pom di Maven. Kode berikut memberikan contoh konfigurasi.

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

Berikut adalah contoh perintah untuk membuat program 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() {
    // Atur informasi akun dan proyek.
    // AccessKey Akun Alibaba Cloud memiliki izin penuh pada semua API dan menimbulkan risiko keamanan tinggi. Kami menyarankan Anda membuat dan menggunakan Pengguna RAM untuk melakukan panggilan API atau O&M. Untuk membuat Pengguna RAM, login ke Konsol RAM.
    // Contoh ini menunjukkan cara menyimpan ID AccessKey dan Rahasia AccessKey dalam variabel lingkungan. Anda juga dapat menyimpannya dalam file konfigurasi sesuai kebutuhan.
    // Kami sangat menyarankan agar Anda tidak menyematkan ID AccessKey dan Rahasia AccessKey secara langsung dalam kode Anda. Hal ini dapat menimbulkan risiko keamanan.
    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 pernyataan SQL offline secara default.
        sqlExecutor = builder.odps(odps).executeMode(ExecuteMode.OFFLINE).build();
      } else {
        // Buat executor yang menjalankan kueri SQL dipercepat secara default dan secara otomatis fallback ke mode kueri offline jika akselerasi gagal.
        sqlExecutor = builder.odps(odps).executeMode(ExecuteMode.INTERACTIVE).fallbackPolicy(FallbackPolicy.alwaysFallbackPolicy()).build();
      }
      // Anda dapat meneruskan pengaturan khusus untuk kueri jika diperlukan.
      Map<String, String> queryHint = new HashMap<>();
      queryHint.put("odps.sql.mapper.split.size", "128");
      // Kirim pekerjaan kueri. Petunjuk didukung.
      sqlExecutor.run("select count(1) from test_table;", queryHint);

      // Kode berikut memberikan beberapa metode umum untuk mendapatkan informasi.
      // UUID
      System.out.println("ExecutorId:" + sqlExecutor.getId());
      // Logview dari pekerjaan kueri saat ini.
      System.out.println("Logview:" + sqlExecutor.getLogView());
      // Objek Instance dari pekerjaan kueri saat ini. Dalam mode interaktif, beberapa pekerjaan kueri mungkin berbagi instance yang sama.
      System.out.println("InstanceId:" + sqlExecutor.getInstance().getId());
      // Kemajuan tahap dari pekerjaan kueri saat ini (progress bar di 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 mendapatkan hasil.
      if(false) {
        // Langsung ambil semua hasil kueri. Ini adalah metode sinkron dan mungkin menduduki thread saat ini hingga kueri berhasil atau gagal.
        // Metode ini membaca semua data hasil ke memori sekaligus. Kami tidak menyarankan menggunakan metode ini untuk dataset besar karena potensi masalah memori.
        List<Record> records = sqlExecutor.getResult();
        printRecords(records);
      } else {
        // Ambil iterator (ResultSet) untuk hasil kueri. Ini adalah metode sinkron dan mungkin menduduki thread saat ini hingga kueri berhasil atau gagal.
        // Kami menyarankan menggunakan metode ini untuk mengambil dataset besar karena membaca hasil kueri secara bertahap.
        ResultSet resultSet = sqlExecutor.getResultSet();
        while (resultSet.hasNext()) {
          printRecord(resultSet.next());
        }
      }

      // jalankan kueri lain
      sqlExecutor.run("select * from test_table;", new HashMap<>());
      if(false) {
        // Langsung ambil semua hasil kueri. Ini adalah metode sinkron dan mungkin menduduki thread saat ini hingga kueri berhasil atau gagal.
        // Metode ini membaca semua data hasil ke memori sekaligus. Kami tidak menyarankan menggunakan metode ini untuk dataset besar karena potensi masalah memori.
        List<Record> records = sqlExecutor.getResult();
                printRecords(records);
            } else {
                // Ambil iterator (ResultSet) untuk hasil kueri. Ini adalah metode sinkron dan mungkin menduduki thread saat ini hingga kueri berhasil atau gagal.
                // Kami menyarankan menggunakan metode ini untuk mengambil dataset besar karena membaca hasil kueri secara bertahap.
                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() {
        // Atur informasi akun dan proyek.
      	// AccessKey Akun Alibaba Cloud memiliki izin penuh pada semua API dan menimbulkan risiko keamanan tinggi. Kami menyarankan Anda membuat dan menggunakan Pengguna RAM untuk melakukan panggilan API atau O&M. Untuk membuat Pengguna RAM, login ke Konsol RAM.
		// Contoh ini menunjukkan cara menyimpan ID AccessKey dan Rahasia AccessKey dalam variabel lingkungan. Anda juga dapat menyimpannya dalam file konfigurasi sesuai kebutuhan.
		// Kami sangat menyarankan agar Anda tidak menyematkan ID AccessKey dan Rahasia AccessKey secara langsung dalam kode Anda. Hal ini dapat menimbulkan risiko keamanan.
        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");

        // Jalankan kueri menggunakan kolam koneksi.
        SQLExecutorPool sqlExecutorPool = null;
        SQLExecutor sqlExecutor = null;
        try {
            // Siapkan kolam koneksi, atur ukuran pool dan 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 pool kosong, 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: Gunakan PyODPS dengan SQLAlchemy atau alat pihak ketiga kompatibel SQLAlchemy lainnya untuk mempercepat kueri

PyODPS terintegrasi dengan SQLAlchemy, memungkinkan Anda menggunakan SQLAlchemy untuk mengkueri data MaxCompute. Anda perlu menentukan parameter berikut dalam string koneksi untuk mempercepat kueri:

  • interactive_mode=true: Wajib. Ini adalah saklar utama untuk fitur percepatan kueri.

  • reuse_odps=true: Opsional. Mengaktifkan pemakaian ulang koneksi paksa. Untuk beberapa alat pihak ketiga, seperti Apache Superset, mengaktifkan opsi ini dapat meningkatkan kinerja.

Anda dapat mengonfigurasi parameter fallback_policy=<policy1>,<policy2>,... dalam string koneksi untuk memperhalus logika pemrosesan. Mirip dengan konfigurasi JDBC, ini mengontrol perilaku fallback saat akselerasi gagal.

  • generic: Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline saat terjadi error yang tidak dikenal.

  • noresource: Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline saat sumber daya tidak mencukupi.

  • upgrading: Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline selama proses peningkatan.

  • timeout: Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline saat terjadi timeout.

  • unsupported: Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline saat menghadapi skenario MCQA yang tidak didukung.

  • default: Setara dengan menentukan unsupported, upgrading, noresource, dan timeout secara bersamaan. Jika fallback_policy tidak ditentukan dalam string koneksi, ini adalah nilai default.

  • all: Nilai default adalah False. Jika Anda mengaturnya ke True, sistem akan fallback ke mode offline dalam semua skenario di atas.

Contoh penggunaan

String koneksi berikut mengaktifkan percepatan kueri, mengaktifkan reuse koneksi paksa, dan fallback ke mode offline saat fitur percepatan kueri belum didukung, selama proses peningkatan, atau saat sumber daya tidak mencukupi.

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

Tanya Jawab Umum

  • Pertanyaan 1: Saat saya menggunakan JDBC untuk terhubung ke MaxCompute dan menjalankan tugas SQL pada sumber daya subscription, error "ODPS-1800001" dilaporkan. Pesan error detailnya sebagai berikut:

    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.
    • Kemungkinan penyebab:

      Fitur percepatan kueri saat ini dalam pratinjau publik. Jika Anda membeli paket subscription, Anda dapat mencoba fitur percepatan kueri secara gratis selama periode pratinjau publik tanpa perlu melakukan operasi tambahan. Selama uji coba gratis, satu proyek MaxCompute mendukung maksimal 5 pekerjaan konkuren dan total kumulatif 500 pekerjaan dipercepat per hari. Jika jumlah pekerjaan melebihi 500, error di atas terjadi.

    • Solusi:

      Saat Anda mengonfigurasi JDBC untuk mengaktifkan MCQA, atur parameter alwaysFallback ke true. Setelah parameter ini diatur, Anda dapat menggunakan MCQA untuk percepatan kueri selama jumlah pekerjaan tidak melebihi 500. Pekerjaan yang melebihi batas ini akan fallback ke mode offline. Untuk informasi lebih lanjut tentang konfigurasi dan parameter, lihat Metode koneksi untuk MCQA.

  • Pertanyaan 2: Mengapa mengirim permintaan dan mengambil hasil menggunakan PyODPS memakan waktu lebih lama dibandingkan menggunakan DataWorks?

    • Kemungkinan penyebab:

      • Metode wait_for_xxx digunakan, yang meningkatkan waktu eksekusi.

      • Interval polling terlalu panjang.

    • Solusi:

      • Jika permintaan itu sendiri berjalan cepat, jangan gunakan metode wait_for_xxx. Setelah Anda mengirim permintaan, langsung gunakan Tunnel untuk mengunduh hasilnya.

      • Kurangi interval polling: instance.wait_for_success(interval=0.1). Kode berikut memberikan contoh perintah.

        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')
  • Pertanyaan 3: Bagaimana cara menggunakan Logview untuk memecahkan masalah error Java SDK?

    Solusi: MaxCompute Java SDK menyediakan antarmuka Logview. Anda dapat menggunakan perintah berikut untuk memanggil antarmuka Logview guna mengambil log.

    String logview = sqlExecutor.getLogView();
  • Pertanyaan 4: Bagaimana cara mengambil URL Logview MaxCompute saat menggunakan JDBC?

    Solusi: MaxCompute JDBC Driver adalah enkapsulasi dari MaxCompute Java SDK. Oleh karena itu, saat Anda menggunakan MaxCompute JDBC Driver untuk mengeksekusi SQL, URL Logview dihasilkan, sama seperti pada client MaxCompute, MaxCompute Studio, dan DataWorks. Anda dapat menggunakan Logview untuk melihat status eksekusi tugas, melacak kemajuan tugas, dan mengambil hasil eksekusi tugas. URL Logview dapat dicetak ke layar terminal dengan mengonfigurasi output log (properties.log4j) untuk menggunakan output standar secara default.