Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:Flink ile veri içe aktarma

Son Güncelleme:Oct 08, 2026

ApsaraDB for SelectDB Apache Doris ile tam uyumludur. Flink Doris Connector kullanarak MySQL, Oracle, PostgreSQL, SQL Server ve Kafka gibi veri kaynaklarından geçmiş verileri SelectDB hizmetine aktarabilirsiniz. Flink'te bir değişen veri yakalama (CDC) görevini başlattığınızda, bu görev veri kaynağındaki artımlı verileri de SelectDB hizmetine eşitler.

Genel Bakış

Not

Flink Doris Connector şu anda yalnızca SelectDB hizmetine veri yazmayı destekler. Verileri verimli bir şekilde okumak için Flink Doris Connector aracılığıyla SelectDB arka uç düğümlerine doğrudan bağlanmanız gerekiyorsa erişim talebinde bulunmak üzere SelectDB teknik destek ekibiyle iletişime geçin.

SelectDB hizmetinden veri okumak için Flink JDBC Connector bileşenini de kullanabilirsiniz.

Flink Doris Connector, Flink'in gerçek zamanlı veri işleme ve analiz için Apache Doris'ten veri okumasını ve buraya veri yazmasını sağlar. SelectDB hizmeti Apache Doris ile tam uyumlu olduğundan bu konektör, SelectDB hizmetine veri akışı sağlamak için yaygın olarak kullanılan bir yöntemdir.

Her bileşenin işlevi aşağıdaki gibidir:

  • Kaynak (Source)

    • Amaç: Kaynak, verileri harici sistemlerden bir Flink veri akışına okur. Bu sistemler arasında mesaj kuyruğu (Apache Kafka gibi), veritabanı veya dosya sistemi bulunabilir.

    • Örnek: Gerçek zamanlı mesajları okumak için Kafka'yı kaynak olarak kullanın veya bir dosyadan veri okuyun.

  • Dönüştürme (Transform)

    • Amaç: Dönüştürme aşaması gelen veri akışını işler. Bu işlemler arasında filtreleme, eşleme, toplama ve pencereleme bulunur.

    • Örnek: Bir giriş akışının veri yapısını dönüştürmek için eşleme işlemi uygulayın veya dakikada bir ölçüm hesaplamak için verileri toplayın.

  • Hedef (Sink)

    • Amaç: Hedef, işlenen verileri bir Flink veri akışından veritabanı, dosya veya mesaj kuyruğu gibi harici bir sisteme yazar.

    • Örnek: İşlenmiş sonuçları bir MySQL veritabanına yazın veya verileri başka bir Kafka konusuna gönderin.

Aşağıdaki şekil, Flink Doris Connector kullanılarak verilerin SelectDB hizmetine nasıl aktarıldığını gösterir.

image

Ön Koşullar

  • Veri kaynağınız, Flink ve SelectDB hizmeti arasında ağ bağlantısı olduğundan emin olun.

    1. ApsaraDB for SelectDB örneğiniz için bir genel uç nokta talep edin. Daha fazla bilgi için bkz. Genel uç nokta talep etme veya serbest bırakma.

      Flink ortamınız ve veri kaynağınız, ApsaraDB for SelectDB örneğinizle aynı sanal özel bulut (VPC) içindeyse bu adımı atlayın. Bu durum, bunların Alibaba Cloud ürünleri olması veya aynı VPC içindeki Elastic Compute Service (ECS) örneklerine dağıtılmış olması durumunda tipiktir.

    2. Flink ortamınızın ve veri kaynağınızın IP adreslerini ApsaraDB for SelectDB örneğinizin izin listesine ekleyin. Daha fazla bilgi için bkz. IP adresi izin listesi yapılandırma.

  • Flink Doris Connector bileşeninin yüklü olduğundan emin olun.

    Aşağıdaki tabloda Flink ve Flink Doris Connector için sürüm gereksinimleri listelenmiştir.


    Flink sürümü


    Flink Doris Connector sürümü


    İndirme bağlantısı

    Realtime Compute for Apache Flink: 1,17 veya üzeri

    Açık kaynaklı Flink: 1,15 veya üzeri


    1.5.2 veya üzeri. En son sürümü indirmeniz önerilir.


    Flink Doris Connector

    Kurulum talimatları için bkz. Flink Doris Connector yükleme.

Flink Doris Connector ekleme

