All Products
Search
Document Center

MaxCompute:Menulis ke Delta Table secara near-real-time menggunakan Flink CDC open source

Last Updated:Jun 09, 2026

MaxCompute menyediakan plugin Connector versi baru untuk integrasi dengan Flink CDC. Anda dapat menyinkronkan data dari sumber data (misalnya MySQL) secara real-time ke tabel tujuan di MaxCompute (tabel biasa atau Delta table) melalui integrasi ini. Artikel ini menjelaskan kemampuan yang didukung oleh plugin MaxCompute versi baru serta alur operasi utamanya.

Latar Belakang Flink CDC

Flink CDC adalah alat integrasi data real-time open source end-to-end yang mendefinisikan serangkaian antarmuka pemrograman dan framework pemrosesan data ETL lengkap. Pengguna dapat memanfaatkan fungsinya dengan mengirimkan job Flink. Untuk informasi selengkapnya, lihat Flink CDC. Flink CDC terintegrasi secara mendalam dengan Apache Flink dan menyediakan fitur inti berikut:

  • Framework integrasi data end-to-end.

  • API yang mudah digunakan untuk membangun job bagi pengguna integrasi data.

  • Dukungan pemrosesan beberapa tabel di Source (sumber data) dan Sink (tujuan keluaran).

  • Sinkronisasi seluruh database (full-database sync).

  • Kemampuan sinkronisasi otomatis perubahan struktur tabel (Schema Evolution).

Prasyarat

Proyek MaxCompute telah dibuat. Untuk detailnya, lihat Membuat Proyek MaxCompute.

Catatan

  • Connector sinkronisasi data mendukung pembuatan tabel otomatis dan melakukan pemetaan otomatis antara lokasi tabel MaxCompute dengan tabel sumber serta tipe datanya. Jika tabel sumber memiliki primary key, sistem akan secara otomatis membuat Delta table; jika tidak, sistem akan membuat tabel biasa MaxCompute. Detail pemetaan dapat dilihat di Pemetaan Lokasi Tabel dan Pemetaan Tipe Data.

  • Saat data ditulis ke tabel biasa, sistem akan mengabaikan operasi DELETE, sedangkan operasi UPDATE akan diperlakukan sebagai operasi INSERT.

  • Saat ini hanya mendukung at-least-once. Namun, karena karakteristik primary key-nya, Delta table dapat mencapai penulisan idempoten.

  • Untuk sinkronisasi perubahan struktur tabel:

  • Kolom baru hanya dapat ditambahkan di akhir kolom.

  • Perubahan tipe kolom hanya dapat dilakukan ke tipe data yang kompatibel. Untuk detail tabel kompatibilitas tipe data, lihat ALTER TABLE.

Mulai Cepat

Artikel ini akan memandu Anda membangun job Streaming ETL dari MySQL ke MaxCompute berbasis Flink CDC (MySQL to MaxCompute), termasuk implementasi pipeline Flink CDC yang mencakup sinkronisasi seluruh database, sinkronisasi perubahan struktur tabel, serta sinkronisasi multi-database dan multi-tabel.

Persiapan Lingkungan

Menyiapkan Kluster Flink Standalone

  1. Unduh flink-1.18.0-bin-scala_2.12.tgz dan ekstrak. Setelah diekstrak, Anda akan mendapatkan direktori flink-1.18.0. Masuk ke direktori tersebut dan jalankan perintah berikut untuk mengatur FLINK_HOME ke direktori instalasi flink-1.18.0.

    export FLINK_HOME=$(pwd)
  2. Di direktori $flink-1.18.0/conf, jalankan perintah vim flink-conf.yaml, lalu tambahkan parameter berikut ke file konfigurasi dan simpan.

    # Aktifkan checkpoint, lakukan checkpoint setiap 3 detik
    # Hanya untuk pengujian. Interval checkpoint pada job produksi sebaiknya tidak kurang dari 30 detik
    execution.checkpointing.interval: 3000
    
    # Karena flink-cdc-pipeline-connector-maxcompute bergantung pada mekanisme komunikasi Flink untuk sinkronisasi penulisan,
    # timeout komunikasi pesan diperbesar secara wajar
    pekko.ask.timeout: 60s
  3. Jalankan perintah berikut untuk memulai kluster Flink.

    ./bin/start-cluster.sh

    Jika berhasil, Anda dapat mengakses Flink Web UI di http://localhost:8081/ (8081 adalah port default).

    Menjalankan start-cluster.sh beberapa kali akan memunculkan beberapa TaskManager untuk eksekusi konkuren.

