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 operasiUPDATEakan diperlakukan sebagai operasiINSERT. -
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
-
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) -
Di direktori
$flink-1.18.0/conf, jalankan perintahvim 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 -
Jalankan perintah berikut untuk memulai kluster Flink.
./bin/start-cluster.shJika 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.
-
Setelah menjalankan image Docker, buat file bernama
docker-compose.yamldengan 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=mysqlpwPenjelasan 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.
-
Di direktori tempat docker-compose.yaml berada, jalankan perintah berikut untuk memulai komponen yang diperlukan:
docker-compose up -dPerintah ini akan secara otomatis memulai semua kontainer yang didefinisikan dalam konfigurasi Docker Compose dalam mode Detached. Anda dapat menjalankan perintah
docker psuntuk memverifikasi apakah kontainer tersebut telah berjalan normal.
Menyiapkan Data di Database MySQL
-
Jalankan perintah berikut untuk masuk ke kontainer MySQL.
docker-compose exec mysql mysql -uroot -p123456 -
Buat database dan siapkan data tabel di MySQL.
-
Buat database.
CREATE DATABASE app_db; USE app_db; -
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
-
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.1yang 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.CatatanTautan 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/libdan mulai ulang kluster Flink, karena CDC Connectors tidak lagi menyertakan driver-driver tersebut.
-
-
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: 1Penjelasan parameter:
-
Detail konfigurasi parameter bagian Source dapat dilihat di Apache Flink CDC MySQL Connector.
-
Cara konfigurasi parameter bagian Sink dapat dilihat di Opsi Konfigurasi Connector.
-
-
Jalankan perintah berikut untuk mengirimkan tugas ke kluster Flink Standalone.
./bin/flink-cdc.sh mysql-to-maxcompute.yamlJika berhasil, Anda akan menerima respons berikut:
Pipeline has been submitted to cluster. Job ID: f9f9689866946e25bf151ecc179ef46f Job Description: Sync MySQL Database to MaxComputeDi Flink Web UI, Anda akan melihat tugas bernama
Sync MySQL Database to MaxComputesedang berjalan. -
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.
-
Jalankan perintah berikut untuk masuk ke kontainer MySQL.
docker-compose exec mysql mysql -uroot -p123456 -
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 | +------------+------------+ -
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 | +------------+------------+------------+ -
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 | +------------+------------+------------+ -
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.
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.
-
Di direktori tempat file docker-compose.yml berada, jalankan perintah berikut untuk menghentikan semua kontainer:
docker-compose down -
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 |
|
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 |
|
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.
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 |