Ortamınıza bağlı olarak Flink Doris Connector bileşenini ekleyin.

  • Verileri SelectDB hizmetine aktarmak için Realtime Compute for Apache Flink kullanıyorsanız Flink Doris Connector bileşenini özel konektör olarak yönetebilirsiniz. Ayrıntılar için bkz. Özel konektörleri yönetme.

  • Kendi yönettiğiniz bir Flink kümesi kullanıyorsanız ilgili Flink Doris Connector JAR paketini indirin ve Flink kurulumunuzun lib dizinine yerleştirin. İndirme bağlantısı için bkz. JAR Paketi.

  • Flink Doris Connector bileşenini Maven bağımlılığı olarak eklemek için projenizin bağımlılık yapılandırma dosyasına aşağıdaki kodu ekleyin. Diğer sürümler için bkz. Maven Deposu.

    <!-- flink-doris-connector -->
    <dependency>
      <groupId>org.apache.doris</groupId>
      <artifactId>flink-doris-connector-1.16</artifactId>
      <version>1.5.2</version>
    </dependency>  

Örnekler

Örnek ortam

Bu örnekte, bir ApsaraDB RDS for MySQL örneğindeki test veritabanındaki employees tablosundan SelectDB örneğindeki test veritabanındaki employees tablosuna veri geçirmek için Flink SQL, Flink CDC ve DataStream API kullanılır. Bu örneklerdeki parametreleri senaryonuza uygun şekilde değiştirin. Örnek ortam aşağıdaki gibidir:

  • Flink 1.16 tek başına (standalone) ortam

  • Java

  • Hedef veritabanı: test

  • Hedef tablo: employees

  • Kaynak veritabanı: test

  • Kaynak tablo: employees

Ortamı hazırlama

Flink ortamı

  1. Java ortamını hazırlayın.

    Flink'in çalışması için Java ortamı gerekir. Java Development Kit (JDK) yüklemeniz ve JAVA_HOME ortam değişkenini yapılandırmanız gerekir.

    Desteklenen Java sürümlerinin listesi için bkz. Java Uyumluluğu. Bu örnekte Java 8 kullanılır. Kurulum talimatları için bkz. JDK yükleme.

  2. Flink kurulum paketini (flink-1.16.3-bin-scala_2.12.tgz) indirin. Bu sürüm güncel değilse başka bir sürümü Apache Flink adresinden indirebilirsiniz.

    wget https://www.apache.si/flink/flink-1.16.3/flink-1.16.3-bin-scala_2.12.tgz
  3. Kurulum paketini açın.

    tar -zxvf flink-1.16.3-bin-scala_2.12.tgz
  4. Flink kurulum dizinindeki lib dizinine gidin ve sonraki adımlar için gerekli konektörleri ekleyin.

    • Flink Doris Connector bileşenini ekleyin.

      wget https://repo.maven.apache.org/maven2/org/apache/doris/flink-doris-connector-1.16/1.5.2/flink-doris-connector-1.16-1.5.2.jar
    • Flink MySQL Connector bileşenini ekleyin.

      wget https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.4.2/flink-sql-connector-mysql-cdc-2.4.2.jar
  5. Flink kümesini başlatın.

    Flink kurulumunuzun bin dizininde aşağıdaki komutu çalıştırın:

    ./start-cluster.sh 

Hedef SelectDB

  1. Bir ApsaraDB for SelectDB örneği oluşturun. Daha fazla bilgi için bkz. Örnek oluşturma.

  2. Örneğe bağlanın. Daha fazla bilgi için bkz. Örneğe bağlanma.

  3. test adlı bir test veritabanı oluşturun.

    CREATE DATABASE test;
  4. employees adlı bir test tablosu oluşturun.

    USE test;
    
    -- Create table
    CREATE TABLE employees (
        emp_no       int NOT NULL,
        birth_date   date,
        first_name   varchar(20),
        last_name    varchar(20),
        gender       char(2),
        hire_date    date
    )
    UNIQUE KEY(`emp_no`)
    DISTRIBUTED BY HASH(`emp_no`) BUCKETS 1;

Kaynak MySQL

  1. Bir ApsaraDB RDS for MySQL örneği oluşturun.

  2. test adlı bir test veritabanı oluşturun.

    CREATE DATABASE test;
  3. employees adlı bir test tablosu oluşturun.

    USE test;
    
    CREATE TABLE employees (
        emp_no INT NOT NULL PRIMARY KEY,
        birth_date DATE,
        first_name VARCHAR(20),
        last_name VARCHAR(20),
        gender CHAR(2),
        hire_date DATE
    );
  4. Veri ekleyin.

    INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES
    (1001, '1985-05-15', 'John', 'Doe', 'M', '2010-06-20'),
    (1002, '1990-08-22', 'Jane', 'Smith', 'F', '2012-03-15'),
    (1003, '1987-11-02', 'Robert', 'Johnson', 'M', '2015-07-30'),
    (1004, '1992-01-18', 'Emily', 'Davis', 'F', '2018-01-05'),
    (1005, '1980-12-09', 'Michael', 'Brown', 'M', '2008-11-21');