Menyiapkan Lingkungan MySQL

Berikut ini contoh persiapan lingkungan MySQL menggunakan Docker Compose.

  1. Setelah menjalankan image Docker, buat file bernama docker-compose.yaml dengan isi sebagai berikut:

    version: '2.1'
    services:
      mysql:
        image: debezium/example-mysql:1.1
        ports:
          - "3306:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=123456
          - MYSQL_USER=mysqluser
          - MYSQL_PASSWORD=mysqlpw

    Penjelasan parameter:

    Parameter

    Deskripsi

    version

    Versi Docker.

    image

    Versi image, diatur sebagai debezium/example-mysql:1.1.

    ports

    Nomor port MySQL.

    environment

    Akun dan kata sandi MySQL.

    Kontainer dalam Docker Compose ini mencakup: MySQL—database app_db yang berisi informasi produk.

  2. Di direktori tempat docker-compose.yaml berada, jalankan perintah berikut untuk memulai komponen yang diperlukan:

    docker-compose up -d

    Perintah ini akan secara otomatis memulai semua kontainer yang didefinisikan dalam konfigurasi Docker Compose dalam mode Detached. Anda dapat menjalankan perintah docker ps untuk memverifikasi apakah kontainer tersebut telah berjalan normal.

Menyiapkan Data di Database MySQL

  1. Jalankan perintah berikut untuk masuk ke kontainer MySQL.

    docker-compose exec mysql mysql -uroot -p123456
  2. Buat database dan siapkan data tabel di MySQL.

    1. Buat database.

      CREATE DATABASE app_db;
      USE app_db;
    2. Siapkan data tabel.

      • Buat tabel orders dan masukkan data.

        CREATE TABLE `orders` (
        `id` INT NOT NULL,
        `price` DECIMAL(10,2) NOT NULL,
        PRIMARY KEY (`id`)
        );
        
        -- Masukkan data
        INSERT INTO `orders` (`id`, `price`) VALUES (1, 4.00);
        INSERT INTO `orders` (`id`, `price`) VALUES (2, 100.00);
      • Buat tabel shipments dan masukkan data.

        CREATE TABLE `shipments` (
        `id` INT NOT NULL,
        `city` VARCHAR(255) NOT NULL,
        PRIMARY KEY (`id`)
        );
        
        -- Masukkan data
        INSERT INTO `shipments` (`id`, `city`) VALUES (1, 'beijing');
        INSERT INTO `shipments` (`id`, `city`) VALUES (2, 'xian');
      • Buat tabel products dan masukkan data.

        -- 
        CREATE TABLE `products` (
        `id` INT NOT NULL,
        `product` VARCHAR(255) NOT NULL,
        PRIMARY KEY (`id`)
        );
        
        -- Masukkan data
        INSERT INTO `products` (`id`, `product`) VALUES (1, 'Beer');
        INSERT INTO `products` (`id`, `product`) VALUES (2, 'Cap');
        INSERT INTO `products` (`id`, `product`) VALUES (3, 'Peanut');

