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ış
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.
Ön Koşullar
-
Veri kaynağınız, Flink ve SelectDB hizmeti arasında ağ bağlantısı olduğundan emin olun.
-
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.
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.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 Connectorbileş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 ConnectorJAR paketini indirin ve Flink kurulumunuzunlibdizinine yerleştirin. İndirme bağlantısı için bkz. JAR Paketi.-
Flink Doris Connectorbileş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ı
-
Java ortamını hazırlayın.
Flink'in çalışması için Java ortamı gerekir. Java Development Kit (JDK) yüklemeniz ve
JAVA_HOMEortam 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.
-
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 -
Kurulum paketini açın.
tar -zxvf flink-1.16.3-bin-scala_2.12.tgz -
Flink kurulum dizinindeki
libdizinine 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
-
-
Flink kümesini başlatın.
Flink kurulumunuzun
bindizininde aşağıdaki komutu çalıştırın:./start-cluster.sh
Hedef SelectDB
Bir ApsaraDB for SelectDB örneği oluşturun. Daha fazla bilgi için bkz. Örnek oluşturma.
Örneğe bağlanın. Daha fazla bilgi için bkz. Örneğe bağlanma.
-
testadlı bir test veritabanı oluşturun.CREATE DATABASE test; -
employeesadlı 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
Bir ApsaraDB RDS for MySQL örneği oluşturun.
-
testadlı bir test veritabanı oluşturun.CREATE DATABASE test; -
employeesadlı 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 ); -
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
-
Flink SQL Client istemcisini başlatın.
Flink kurulumunuzun
bindizininde aşağıdaki komutu çalıştırın:./sql-client.sh -
Flink SQL Client istemcisinde bir Flink işi gönderin.
-
Bir MySQL kaynak tablosu oluşturun.
Aşağıdaki ifadedeki
WITHyan tümcesi,MySQL CDC Sourcekaynağı 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' ); -
Bir SelectDB hedef tablosu oluşturun.
Aşağıdaki ifadedeki
WITHyan 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' = '****' ); -
Verileri MySQL kaynak tablosundan SelectDB hedef tablosuna eşitleyin.
INSERT INTO employees_sink SELECT * FROM employees_source;
-
-
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
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
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: |
|
table.identifier |
Yok |
Evet |
Veritabanı ve tablo adı. Örnek: |
|
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: |
|
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:
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 ( |
|
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 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 |
|
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
-
Aşağıdaki bağımlılıkları Maven projenize ekleyin.
Maven bağımlılıkları
-
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:
BITMAPverileri 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=falseayarı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 foundhatası 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_secondparametresini artırın. Varsayılan değer 12 saattir. -
S:
errCode = 2, detailMessage = current running txns on db 10006 is 100, larger than limit 100hatası 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_dbparametresini 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=-235hatası 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-bytesvesink.buffer-flush.intervalparametrelerini 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=1ayarı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 3hatası 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.XXhatası nasıl çözülür?Y: Bu sorunu teşhis etmek için TaskManager günlüklerinde
abort transaction responseifadesini arayın. Günlük girdisindeki HTTP durum kodu, sorunun istemciden mi yoksa sunucudan mı kaynaklandığını gösterir.