Flink SQL ile içe aktarma

  1. Flink SQL Client istemcisini başlatın.

    Flink kurulumunuzun bin dizininde aşağıdaki komutu çalıştırın:

    ./sql-client.sh
  2. Flink SQL Client istemcisinde bir Flink işi gönderin.

    1. Bir MySQL kaynak tablosu oluşturun.

      Aşağıdaki ifadedeki WITH yan tümcesi, MySQL CDC Source kaynağı için yapılandırmayı belirtir. Parametreler hakkında daha fazla bilgi için bkz. MySQL | Apache Flink CDC.

      CREATE TABLE employees_source (
          emp_no INT,
          birth_date DATE,
          first_name STRING,
          last_name STRING,
          gender STRING,
          hire_date DATE,
          PRIMARY KEY (`emp_no`) NOT ENFORCED
      ) WITH (
          'connector' = 'mysql-cdc',
          'hostname' = '127.0.0.1', 
          'port' = '3306',
          'username' = 'root',
          'password' = '****',
          'database-name' = 'test',
          'table-name' = 'employees'
      );
    2. Bir SelectDB hedef tablosu oluşturun.

      Aşağıdaki ifadedeki WITH yan tümcesi, SelectDB hizmeti için yapılandırmayı belirtir. Parametreler hakkında daha fazla bilgi için bkz. Hedef parametreleri.

      CREATE TABLE employees_sink (
          emp_no       INT ,
          birth_date   DATE,
          first_name   STRING,
          last_name    STRING,
          gender       STRING,
          hire_date    DATE
      ) 
      WITH (
        'connector' = 'doris',
        'fenodes' = 'selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080',
        'table.identifier' = 'test.employees',
        'username' = 'admin',
        'password' = '****'
      );
    3. Verileri MySQL kaynak tablosundan SelectDB hedef tablosuna eşitleyin.

      INSERT INTO employees_sink SELECT * FROM employees_source;
  3. Veri aktarımını doğrulayın.

    SelectDB hizmetine bağlanın ve aktarılan verileri görüntülemek için aşağıdaki ifadeyi çalıştırın.

    SELECT * FROM test.employees;

Flink CDC ile içe aktarma

Önemli

Realtime Compute for Apache Flink, JAR tabanlı işleri desteklemez. Bunun yerine CDC 3.0 ile YAML tabanlı işleri kullanın.

Verileri SelectDB hizmetine aktarmak için Flink CDC kullanın.

Bir Flink CDC işini çalıştırmak için Flink kurulum dizininizdeki flink programını kullanın. Söz dizimi aşağıdaki gibidir:

<FLINK_HOME>/bin/flink run \
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=1 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    lib/flink-doris-connector-1.16-1.5.2.jar \
    <mysql-sync-database|oracle-sync-database|postgres-sync-database|sqlserver-sync-database> \
    --database <selectdb-database-name> \
    [--job-name <flink-job-name>] \
    [--table-prefix <selectdb-table-prefix>] \
    [--table-suffix <selectdb-table-suffix>] \
    [--including-tables <mysql-table-name|name-regular-expr>] \
    [--excluding-tables <mysql-table-name|name-regular-expr>] \
    --mysql-conf <mysql-cdc-source-conf> [--mysql-conf <mysql-cdc-source-conf> ...] \
    --oracle-conf <oracle-cdc-source-conf> [--oracle-conf <oracle-cdc-source-conf> ...] \
    --sink-conf <doris-sink-conf> [--table-conf <doris-sink-conf> ...] \
    [--table-conf <selectdb-table-conf> [--table-conf <selectdb-table-conf> ...]]

Parametreler


Parametre


Açıklama


execution.checkpointing.interval


Flink kontrol noktası aralığı. Bu ayar, veri eşitleme sıklığını etkiler. 10s değeri önerilir.


parallelism.default


Flink işinin paralellik düzeyi. Paralellik düzeyini artırmak veri eşitleme hızını artırabilir.


job-name


Flink işinin adı.


database


SelectDB hizmetindeki hedef veritabanının adı.


table-prefix


SelectDB hizmetindeki hedef tablo adı ön eki. Örneğin, --table-prefix ods_.


table-suffix


SelectDB hizmetindeki hedef tablo adı son eki.


including-tables


Eşitlenecek tablolar. Birden çok tabloyu ayırmak için dikey çubuk | kullanın. Normal ifadeler desteklenir. Örneğin, --including-tables table1|tbl.* ifadesi table1 tablosunu ve tbl ile başlayan tüm tabloları eşitler.


excluding-tables


Eşitlemeden hariç tutulacak tablolar. Biçim, including-tables parametresiyle aynıdır.