Mengirimkan Tugas melalui Flink CDC CLI

  1. Unduh paket JAR yang diperlukan:

    • Paket flink-cdc

      Masuk ke flink-cdc untuk mengunduh arsip biner flink-cdc-3.1.1-bin.tar.gz, lalu ekstrak untuk mendapatkan direktori flink-cdc-3.1.1 yang berisi empat subdirektori: bin, lib, log, dan conf. Pindahkan file dari keempat direktori tersebut ke direktori flink-1.18.0 yang sesuai.

    • Paket Connector

      Unduh paket Connector berikut dan pindahkan ke direktori flink-1.18.0/lib.

      Catatan

      Tautan unduh hanya berlaku untuk versi yang telah dirilis. Versi SNAPSHOT harus dikompilasi secara lokal dari branch master atau release.

    • Paket Driver

      Unduh paket MySQL Connector Java, lalu sertakan melalui parameter --jar saat menjalankan Flink CDC CLI, atau letakkan di direktori $flink-1.18.0/lib dan mulai ulang kluster Flink, karena CDC Connectors tidak lagi menyertakan driver-driver tersebut.

  2. Buat file konfigurasi tugas dalam format YAML. Berikut contoh file sinkronisasi seluruh database mysql-to-maxcompute.yaml:

    ################################################################################
    # Deskripsi: Sinkronkan semua tabel MySQL ke MaxCompute
    ################################################################################
    source:
      type: mysql
      hostname: localhost
      port: 3306
      username: root
      password: 123456
      tables: app_db.\.*
      server-id: 5400-5404
      server-time-zone: UTC
    
    # accessId, accessKey, endpoint, project harus diisi oleh pengguna
    sink:
       type: maxcompute
       name: MaxComputeSink
       accessId: ${your_accessId}
       accessKey: ${your_accessKey}
       endpoint: ${your_maxcompute_endpoint}
       project: ${your_project}
       bucketsNum: 8
    
    pipeline:
      name: Sync MySQL Database to MaxCompute
      parallelism: 1
    

    Penjelasan parameter:

  3. Jalankan perintah berikut untuk mengirimkan tugas ke kluster Flink Standalone.

    ./bin/flink-cdc.sh mysql-to-maxcompute.yaml

    Jika berhasil, Anda akan menerima respons berikut:

    Pipeline has been submitted to cluster.
    Job ID: f9f9689866946e25bf151ecc179ef46f
    Job Description: Sync MySQL Database to MaxCompute

    Di Flink Web UI, Anda akan melihat tugas bernama Sync MySQL Database to MaxCompute sedang berjalan.

  4. Di MaxCompute, jalankan SQL berikut untuk memverifikasi apakah ketiga tabel orders, shipments, dan products telah berhasil dibuat dan dapat menerima data.

    -- Lihat tabel orders
    read orders;
    
    -- Hasil:
    +------------+------------+
    | id         | price      |
    +------------+------------+
    | 1          | 4          |
    | 2          | 100        |
    +------------+------------+
    
    -- Lihat tabel shipments
    read shipments;
    
    -- Hasil
    +------------+------------+
    | id         | city       |
    +------------+------------+
    | 1          | beijing    |
    | 2          | xian       |
    +------------+------------+
    
    -- Lihat tabel products
    read products;
    
    -- Hasil
    +------------+------------+
    | id         | product    |
    +------------+------------+
    | 3          | Peanut     |
    | 1          | Beer       |
    | 2          | Cap        |
    +------------+------------+

Sinkronisasi Operasi Perubahan

Berikut ini contoh menggunakan tabel orders untuk menunjukkan bahwa saat data tabel sumber di database MySQL diubah, data tabel tujuan yang sesuai di MaxCompute juga akan diperbarui secara real-time.

  1. Jalankan perintah berikut untuk masuk ke kontainer MySQL.

    docker-compose exec mysql mysql -uroot -p123456
  2. Masukkan satu baris data ke tabel orders di MySQL.

    INSERT INTO app_db.orders (id, price) VALUES (3, 100.00);

    Di MaxCompute, jalankan perintah read orders; untuk memeriksa data tabel orders. Hasilnya sebagai berikut:

    +------------+------------+
    | id         | price      |
    +------------+------------+
    | 3          | 100        |
    | 1          | 4          |
    | 2          | 100        |
    +------------+------------+
  3. Tambahkan satu kolom ke tabel orders di MySQL.

    ALTER TABLE app_db.orders ADD amount varchar(100) NULL;

    Di MaxCompute, jalankan perintah read orders; untuk memeriksa data tabel orders. Hasilnya sebagai berikut:

    +------------+------------+------------+
    | id         | price      | amount     |
    +------------+------------+------------+
    | 3          | 100        | NULL       |
    | 1          | 4          | NULL       |
    | 2          | 100        | NULL       |
    +------------+------------+------------+
  4. Perbarui satu baris data di tabel orders MySQL.

    UPDATE app_db.orders SET price=100.00, amount=100.00 WHERE id=1;

    Di MaxCompute, jalankan perintah read orders; untuk memeriksa data tabel orders. Hasilnya sebagai berikut:

    +------------+------------+------------+
    | id         | price      | amount     |
    +------------+------------+------------+
    | 3          | 100        | NULL       |
    | 1          | 100        | 100.00     |
    | 2          | 100        | NULL       |
    +------------+------------+------------+
  5. Hapus satu baris data dari tabel orders MySQL.

    DELETE FROM app_db.orders WHERE id=2;

    Di MaxCompute, jalankan perintah read orders; untuk memeriksa data tabel orders. Hasilnya sebagai berikut:

    +------------+------------+------------+
    | id         | price      | amount     |
    +------------+------------+------------+
    | 3          | 100        | NULL       |
    | 1          | 100        | 100.00     |
    +------------+------------+------------+

Untuk setiap langkah di atas, setiap kali Anda menjalankan operasi di MySQL, lakukan pratinjau data di MaxCompute. Anda akan melihat bahwa data tabel orders di MaxCompute diperbarui secara real-time.

Operasi Perubahan dengan Polling

Flink CDC menyediakan konfigurasi untuk merutekan struktur tabel atau data sumber ke nama tabel lain. Dengan kemampuan ini, Anda dapat mengganti nama tabel atau database, serta melakukan sinkronisasi seluruh database. Berikut contoh file konfigurasi:

################################################################################
# Deskripsi: Sinkronkan semua tabel MySQL ke MaxCompute
################################################################################
source:
   type: mysql
   hostname: localhost
   port: 3306
   username: root
   password: 123456
   tables: app_db.\.*
   server-id: 5400-5404
   server-time-zone: UTC

# accessId, accessKey, endpoint, project harus diisi oleh pengguna
sink:
   type: maxcompute
   name: MaxComputeSink
   accessId: ${your_accessId}
   accessKey: ${your_accessKey}
   endpoint: ${your_maxcompute_endpoint}
   project: ${your_project}
   bucketsNum: 8

route:
   - source-table: app_db.orders
     sink-table: ods_db.ods_orders
   - source-table: app_db.shipments
     sink-table: ods_db.ods_shipments
   - source-table: app_db.products
     sink-table: ods_db.ods_products

pipeline:
   name: Sync MySQL Database to MaxCompute
   parallelism: 1

Detail parameter bagian route dapat dilihat di Flink CDC Route.

Dengan konfigurasi route di atas, struktur dan data tabel app_db.orders akan disinkronkan ke ods_db.ods_orders, sehingga mencapai fungsi migrasi database. Secara khusus, source-table mendukung pencocokan regex untuk beberapa tabel, memungkinkan sinkronisasi multi-database dan multi-tabel. Contohnya seperti konfigurasi berikut:

route:
  - source-table: app_db.order\.*
    sink-table: ods_db.ods_orders

Dengan demikian, data dari tabel seperti app_db.order01, app_db.order02, dan app_db.order03 dapat digabungkan ke dalam ods_db.ods_orders.

Catatan

Saat ini skenario data dengan primary key yang sama di beberapa tabel belum didukung, tetapi akan didukung di rilis mendatang.

Pembersihan Lingkungan

Setelah menyelesaikan operasi di atas, Anda perlu membersihkan lingkungan.

  1. Di direktori tempat file docker-compose.yml berada, jalankan perintah berikut untuk menghentikan semua kontainer:

    docker-compose down
  2. Di direktori Flink flink-1.18.0, jalankan perintah berikut untuk menghentikan kluster Flink:

    ./bin/stop-cluster.sh

Lampiran

Opsi Konfigurasi Connector

Item Konfigurasi

Wajib Diisi

Nilai Default

Tipe

Deskripsi

type

Ya

none

String

Menentukan connector yang akan digunakan. Di sini harus diatur sebagai maxcompute.

name

Tidak

none

String

Nama Sink.

accessId

Ya

none

String

ID AccessKey akun Alibaba Cloud atau pengguna RAM. Anda dapat memperoleh ID AccessKey di halaman manajemen AccessKey.

accessKey

Ya

none

String

AccessKey Secret yang sesuai dengan ID AccessKey.

endpoint

Ya

none

String

Alamat koneksi layanan MaxCompute. Anda harus mengonfigurasi Endpoint sesuai dengan wilayah dan metode koneksi jaringan yang dipilih saat membuat proyek MaxCompute. Nilai Endpoint untuk berbagai wilayah dan jaringan dapat dilihat di Endpoint.

project

Ya

none

String