mysql-conf


MySQL CDC Kaynağı için yapılandırma. Daha fazla bilgi için bkz. MySQL CDC Konektörü. hostname, username, password ve database-name parametreleri zorunludur.


oracle-conf


Oracle CDC Kaynağı için yapılandırma. Daha fazla bilgi için bkz. Oracle CDC Konektörü. hostname, username, password, database-name ve schema-name parametreleri zorunludur.


sink-conf


Doris Hedefi için yapılandırma parametreleri. Daha fazla bilgi için bkz. Hedef parametreleri.


table-conf


SelectDB tablosu için yapılandırma parametreleri. Bunlar, SelectDB hizmetinde tablo oluştururken PROPERTIES yan tümcesinin içeriğine karşılık gelir.

Not
  1. Veri eşitleme için gerekli Flink CDC bağımlılığını (flink-sql-connector-mysql-cdc-${version}.jar veya flink-sql-connector-oracle-cdc-${version}.jar gibi) $FLINK_HOME/lib dizinine ekleyin.

  2. Tam veritabanı eşitleme, Flink 1.15 ve sonraki sürümlerde desteklenir. Flink Doris Connector bileşeninin farklı sürümlerini indirmek için bkz. Flink Doris Connector.

Hedef parametreleri

Parametre

Varsayılan

Zorunlu

Açıklama

fenodes

Yok

Evet

ApsaraDB for SelectDB örneğinizin uç noktası ve HTTP bağlantı noktası.

ApsaraDB for SelectDB konsolundaki Instance Details > Network Information sayfasından VPC Endpoint (veya Public Endpoint) ve HTTP Port değerlerini alabilirsiniz.

Örnek: selectdb-cn-4xl3jv1****.selectdbfe.rds.aliyuncs.com:8080.

table.identifier

Yok

Evet

Veritabanı ve tablo adı. Örnek: test_db.test_table.

username

Yok

Evet

ApsaraDB for SelectDB örneğiniz için veritabanı kullanıcı adı.

password

Yok

Evet

ApsaraDB for SelectDB örneğinizin veritabanı kullanıcısı parolası.

jdbc-url

Yok

Hayır

ApsaraDB for SelectDB örneğiniz için JDBC bağlantı bilgileri.

ApsaraDB for SelectDB konsolundaki Instance Details > Network Information sayfasından VPC Endpoint (veya Public Endpoint) ve MySQL Port değerlerini alabilirsiniz.

Örnek: jdbc:mysql://selectdb-cn-4xl3jv1****.selectdbfe.rds.aliyuncs.com:9030.

auto-redirect

true

Hayır

Stream Load isteklerinin yeniden yönlendirilip yönlendirilmeyeceğini belirtir. Etkinleştirildiğinde Stream Load, verileri ön uçlar (FE'ler) üzerinden yazar ve arka uç (BE) bilgileri alınmaz.

doris.request.retries

3

Hayır

SelectDB hizmetine istek gönderme deneme sayısı.

doris.request.connect.timeout

30s

Hayır

SelectDB hizmetine bağlanma zaman aşımı.

doris.request.read.timeout

30s

Hayır

SelectDB hizmetinden veri okuma zaman aşımı.

sink.label-prefix

""

Evet

Stream Load içe aktarmaları için etiket ön eki. İki aşamalı commit (2PC) senaryosunda Flink'in tam olarak bir kez işleme (EOS) semantiğini sağlamak için bu ön ek genel olarak benzersiz olmalıdır.

sink.properties

Yok

Hayır

Stream Load için içe aktarma parametreleri. Özellikleri aşağıdaki gibi yapılandırın:

  • CSV formatı için:

    sink.properties.format='csv' 
    sink.properties.column_separator=','
    sink.properties.line_delimiter='\n' 
  • JSON formatı için:

    sink.properties.format='json' 

Diğer parametreler için bkz. Stream Load.

sink.buffer-size

1048576

Hayır

Bayt cinsinden yazma arabelleği boyutu. 1 MB olan varsayılan değer önerilir.

sink.buffer-count

3

Hayır

Yazma arabelleği sayısı. Varsayılan değer önerilir.

sink.max-retries

3

Hayır

Başarısız bir commit işleminden sonra yapılacak maksimum yeniden deneme sayısı. Varsayılan değer 3'tür.

sink.use-cache

false

Hayır

Özel durumlar sırasında kurtarma için bellek içi önbelleğin kullanılıp kullanılmayacağını belirtir. Etkinleştirildiğinde kontrol noktası dönemine ait veriler önbellekte tutulur.

sink.enable-delete

true

Hayır

Silme olaylarının eşitlenip eşitlenmeyeceğini belirtir. Bu seçenek yalnızca Unique Key modelini kullanan tablolar için desteklenir.

sink.enable-2pc

true

Hayır

İki aşamalı commit (2PC) özelliğinin etkinleştirilip etkinleştirilmeyeceğini belirtir. Tam olarak bir kez işleme (EOS) semantiğini sağlamak için varsayılan olarak (true) etkindir.

sink.enable.batch-mode

false

Hayır

Verilerin SelectDB hizmetine toplu modda yazılıp yazılmayacağını belirtir. Etkinleştirildiğinde yazma işlemi, Flink kontrol noktaları yerine sink.buffer-flush.max-rows, sink.buffer-flush.max-bytes ve sink.buffer-flush.interval parametreleriyle tanımlanan arabellek boyutu veya süresine göre tetiklenir.

Toplu mod etkinleştirildiğinde tam olarak bir kez işleme (EOS) semantiği garanti edilmez. Idempotence sağlamak için Unique Key modelini kullanabilirsiniz.

sink.flush.queue-size

2

Hayır

Toplu modda arabellek kuyruğunun boyutu.

sink.buffer-flush.max-rows

50000

Hayır

Toplu modda toplu yazma işlemindeki maksimum satır sayısı.

sink.buffer-flush.max-bytes

10MB

Hayır

Toplu modda toplu yazma işlemindeki maksimum bayt boyutu.

sink.buffer-flush.interval

10s

Hayır

Toplu modda eşzamansız arabellek temizleme aralığı. Minimum değer 1 saniyedir.

sink.ignore.update-before

true

Hayır

update-before olaylarının yoksayılıp yoksayılmayacağını belirtir. Varsayılan olarak bu olaylar yoksayılır.

Eşitleme örnekleri

MySQL eşitleme

<FLINK_HOME>/bin/flink run \
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=1 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    lib/flink-doris-connector-1.16-1.5.2.jar \
    mysql-sync-database \
    --database test \
    --mysql-conf hostname=127.0.0.1 \
    --mysql-conf port=3306 \
    --mysql-conf username=root \
    --mysql-conf password="password" \
    --mysql-conf database-name=test \
    --including-tables "employees" \
    --sink-conf fenodes=selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080 \
    --sink-conf username=admin \
    --sink-conf password=****

Oracle eşitleme

<FLINK_HOME>/bin/flink run \
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=1 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    lib/flink-doris-connector-1.16-1.5.2.jar \
    oracle-sync-database \
    --database test_db \
    --oracle-conf hostname=127.0.0.1 \
    --oracle-conf port=1521 \
    --oracle-conf username=admin \
    --oracle-conf password="password" \
    --oracle-conf database-name=XE \
    --oracle-conf schema-name=ADMIN \
    --including-tables "tbl1|test.*" \
    --sink-conf fenodes=selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080 \
    --sink-conf username=admin \
    --sink-conf password=****

PostgreSQL eşitleme

<FLINK_HOME>/bin/flink run \
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=1 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    lib/flink-doris-connector-1.16-1.5.2.jar \
    postgres-sync-database \
    --database db1\
    --postgres-conf hostname=127.0.0.1 \
    --postgres-conf port=5432 \
    --postgres-conf username=postgres \
    --postgres-conf password="123456" \
    --postgres-conf database-name=postgres \
    --postgres-conf schema-name=public \
    --postgres-conf slot.name=test \
    --postgres-conf decoding.plugin.name=pgoutput \
    --including-tables "tbl1|test.*" \
    --sink-conf fenodes=selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080 \
    --sink-conf username=admin \
    --sink-conf password=****

SQL Server eşitleme

<FLINK_HOME>/bin/flink run \
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=1 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    lib/flink-doris-connector-1.16-1.5.2.jar \
    sqlserver-sync-database \
    --database db1\
    --sqlserver-conf hostname=127.0.0.1 \
    --sqlserver-conf port=1433 \
    --sqlserver-conf username=sa \
    --sqlserver-conf password="123456" \
    --sqlserver-conf database-name=CDC_DB \
    --sqlserver-conf schema-name=dbo \
    --including-tables "tbl1|test.*" \
    --sink-conf fenodes=selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080 \
    --sink-conf username=admin \
    --sink-conf password=****

DataStream API ile içe aktarma

  1. Aşağıdaki bağımlılıkları Maven projenize ekleyin.

    Maven bağımlılıkları

    <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <scala.version>2.12</scala.version>
            <java.version>1.8</java.version>
            <flink.version>1.16.3</flink.version>
            <fastjson.version>1.2.62</fastjson.version>
            <scope.mode>compile</scope.mode>
        </properties>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>28.1-jre</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.14.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.doris</groupId>
                <artifactId>flink-doris-connector-1.16</artifactId>
                <version>1.5.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-table-api-scala-bridge_${scala.version}</artifactId>
                <version>${flink.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-table-planner_${scala.version}</artifactId>
                <version>${flink.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-streaming-scala_${scala.version}</artifactId>
                <version>${flink.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-clients</artifactId>
                <version>${flink.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-connector-jdbc</artifactId>
                <version>${flink.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-connector-kafka</artifactId>
                <version>${flink.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.doris</groupId>
                <artifactId>flink-doris-connector-1.16</artifactId>
                <version>1.5.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.ververica</groupId>
                <artifactId>flink-sql-connector-mysql-cdc</artifactId>
                <version>2.4.2</version>
                <exclusions>
                    <exclusion>
                        <artifactId>flink-shaded-guava</artifactId>
                        <groupId>org.apache.flink</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-runtime-web</artifactId>
                <version>${flink.version}</version>
            </dependency>
    
        </dependencies>
  2. Temel Java kodu.

    Aşağıdaki kod, MySQL kaynak tablosunu ve ApsaraDB for SelectDB hedef tablosunu yapılandırır. Parametreler, Flink SQL kullanarak veri aktarma bölümünde kullanılan parametrelerle eşleşir. Daha fazla bilgi için bkz. MySQL | Apache Flink CDC ve Hedef parametreleri.

    package org.example;
    
    import com.ververica.cdc.connectors.mysql.source.MySqlSource;
    import com.ververica.cdc.connectors.mysql.table.StartupOptions;
    import com.ververica.cdc.connectors.shaded.org.apache.kafka.connect.json.JsonConverterConfig;
    import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
    
    import org.apache.doris.flink.cfg.DorisExecutionOptions;
    import org.apache.doris.flink.cfg.DorisOptions;
    import org.apache.doris.flink.sink.DorisSink;
    import org.apache.doris.flink.sink.writer.serializer.JsonDebeziumSchemaSerializer;
    import org.apache.doris.flink.tools.cdc.mysql.DateToStringConverter;
    import org.apache.flink.api.common.eventtime.WatermarkStrategy;
    import org.apache.flink.streaming.api.datastream.DataStreamSource;
    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
            env.setParallelism(1);
            env.enableCheckpointing(10000);
    
            Map<String, Object> customConverterConfigs = new HashMap<>();
            customConverterConfigs.put(JsonConverterConfig.DECIMAL_FORMAT_CONFIG, "numeric");
            JsonDebeziumDeserializationSchema schema =
                    new JsonDebeziumDeserializationSchema(false, customConverterConfigs);
            
            // Configure the MySQL source table
            MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
                    .hostname("rm-xxx.mysql.rds.aliyuncs***")
                    .port(3306)
                    .startupOptions(StartupOptions.initial())
                    .databaseList("db_test")
                    .tableList("db_test.employees")
                    .username("root")
                    .password("test_123")
                    .debeziumProperties(DateToStringConverter.DEFAULT_PROPS)
                    .deserializer(schema)
                    .serverTimeZone("Asia/Shanghai")
                    .build();
    
            // Configure the ApsaraDB for SelectDB sink table
            DorisSink.Builder<String> sinkBuilder = DorisSink.builder();
            DorisOptions.Builder dorisBuilder = DorisOptions.builder();
            dorisBuilder.setFenodes("selectdb-cn-xxx-public.selectdbfe.rds.aliyunc****:8080")
                    .setTableIdentifier("db_test.employees")
                    .setUsername("admin")
                    .setPassword("test_123");
            DorisOptions dorisOptions = dorisBuilder.build();
    
            // Configure Stream Load parameters with sink.properties
            Properties properties = new Properties();
            properties.setProperty("format", "json");
            properties.setProperty("read_json_by_line", "true");
            DorisExecutionOptions.Builder executionBuilder = DorisExecutionOptions.builder();
            executionBuilder.setStreamLoadProp(properties);
    
            sinkBuilder.setDorisExecutionOptions(executionBuilder.build())
                    .setSerializer(JsonDebeziumSchemaSerializer.builder().setDorisOptions(dorisOptions).build()) // Serialize the data stream.
                    .setDorisOptions(dorisOptions);
    
            DataStreamSource<String> dataStreamSource = env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source");
            dataStreamSource.sinkTo(sinkBuilder.build());
            env.execute("MySQL to SelectDB");
        }
    }

Gelişmiş kullanım

Flink SQL ile kısmi sütunları güncelleme

-- enable checkpoint
SET 'execution.checkpointing.interval' = '10s';

CREATE TABLE cdc_mysql_source (
   id INT
  ,name STRING
  ,bank STRING
  ,age INT
  ,PRIMARY KEY (id) NOT ENFORCED
) WITH (
 'connector' = 'mysql-cdc',
 'hostname' = '127.0.0.1',
 'port' = '3306',
 'username' = 'root',
 'password' = 'password',
 'database-name' = 'database',
 'table-name' = 'table'
);

CREATE TABLE selectdb_sink (
    id INT,
    name STRING,
    bank STRING,
    age INT
) 
WITH (
  'connector' = 'doris',
  'fenodes' = 'selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080',
  'table.identifier' = 'database.table',
  'username' = 'admin',
  'password' = '****',
  'sink.properties.format' = 'json',
  'sink.properties.read_json_by_line' = 'true',
  'sink.properties.columns' = 'id,name,bank,age',
  'sink.properties.partial_columns' = 'true' -- Enable partial column updates.
);

INSERT INTO selectdb_sink SELECT id,name,bank,age FROM cdc_mysql_source;

Flink SQL kullanarak sütuna göre veri silme

CDC senaryolarında Doris hedefi, olay türünü RowKind öğesinden belirler ve silme işlemlerini gerçekleştirmek için gizli sütun __DORIS_DELETE_SIGN__ öğesine bir değer atar. Veri kaynağı Kafka mesajları olduğunda hedef, işlem türünü belirlemek için RowKind öğesini kullanamaz. Bunun yerine mesajdaki belirli bir alana, örneğin {"op_type":"delete",data:{...}} alanına güvenmelidir. op_type değeri 'delete' olan verileri silmek için iş mantığınıza dayalı olarak gizli sütuna açıkça bir değer iletmeniz gerekir. Aşağıdaki Flink SQL örneği, Kafka verilerindeki belirli bir alana dayanarak Alibaba Cloud SelectDB hizmetinde verilerin nasıl silineceğini gösterir.

-- Example message: {"op_type":"delete",data:{"id":1,"name":"zhangsan"}}
CREATE TABLE KAFKA_SOURCE(
  data STRING,
  op_type STRING
) WITH (
  'connector' = 'kafka',
  ...
);

CREATE TABLE SELECTDB_SINK(
  id INT,
  name STRING,
  __DORIS_DELETE_SIGN__ INT
) WITH (
  'connector' = 'doris',
  'fenodes' = 'selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080',
  'table.identifier' = 'db.table',
  'username' = 'admin',
  'password' = '****',
  'sink.enable-delete' = 'false',        -- A value of false indicates that the event type is not inferred from RowKind.
  'sink.properties.columns' = 'id, name, __DORIS_DELETE_SIGN__'  -- Explicitly specify the columns for the Stream Load import.
);

INSERT INTO SELECTDB_SINK
SELECT json_value(data,'$.id') as id,
json_value(data,'$.name') as name, 
if(op_type='delete',1,0) as __DORIS_DELETE_SIGN__ 
FROM KAFKA_SOURCE;

SSS

  • S: BITMAP verileri nasıl yazılır?

    Y: Aşağıdaki örneğe bakın:

    CREATE TABLE bitmap_sink (
      dt INT,
      page STRING,
      user_id INT 
    )
    WITH ( 
      'connector' = 'doris', 
      'fenodes' = 'selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080',
      'table.identifier' = 'test.bitmap_test', 
      'username' = 'admin', 
      'password' = '****', 
      'sink.label-prefix' = 'selectdb_label', 
      'sink.properties.columns' = 'dt,page,user_id,user_id=to_bitmap(user_id)'
    );
  • S: errCode = 2, detailMessage = Label[label_0_1]has already been used, relate to txn[19650] hatası nasıl çözülür?

    Y: Tam olarak bir kez işleme senaryosunda bir Flink işi en son kontrol noktasından veya kaydetme noktasından yeniden başlatılmalıdır. İş eski bir durumdan yeniden başlatılırsa bu hata oluşur. Tam olarak bir kez işleme semantiği gerekmiyorsa sink.enable-2pc=false ayarını yaparak iki aşamalı commit (2PC) özelliğini devre dışı bırakabilir veya farklı bir sink.label-prefix kullanabilirsiniz.

  • S: errCode = 2, detailMessage = transaction[19650]not found hatası nasıl çözülür?

    Y: Bu hata, commit aşamasında oluşur. Kontrol noktasında kaydedilen işlem kimliğinin ApsaraDB for SelectDB hizmetinde süresinin dolduğunu gösterir. Konektör süresi dolmuş bu işlemi commit etmeye çalıştığında sunucu işlemin bulunamadığını bildirir. Bu durumda işi kontrol noktasından yeniden başlatamazsınız. Bu sorunu önlemek için ApsaraDB for SelectDB hizmetindeki streaming_label_keep_max_second parametresini artırın. Varsayılan değer 12 saattir.

  • S: errCode = 2, detailMessage = current running txns on db 10006 is 100, larger than limit 100 hatası nasıl çözülür?

    Y: Bu hata, tek bir veritabanı için eşzamanlı içe aktarma işlemlerinin sayısının sistem sınırı olan 100'ü aştığını gösterir. Bu sorunu çözmek için ApsaraDB for SelectDB hizmetindeki max_running_txn_num_per_db parametresini artırın. Daha fazla bilgi için bkz. max_running_txn_num_per_db.

    Bu hata, etiketi sık sık değiştirip işi yeniden başlattığınızda da oluşabilir. İki aşamalı commit (2PC) senaryolarında (Duplicate Key ve Aggregate Key modelleri için geçerlidir) her iş benzersiz bir etiket gerektirir. Bir iş kontrol noktasından yeniden başlatıldığında Flink yalnızca önceden commit edilmiş ancak henüz commit edilmemiş işlemleri iptal eder. Yeniden başlatmadan önce etiketi sık sık değiştirirseniz birçok önceden commit edilmiş işlem iptal edilmez ve işlem kotasını tüketmeye devam eder. Unique Key modeli için 2PC özelliğini devre dışı bırakabilir ve idempotent yazmalar için hedef operatörünü tasarlayabilirsiniz.

  • S: Unique Key modelini kullanan bir tabloya yazarken bir toplu iş içindeki veri sıralaması nasıl sağlanır?

    Y: Veri sıralamasını sağlamak için bir sıra sütunu yapılandırması ekleyin. Daha fazla bilgi için bkz. SEQUENCE.

  • S: Flink işi hata bildirmese de neden hiçbir veri eşitlenmiyor?

    Y: Bu davranış konektör sürümüne bağlıdır. 1.1.0'dan önceki sürümlerde yazmalar toplu halde ve veriye dayalıdır, bu nedenle yukarı akış kaynağının veri üretip üretmediğini doğrulamanız gerekir. 1.1.0 ve sonraki sürümlerde yazmalar kontrol noktaları tarafından tetiklenir ve veri yazmak için kontrol noktalarını etkinleştirmeniz gerekir.

  • S: tablet writer write failed, tablet_id=190958, txn_id=3505530, err=-235 hatası nasıl çözülür?

    Y: Bu hata genellikle 1.1.0'dan önceki konektör sürümlerinde oluşur. Aşırı yüksek yazma sıklığı nedeniyle tablette çok fazla sürüm oluşturulduğunda bu hata meydana gelir. Bu sorunu çözmek için Stream Load sıklığını azaltmak amacıyla sink.buffer-flush.max-bytes ve sink.buffer-flush.interval parametrelerini artırın.

  • S: Flink içe aktarma sırasında hatalı veriler nasıl atlanır?

    Y: Kaynak veriler, hedef tablonun şemasıyla eşleşmeyen kayıtlar içeriyorsa (örneğin yanlış veri türü veya uzunluğu) Stream Load işi başarısız olur ve Flink sürekli olarak yeniden dener. Bu hatalı verileri atlamak için strict_mode=false,max_filter_ratio=1 ayarını yaparak Stream Load katı modunu devre dışı bırakabilir veya geçersiz verileri hedef operatörüne ulaşmadan önce filtrelemek için bir dönüştürme adımı ekleyebilirsiniz.

  • S: Kaynak tablo, ApsaraDB for SelectDB tablosuyla nasıl eşleştirilmelidir?

    Y: Flink Doris Connector kullanarak veri aktardığınızda aşağıdaki eşleştirmelerin doğru olduğundan emin olun: (1) Kaynak tablodaki sütunlar ve türler Flink SQL ile eşleşmelidir. (2) Flink SQL'deki sütunlar ve türler ApsaraDB for SelectDB tablosuyla eşleşmelidir.

  • S: TApplicationException: get_next failed: out of sequence response: expected 4 but got 3 hatası nasıl çözülür?

    Y: Bu hata, temel Thrift çerçevesindeki bir eşzamanlılık hatasını gösterir. Bu sorunu çözmek için Flink Doris Connector bileşeninin en son sürümüne yükseltin ve uyumlu bir Flink sürümü kullanın.

  • S: DorisRuntimeException: Fail to abort transaction 26153 with urlhttp://192.168.XX.XX hatası nasıl çözülür?

    Y: Bu sorunu teşhis etmek için TaskManager günlüklerinde abort transaction response ifadesini arayın. Günlük girdisindeki HTTP durum kodu, sorunun istemciden mi yoksa sunucudan mı kaynaklandığını gösterir.