Nama proyek MaxCompute. Anda dapat masuk ke Konsol MaxCompute, lalu membuka halaman Workspace>Projects untuk memperoleh nama proyek MaxCompute.

tunnelEndpoint

Tidak

none

String

Alamat koneksi layanan MaxCompute Tunnel. Biasanya konfigurasi ini akan secara otomatis dirutekan berdasarkan wilayah proyek yang ditentukan. Gunakan opsi ini hanya dalam lingkungan jaringan khusus seperti saat menggunakan proxy.

quotaName

Tidak

none

String

Nama resource group eksklusif yang digunakan untuk transfer data MaxCompute. Jika tidak ditentukan, sistem akan menggunakan resource group bersama. Untuk detailnya, lihat Membeli dan Menggunakan Resource Group Layanan Transfer Data Eksklusif.

stsToken

Tidak

none

String

Parameter ini harus ditentukan saat menggunakan token akses jangka pendek (STS Token) yang dikeluarkan oleh peran RAM untuk autentikasi.

bucketsNum

Tidak

16

Integer

Jumlah bucket yang digunakan saat membuat tabel Delta MaxCompute secara otomatis. Cara penggunaannya dapat dilihat di Ikhtisar Gudang Data Near-Real-Time.

compressAlgorithm

Tidak

zlib

String

Algoritma kompresi data yang digunakan saat menulis ke MaxCompute. Saat ini mendukung raw (tanpa kompresi), zlib, dan snappy.

totalBatchSize

Tidak

64MB

String

Ukuran data yang di-buffer di memori, dalam satuan partisi (untuk tabel non-partisi, satuan adalah tabel). Buffer untuk partisi (tabel) berbeda saling independen. Data akan ditulis ke MaxCompute setelah mencapai ambang batas.

bucketBatchSize

Tidak

4MB

String

Ukuran data yang di-buffer di memori, dalam satuan bucket. Opsi ini hanya berlaku saat menulis ke Delta table. Buffer untuk bucket data berbeda saling independen. Data bucket tersebut akan ditulis ke MaxCompute setelah mencapai ambang batas.

numCommitThreads

Tidak

16

Integer

Jumlah partisi (tabel) yang dapat diproses secara bersamaan selama fase Checkpoint.

numFlushConcurrent

Tidak

4

Integer

Jumlah bucket yang dapat ditulis secara bersamaan ke MaxCompute. Opsi ini hanya berlaku saat menulis ke Delta table.

retryTimes

Tidak

3

Integer

Jumlah percobaan ulang saat terjadi kesalahan koneksi jaringan.

sleepMillis

Tidak

true

Long

Waktu tunggu antar percobaan ulang saat terjadi kesalahan koneksi jaringan, dalam satuan milidetik.

Pemetaan Lokasi Tabel

Saat Connector membuat tabel secara otomatis, hubungan pemetaan berikut digunakan untuk memetakan informasi lokasi tabel sumber ke tabel MaxCompute.

Penting

Jika proyek MaxCompute tidak mendukung model Schema, setiap tugas sinkronisasi hanya dapat menyinkronkan satu Database MySQL. (Aturan yang sama berlaku untuk sumber data lainnya; Connector akan mengabaikan informasi tableId.namespace.)

Objek dalam Flink CDC

Lokasi MaxCompute

Lokasi MySQL

project dalam file konfigurasi

Project

none

TableId.namespace

Schema (hanya berlaku jika proyek MaxCompute mendukung model Schema; jika tidak, konfigurasi ini akan diabaikan)

Database

TableId.tableName

Table

Table

Pemetaan Tipe Data

Tipe Flink

Tipe MaxCompute

CHAR/VARCHAR

STRING

BOOLEAN

BOOLEAN

BINARY/VARBINARY

BINARY

DECIMAL

DECIMAL

TINYINT

TINYINT

SMALLINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

FLOAT

FLOAT

DOUBLE

DOUBLE

TIME_WITHOUT_TIME_ZONE

STRING

DATE

DATE

TIMESTAMP_WITHOUT_TIME_ZONE

TIMESTAMP_NTZ

TIMESTAMP_WITH_LOCAL_TIME_ZONE

TIMESTAMP

TIMESTAMP_WITH_TIME_ZONE

TIMESTAMP

ARRAY

ARRAY

MAP

MAP

ROW

STRUCT