Análisis técnico|Doris Connector combinado con Flink CDC para lograr un acceso preciso a la subtabla y subbase de datos de MySQL Exactamente una vez

1. Información general

En el sistema comercial real, para resolver varios problemas causados ​​por la gran cantidad de datos en una sola tabla, generalmente dividimos la tabla de la base de datos por subbase de datos y subtabla para mejorar el rendimiento del sistema.

Sin embargo, esto genera problemas para el análisis de datos posterior. En este momento, generalmente intentamos sincronizar la subbase de datos y las subtablas de la base de datos comercial con el almacén de datos y fusionar los datos de estas subbases de datos y subtablas. en una base de datos y una tabla. Es conveniente para nuestro posterior análisis de datos.

En este documento, demostraremos cómo realizar un acceso eficiente y en tiempo real al almacén de datos de Apache Doris para la subbase de datos y la subtabla de la base de datos MySQL basada en Flink CDC combinado con el envío de dos etapas de Apache Doris Flink Connector y Doris Stream Load.

1.1 ¿Qué es CDC?

CDC es Change Data Capture 变更数据获取la abreviatura de ( ).

La idea central es monitorear y capturar cambios en la base de datos (incluyendo INSERTAR datos o tablas de datos, actualizar ACTUALIZAR, eliminar ELIMINAR, etc.), registrar estos cambios completamente en el orden en que ocurren y escribirlos en el middleware de mensajes para otros servicios. y consumo.

Los escenarios de aplicación de la tecnología CDC también son muy amplios, incluyendo:

● Distribución de datos , distribuye una fuente de datos a múltiples flujos descendentes, a menudo utilizada para desacoplamiento de negocios y microservicios.

Integración de datos , integre fuentes de datos dispersas y heterogéneas en el almacén de datos, elimine islas de datos y facilite el análisis posterior.

Migración de datos , comúnmente utilizada para copias de seguridad de bases de datos, recuperación ante desastres, etc.

1.2 Por qué elegir Flink CDC

La tecnología Change Data Caputre de Flink CDC basada en registros de bases de datos realiza capacidades de lectura integradas completas e incrementales. Con la ayuda de las excelentes capacidades de canalización de Flink y los ricos ecosistemas ascendentes y descendentes, admite la captura de cambios en varias bases de datos, y estos cambios se sincronizan con el almacenamiento descendente. en tiempo real.

Actualmente, el upstream de Flink CDC ya es compatible con MySQL, MariaDB, PG, Oracle, MongoDB, Oceanbase, TiDB, SQLServer y otras bases de datos.

El downstream de Flink CDC es más abundante. Admite la escritura en Kafka, la cola de mensajes Pulsar, Hudi, Iceberg, Doris, etc., y admite la escritura en varios almacenes de datos y lagos de datos.

Al mismo tiempo, a través del mecanismo de registro de cambios admitido de forma nativa por Flink SQL, el procesamiento de datos de CDC se puede hacer muy simple. Los usuarios pueden realizar operaciones como limpieza, ampliación y agregación de datos de bases de datos completos e incrementales a través de SQL, lo que reduce en gran medida el umbral del usuario. Además, la API de Flink DataStream permite a los usuarios escribir código para implementar una lógica personalizada, lo que brinda a los usuarios la libertad de personalizar profundamente los servicios.

El núcleo de la tecnología Flink CDC es admitir la sincronización y el procesamiento de los datos completos y los datos incrementales en la tabla para lograr una coherencia en tiempo real, de modo que los usuarios puedan obtener fácilmente instantáneas coherentes en tiempo real de cada tabla. Por ejemplo, hay datos comerciales históricos completos en una tabla, y los datos comerciales incrementales se escriben y actualizan continuamente. Flink CDC capturará registros de actualización incremental en tiempo real y proporcionará instantáneas que sean consistentes con la base de datos en tiempo real.Si se trata de un registro de actualización, actualizará los datos existentes. Si se inserta el registro, se agregará a los datos existentes.Durante todo el proceso, Flink CDC brinda garantía de consistencia, es decir, no se repetirá ni se perderá.

FLink CDC tiene las siguientes ventajas:

  • Los operadores y módulos SQL de Flink son más maduros y fáciles de usar
  • Los trabajos de Flink pueden ampliar fácilmente la potencia de procesamiento ajustando el paralelismo de los operadores
  • Flink admite backends de estado avanzados (State Backends), lo que permite el acceso a datos de estado masivos
  • Flink proporciona más apoyo ecológico como Source and Sink
  • Flink tiene una base de usuarios más grande y una comunidad de soporte activa, lo que facilita la resolución de problemas

Además, el módulo Flink Table/SQL considera la tabla de la base de datos y el flujo de registro de cambios (como el flujo de datos de CDC) como dos lados de lo mismo, por lo que la estructura del mensaje Upsert se proporciona internamente (que +Irepresenta el nuevo valor, representa -Uel valor antes de la actualización del registro, que +Urepresenta la actualización del registro El último valor, -Dque indica la eliminación) puede corresponder uno a uno con los registros de cambio generados por Debezium et al.

1.3 Qué es Apache Doris

Apache Doris es un producto de base de datos analítico MPP moderno. Los resultados de las consultas se pueden obtener con un tiempo de respuesta de menos de un segundo, lo que respalda de manera efectiva el análisis de datos en tiempo real. La arquitectura distribuida de Apache Doris es muy simple, fácil de operar y mantener, y puede admitir grandes conjuntos de datos de más de 10 PB.

Apache Doris puede satisfacer una variedad de necesidades de análisis de datos, como informes históricos fijos, análisis de datos en tiempo real, análisis de datos interactivos y análisis de datos exploratorios. ¡Haga que su trabajo de análisis de datos sea más fácil y eficiente!

1.4 Confirmación en dos fases

1.4.1 ¿Qué es la confirmación en dos fases (2PC)?

En un sistema distribuido, para permitir que cada nodo perciba el estado de ejecución de la transacción de otros nodos, se debe introducir un nodo central para procesar uniformemente la lógica de ejecución de todos los nodos.Este nodo central se denomina coordinador y está programado por el nodo central Los otros nodos de negocio se denominan participantes.

2PC divide la transacción distribuida en dos fases, las dos fases son solicitud de confirmación (votación) y confirmación (ejecución). El coordinador decide si ejecutar realmente la transacción de acuerdo con las respuestas de los participantes.El proceso específico es el siguiente.

Presentar una fase de solicitud (votación)

  1. El coordinador envía una solicitud de preparación con el contenido de la transacción a todos los participantes, pregunta si la transacción se puede preparar para la confirmación y espera la respuesta del participante.
  2. Los actores realizan las operaciones contenidas en la transacción y registran deshacer (para retroceder) y rehacer (para reproducir), pero en realidad no se comprometen.
  3. El participante devuelve el resultado de la ejecución de la operación de transacción al coordinador y devuelve sí si la ejecución es exitosa, de lo contrario devuelve no.

fase de confirmación (ejecución)

Hay dos tipos de éxito y fracaso.

  • Si todos los participantes devuelven sí, la transacción se puede confirmar:
  1. El coordinador envía solicitudes de confirmación a todos los participantes.
  2. Después de que el participante recibe la solicitud de confirmación, la transacción se confirma realmente, los recursos de transacción ocupados se liberan y se devuelve el acuse de recibo al coordinador.
  3. El coordinador recibe mensajes de acuse de recibo de todos los participantes y la transacción se completa con éxito.
  • Si algún participante devuelve no o el tiempo de espera falla, la transacción se interrumpe y debe revertirse:
  1. El coordinador envía una solicitud de reversión a todos los participantes.
  2. Después de que el participante recibe la solicitud de reversión, retrocede al estado anterior a la ejecución de la transacción de acuerdo con el registro de deshacer, libera los recursos de transacción ocupados y devuelve el acuse de recibo al coordinador.
  3. El coordinador recibe mensajes de acuse de recibo de todos los participantes y se completa la reversión de la transacción.

1,4 Flink 2PC

Como motor de procesamiento de flujo, Flink naturalmente ofrece garantías para la semántica exactamente una vez. La semántica de extremo a extremo exactamente una vez es el resultado de la sinergia de entrada, lógica de procesamiento y salida. Flink se basa en el mecanismo de punto de control y el algoritmo ligero de instantáneas distribuidas ABS para garantizar exactamente una vez. Para lograr una lógica de salida exactamente una vez, se debe imponer una de las siguientes dos restricciones: escritura idempotente, escritura transaccional.

El proceso de la etapa previa al compromiso

imagen

Cada vez que se necesita realizar un punto de control, JobManager ingresa una barrera (barrera) en el flujo de datos como el límite del punto de control. La barrera se pasa aguas abajo a lo largo de la cadena de operadores, y cada vez que se alcanza un operador, se activa la acción de escribir una instantánea de estado en el backend de estado. Cuando la barrera alcanza el sumidero de Kafka, los datos del mensaje se descargan a través del método KafkaProducer.flush(), pero aún no se han confirmado. A continuación, aún debe activar la fase de confirmación a través de puntos de control

Proceso de la etapa de presentación

imagen

La escritura solo tendrá éxito si todos los puntos de control se completan correctamente. Esto está en línea con el proceso 2PC descrito anteriormente, donde JobManager es el coordinador y cada operador es el participante (pero solo el participante receptor realizará el envío). Una vez que un punto de control falla, el método de notificaciónCheckpointComplete() no se ejecutará. Si el reintento no tiene éxito, eventualmente se llamará al método abort() para revertir la transacción.

1.5 Doris Corriente Carga 2PC

1.5.1 Carga de flujo

La carga de secuencias es un método de importación síncrono proporcionado por Apache Doris. Los usuarios envían solicitudes para importar archivos locales o secuencias de datos a Doris mediante el envío del protocolo HTTP. Stream load realiza la importación sincrónicamente y devuelve el resultado de la importación. El usuario puede juzgar directamente si la importación es exitosa a través del cuerpo de devolución de la solicitud.

La carga de secuencias es principalmente adecuada para importar archivos locales o importar datos en secuencias de datos a través de programas.

Usando el método, los usuarios pueden operar a través de Http Client o usar el comando Curl.

curl --location-trusted -u user:passwd [-H ""...] -T data.file -H "label:label" -XPUT http://fe_host:http_port/api/{db}/{table}/_stream_load

Para evitar que los usuarios importen los mismos datos repetidamente, aquí se utiliza la etiqueta de la tarea de importación. Se recomienda encarecidamente que los usuarios utilicen la misma etiqueta para el mismo lote de datos. De esta manera, las solicitudes repetidas del mismo lote de datos solo se aceptarán una vez, lo que garantiza At-Most-Once

1.5.2 Carga de transmisión 2PC

El primer Stream Load de Aapche Doris no tiene envío de dos etapas.Al importar datos, la importación de datos se completa directamente a través de la interfaz http de Stream Load, con solo éxito y fracaso.

  1. Esto no es un problema en circunstancias normales. En un entorno distribuido, puede ser que los datos en ambos extremos sean inconsistentes debido a que una determinada tarea de importación falla. Especialmente en Doris Flink Connector, la falla de importación de datos anterior de Doris Flink Connector requiere El usuario lo controla él mismo y maneja las excepciones. Por ejemplo, si la importación falla, guarde los datos en un lugar designado (como Kafka) y luego procéselos manualmente.
  2. Si el trabajo de Flink se cuelga repentinamente debido a otros problemas, algunos datos tendrán éxito y otros fallarán, y debido a que los datos fallidos no tienen un punto de control, reiniciar el trabajo no podrá volver a consumir los datos fallidos, lo que resultará en datos inconsistentes en ambos extremos.

Para resolver los problemas anteriores y garantizar la consistencia de los datos en ambos extremos, implementamos Doris Stream Load 2PC, el principio es el siguiente:

  1. Comprometerse en dos fases
  2. En la primera etapa, se envía la tarea de escritura de datos. En este momento, después de que la escritura de datos sea exitosa, el estado de los datos es invisible y el estado de la transacción es PRECOMMITED.
  3. Una vez que los datos se escriben con éxito, el usuario activa la operación Confirmar para cambiar el estado de la transacción a VISIBLE. En este momento, se pueden consultar los datos.
  4. Si el usuario desea usar este lote de datos, solo necesita usar el ID de la transacción para activar la operación de cancelación en la transacción, y este lote de datos se eliminará automáticamente.

1.5.3 Cómo usar Stream load 2PC

  1. Configurar en be.conf disable_stream_load_2pc=false(reiniciar para que surta efecto)
  2. y declarado en HEADER two_phase_commit=true.

Para iniciar una confirmación previa:

curl  --location-trusted -u user:passwd -H "two_phase_commit:true" -T test.txt http://fe_host:http_port/api/{db}/{table}/_stream_load

Activar transacción Confirmar operación

curl -X PUT --location-trusted -u user:passwd  -H "txn_id:18036" -H "txn_operation:commit"  http://fe_host:http_port/api/{db}/_stream_load_2pc

Desencadenar acción de cancelación en cosas

curl -X PUT --location-trusted -u user:passwd  -H "txn_id:18037" -H "txn_operation:abort"  http://fe_host:http_port/api/{db}/_stream_load_2pc

1.6 Conector Doris Flink 2PC

Anteriormente proporcionamos Doris Flink Connector, que admite la lectura, Upsert y eliminación (modelo de clave única) de los datos de la tabla Doris, pero existe el problema de que los datos en ambos extremos pueden ser inconsistentes debido a una falla en el trabajo u otras condiciones anormales.

Para resolver estos problemas, modificamos y actualizamos Doris Connector basado en FLink 2PC y Doris Stream Load 2PC para garantizar que ambos extremos estén exactamente a la vez.

  1. Mantendremos los búferes de lectura y escritura en la memoria. Al inicio, comenzaremos a escribir y enviar de forma asincrónica. Durante este período, continuaremos escribiendo datos en BE a través de http fragmentado y dejaremos de escribir hasta el punto de control. La ventaja de esto es que evite los gastos generales causados ​​por el envío frecuente de http por parte de los usuarios.Después de completar Checkpoint, se iniciará la siguiente etapa de escritura.
  2. Durante este punto de control, puede haber múltiples tareas escribiendo los datos de una tabla al mismo tiempo. Todos corresponderemos a una etiqueta global durante este punto de control y unificaremos las transacciones que escriben datos correspondientes a esta etiqueta durante el punto de control. Un compromiso, haciendo el estado de los datos visible,
  3. Si falla, Flink reproducirá los datos a través del punto de control cuando se reinicie.
  4. Esto asegura la consistencia de los datos en ambos extremos de Doris

2. Arquitectura del sistema

Tomemos un ejemplo completo para ver cómo integrar Flink CDC a través de la última versión de Doris Flink Connector (que admite el envío en dos etapas) para realizar la recopilación y el almacenamiento en tiempo real de la subbase de datos y las subtablas de MySQL.

imagen

  1. Aquí usamos Flink CDC para completar la recopilación de datos de la subtabla y la subbase de datos MySQL
  2. Luego complete el almacenamiento de datos a través del Doris Flink Connector
  3. Por último, utilice las capacidades informáticas y de análisis OLAP de alto rendimiento y alta concurrencia de Doris para proporcionar servicios de datos externos.

3. Configuración de la instalación de MySQL

3.1 Instalar MySQL

Use rápidamente Docker para instalar y configurar Mysql, consulte la siguiente conexión para obtener más detalles

https://segmentfault.com/a/1190000021523570

3.2 Abrir el registro de archivos binarios de Mysql

Ingrese al contenedor Docker para modificar el archivo /etc/my.cnf y agregue lo siguiente en [mysqld],

log_bin=mysql_bin
binlog-format=Row
server-id=1

Luego reinicie Mysql

systemctl restart mysqld

3.3 Preparar datos

Aquí demostramos que hemos preparado dos bases de datos, emp_1 y emp_2, y dos tablas, empleados_1 y empleados_2, están activas y en espera debajo de cada base de datos. Y dar los datos de inicialización.

CREATE DATABASE emp_1;
 USE emp_1;
CREATE TABLE employees_1 (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,    
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
);
​
INSERT INTO `employees_1` VALUES (10001,'1953-09-02','Georgi','Facello','M','1986-06-26'),
(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21'),
(10003,'1959-12-03','Parto','Bamford','M','1986-08-28'),
(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01'),
(10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12'),
(10006,'1953-04-20','Anneke','Preusig','F','1989-06-02'),
(10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10'),
(10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15'),
(10009,'1952-04-19','Sumant','Peac','F','1985-02-18'),
(10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24'),
(10011,'1953-11-07','Mary','Sluis','F','1990-01-22'),
(10012,'1960-10-04','Patricio','Bridgland','M','1992-12-18'),
(10013,'1963-06-07','Eberhardt','Terkki','M','1985-10-20'),
(10014,'1956-02-12','Berni','Genin','M','1987-03-11'),
(10015,'1959-08-19','Guoxiang','Nooteboom','M','1987-07-02'),
(10016,'1961-05-02','Kazuhito','Cappelletti','M','1995-01-27'),
(10017,'1958-07-06','Cristinel','Bouloucos','F','1993-08-03'),
(10018,'1954-06-19','Kazuhide','Peha','F','1987-04-03'),
(10019,'1953-01-23','Lillian','Haddadi','M','1999-04-30'),
(10020,'1952-12-24','Mayuko','Warwick','M','1991-01-26'),
(10021,'1960-02-20','Ramzi','Erde','M','1988-02-10'),
(10022,'1952-07-08','Shahaf','Famili','M','1995-08-22'),
(10023,'1953-09-29','Bojan','Montemayor','F','1989-12-17'),
(10024,'1958-09-05','Suzette','Pettey','F','1997-05-19'),
(10025,'1958-10-31','Prasadram','Heyers','M','1987-08-17'),
(10026,'1953-04-03','Yongqiao','Berztiss','M','1995-03-20'),
(10027,'1962-07-10','Divier','Reistad','F','1989-07-07'),
(10028,'1963-11-26','Domenick','Tempesti','M','1991-10-22'),
(10029,'1956-12-13','Otmar','Herbst','M','1985-11-20'),
(10030,'1958-07-14','Elvis','Demeyer','M','1994-02-17'),
(10031,'1959-01-27','Karsten','Joslin','M','1991-09-01'),
(10032,'1960-08-09','Jeong','Reistad','F','1990-06-20'),
(10033,'1956-11-14','Arif','Merlo','M','1987-03-18'),
(10034,'1962-12-29','Bader','Swan','M','1988-09-21'),
(10035,'1953-02-08','Alain','Chappelet','M','1988-09-05'),
(10036,'1959-08-10','Adamantios','Portugali','M','1992-01-03');
​
CREATE TABLE employees_2 (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,    
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
);
​
INSERT INTO `employees_2` VALUES (10037,'1963-07-22','Pradeep','Makrucki','M','1990-12-05'),
(10038,'1960-07-20','Huan','Lortz','M','1989-09-20'),
(10039,'1959-10-01','Alejandro','Brender','M','1988-01-19'),
(10040,'1959-09-13','Weiyi','Meriste','F','1993-02-14'),
(10041,'1959-08-27','Uri','Lenart','F','1989-11-12'),
(10042,'1956-02-26','Magy','Stamatiou','F','1993-03-21'),
(10043,'1960-09-19','Yishay','Tzvieli','M','1990-10-20'),
(10044,'1961-09-21','Mingsen','Casley','F','1994-05-21'),
(10045,'1957-08-14','Moss','Shanbhogue','M','1989-09-02'),
(10046,'1960-07-23','Lucien','Rosenbaum','M','1992-06-20'),
(10047,'1952-06-29','Zvonko','Nyanchama','M','1989-03-31'),
(10048,'1963-07-11','Florian','Syrotiuk','M','1985-02-24'),
(10049,'1961-04-24','Basil','Tramer','F','1992-05-04'),
(10050,'1958-05-21','Yinghua','Dredge','M','1990-12-25'),
(10051,'1953-07-28','Hidefumi','Caine','M','1992-10-15'),
(10052,'1961-02-26','Heping','Nitsch','M','1988-05-21'),
(10053,'1954-09-13','Sanjiv','Zschoche','F','1986-02-04'),
(10054,'1957-04-04','Mayumi','Schueller','M','1995-03-13');
​
​
CREATE DATABASE emp_2;
​
USE emp_2;
​
CREATE TABLE employees_1 (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,    
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
);
​
​
INSERT INTO `employees_1` VALUES  (10055,'1956-06-06','Georgy','Dredge','M','1992-04-27'),
(10056,'1961-09-01','Brendon','Bernini','F','1990-02-01'),
(10057,'1954-05-30','Ebbe','Callaway','F','1992-01-15'),
(10058,'1954-10-01','Berhard','McFarlin','M','1987-04-13'),
(10059,'1953-09-19','Alejandro','McAlpine','F','1991-06-26'),
(10060,'1961-10-15','Breannda','Billingsley','M','1987-11-02'),
(10061,'1962-10-19','Tse','Herber','M','1985-09-17'),
(10062,'1961-11-02','Anoosh','Peyn','M','1991-08-30'),
(10063,'1952-08-06','Gino','Leonhardt','F','1989-04-08'),
(10064,'1959-04-07','Udi','Jansch','M','1985-11-20'),
(10065,'1963-04-14','Satosi','Awdeh','M','1988-05-18'),
(10066,'1952-11-13','Kwee','Schusler','M','1986-02-26'),
(10067,'1953-01-07','Claudi','Stavenow','M','1987-03-04'),
(10068,'1962-11-26','Charlene','Brattka','M','1987-08-07'),
(10069,'1960-09-06','Margareta','Bierman','F','1989-11-05'),
(10070,'1955-08-20','Reuven','Garigliano','M','1985-10-14'),
(10071,'1958-01-21','Hisao','Lipner','M','1987-10-01'),
(10072,'1952-05-15','Hironoby','Sidou','F','1988-07-21'),
(10073,'1954-02-23','Shir','McClurg','M','1991-12-01'),
(10074,'1955-08-28','Mokhtar','Bernatsky','F','1990-08-13'),
(10075,'1960-03-09','Gao','Dolinsky','F','1987-03-19'),
(10076,'1952-06-13','Erez','Ritzmann','F','1985-07-09'),
(10077,'1964-04-18','Mona','Azuma','M','1990-03-02'),
(10078,'1959-12-25','Danel','Mondadori','F','1987-05-26'),
(10079,'1961-10-05','Kshitij','Gils','F','1986-03-27'),
(10080,'1957-12-03','Premal','Baek','M','1985-11-19'),
(10081,'1960-12-17','Zhongwei','Rosen','M','1986-10-30'),
(10082,'1963-09-09','Parviz','Lortz','M','1990-01-03'),
(10083,'1959-07-23','Vishv','Zockler','M','1987-03-31'),
(10084,'1960-05-25','Tuval','Kalloufi','M','1995-12-15');
​
​
CREATE TABLE employees_2(
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,    
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
);
​
INSERT INTO `employees_2` VALUES (10085,'1962-11-07','Kenroku','Malabarba','M','1994-04-09'),
(10086,'1962-11-19','Somnath','Foote','M','1990-02-16'),
(10087,'1959-07-23','Xinglin','Eugenio','F','1986-09-08'),
(10088,'1954-02-25','Jungsoon','Syrzycki','F','1988-09-02'),
(10089,'1963-03-21','Sudharsan','Flasterstein','F','1986-08-12'),
(10090,'1961-05-30','Kendra','Hofting','M','1986-03-14'),
(10091,'1955-10-04','Amabile','Gomatam','M','1992-11-18'),
(10092,'1964-10-18','Valdiodio','Niizuma','F','1989-09-22'),
(10093,'1964-06-11','Sailaja','Desikan','M','1996-11-05'),
(10094,'1957-05-25','Arumugam','Ossenbruggen','F','1987-04-18'),
(10095,'1965-01-03','Hilari','Morton','M','1986-07-15'),
(10096,'1954-09-16','Jayson','Mandell','M','1990-01-14'),
(10097,'1952-02-27','Remzi','Waschkowski','M','1990-09-15'),
(10098,'1961-09-23','Sreekrishna','Servieres','F','1985-05-13'),
(10099,'1956-05-25','Valter','Sullins','F','1988-10-18'),
(10100,'1953-04-21','Hironobu','Haraldson','F','1987-09-21'),
(10101,'1952-04-15','Perla','Heyers','F','1992-12-28'),
(10102,'1959-11-04','Paraskevi','Luby','F','1994-01-26'),
(10103,'1953-11-26','Akemi','Birch','M','1986-12-02'),
(10104,'1961-11-19','Xinyu','Warwick','M','1987-04-16'),
(10105,'1962-02-05','Hironoby','Piveteau','M','1999-03-23'),
(10106,'1952-08-29','Eben','Aingworth','M','1990-12-19'),
(10107,'1956-06-13','Dung','Baca','F','1994-03-22'),
(10108,'1952-04-07','Lunjin','Giveon','M','1986-10-02'),
(10109,'1958-11-25','Mariusz','Prampolini','F','1993-06-16'),
(10110,'1957-03-07','Xuejia','Ullian','F','1986-08-22'),
(10111,'1963-08-29','Hugo','Rosis','F','1988-06-19'),
(10112,'1963-08-13','Yuichiro','Swick','F','1985-10-08'),
(10113,'1963-11-13','Jaewon','Syrzycki','M','1989-12-24'),
(10114,'1957-02-16','Munir','Demeyer','F','1992-07-17'),
(10115,'1964-12-25','Chikara','Rissland','M','1986-01-23'),
(10116,'1955-08-26','Dayanand','Czap','F','1985-05-28');

4. Configuración de la instalación de Doris

Aquí tomamos la versión independiente como ejemplo.

Primero descargue la versión de lanzamiento de Doris 1.1:

https://doris.apache.org/downloads/downloads.html

Descomprimir en el directorio especificado

tar zxvf apache-doris-1.1.0-bin.tar.gz -C doris-1.1

La estructura del directorio descomprimido es la siguiente:

.
├── apache_hdfs_broker
│   ├── bin
│   ├── conf
│   └── lib
├── be
│   ├── bin
│   ├── conf
│   ├── lib
│   ├── log
│   ├── minidump
│   ├── storage
│   └── www
├── derby.log
├── fe
│   ├── bin
│   ├── conf
│   ├── doris-meta
│   ├── lib
│   ├── log
│   ├── plugins
│   ├── spark-dpp
│   ├── temp_dir
│   └── webroot
└── udf
    ├── include
    └── lib

Configurar fe y ser

cd doris-1.0
# 配置 fe.conf 和 be.conf,这两个文件分别在fe和be的conf目录下
打开这个 priority_networks
修改成自己的IP地址,注意这里是CIDR方式配置IP地址
例如我本地的IP是172.19.0.12,我的配置如下:
priority_networks = 172.19.0.0/24
​
######
在be.conf配置文件最后加上下面这个配置
disable_stream_load_2pc=false

  1. Tenga en cuenta que, de forma predeterminada, solo necesita modificar fe.confy be.confla misma configuración que la anterior.
  2. El directorio de metadatos fe predeterminado se encuentra en el fe/doris-metadirectorio
  3. Los datos de be se almacenan en el be/storagedirectorio

Iniciar FE

sh fe/bin/start_fe.sh --daemon

empezar a ser

sh be/bin/start_be.sh --daemon

La línea de comandos de MySQL se conecta a FE. Los usuarios predeterminados del clúster de Doris recién instalado aquí son root y admin, y la contraseña está vacía.

mysql -uroot -P9030 -h127.0.0.1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 5.7.37 Doris version trunk-440ad03
​
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
​
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
​
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
​
mysql> show frontends;
+--------------------------------+-------------+-------------+----------+-----------+---------+----------+----------+------------+------+-------+-------------------+---------------------+----------+--------+---------------+------------------+
| Name                           | IP          | EditLogPort | HttpPort | QueryPort | RpcPort | Role     | IsMaster | ClusterId  | Join | Alive | ReplayedJournalId | LastHeartbeat       | IsHelper | ErrMsg | Version       | CurrentConnected |
+--------------------------------+-------------+-------------+----------+-----------+---------+----------+----------+------------+------+-------+-------------------+---------------------+----------+--------+---------------+------------------+
| 172.19.0.12_9010_1654681464955 | 172.19.0.12 | 9010        | 8030     | 9030      | 9020    | FOLLOWER | true     | 1690644599 | true | true  | 381106            | 2022-06-22 18:13:34 | true     |        | trunk-440ad03 | Yes              |
+--------------------------------+-------------+-------------+----------+-----------+---------+----------+----------+------------+------+-------+-------------------+---------------------+----------+--------+---------------+------------------+
1 row in set (0.01 sec)
​

Agregar nodos BE al clúster

mysql>alter system add backend "172.19.0.12:9050";

Aquí está su propia dirección IP

Ver SER

mysql> show backends;
+-----------+-----------------+-------------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------+-------------------------------------------------------------------------------------------------------------------------------+
| BackendId | Cluster         | IP          | HeartbeatPort | BePort | HttpPort | BrpcPort | LastStartTime       | LastHeartbeat       | Alive | SystemDecommissioned | ClusterDecommissioned | TabletNum | DataUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | Tag                      | ErrMsg | Version       | Status                                                                                                                        |
+-----------+-----------------+-------------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------+-------------------------------------------------------------------------------------------------------------------------------+
| 10002     | default_cluster | 172.19.0.12 | 9050          | 9060   | 8040     | 8060     | 2022-06-22 12:51:58 | 2022-06-22 18:15:34 | true  | false                | false                 | 4369      | 328.686 MB       | 144.083 GB    | 196.735 GB    | 26.76 % | 26.76 %        | {"location" : "default"} |        | trunk-440ad03 | {"lastSuccessReportTabletsTime":"2022-06-22 18:15:05","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false} |
+-----------+-----------------+-------------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

La instalación independiente de Doris está completa

5. Configuración de instalación de Flink

5.1 Descargar e instalar Flink1.14.4

wget https://dlcdn.apache.org/flink/flink-1.14.4/flink-1.14.5-bin-scala_2.12.tgz
tar zxvf flink-1.14.4-bin-scala_2.12.tgz

Luego, debe copiar las siguientes dependencias en el directorio lib en el directorio de instalación de Flink.Los archivos lib dependientes específicos son los siguientes:

wget https://jiafeng-1308700295.cos.ap-hongkong.myqcloud.com/flink-doris-connector-1.14_2.12-1.0.0-SNAPSHOT.jar
wget https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.2.1/flink-sql-connector-mysql-cdc-2.2.1.jar

Iniciar Flink

bin/start-cluster.sh

La interfaz después del inicio es la siguiente:

imagen

6. Comience a sincronizar datos con Doris

6.1 Crear base de datos y tabla de Doris

create database demo;
use demo;
CREATE TABLE all_employees_info (
    emp_no       int NOT NULL,
    birth_date   date,
    first_name   varchar(20),
    last_name    varchar(20),
    gender       char(2),
    hire_date    date,
    database_name varchar(50),
    table_name    varchar(200)
)
UNIQUE KEY(`emp_no`, `birth_date`)
DISTRIBUTED BY HASH(`birth_date`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

6.2 Ingrese al cliente SQL de Flink

 bin/sql-client.sh embedded 

imagen

Encienda el punto de control y haga un punto de control cada 10 segundos

Checkpoint no está habilitado de forma predeterminada, debemos habilitar Checkpoint para enviar transacciones.

La fuente escanea toda la tabla al inicio y la divide en varios fragmentos de acuerdo con la clave principal. Y use el algoritmo de instantánea incremental para leer los datos de cada fragmento uno por uno. El trabajo ejecutará periódicamente Checkpoint para registrar los fragmentos completados. Cuando se produzca una conmutación por error, siga leyendo los fragmentos sin terminar. Cuando se leen todos los fragmentos, se leerán los registros de cambios incrementales del sitio Binlog obtenido anteriormente. El trabajo de Flink continuará ejecutando periódicamente Checkpoint y registrando el sitio Binlog. Cuando el trabajo falla, continuará procesando desde el sitio Binlog previamente registrado, realizando así la semántica Exactamente una vez.

SET execution.checkpointing.interval = 10s;

Nota: Esta es una demostración, el entorno de producción recomienda un intervalo de punto de control de 60 segundos

6.3 Crear una tabla CDC de MySQL

Ejecute el siguiente SQL en Flink SQL Client

CREATE TABLE employees_source (
    database_name STRING METADATA VIRTUAL,
    table_name STRING METADATA VIRTUAL,
    emp_no int NOT NULL,
    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' = 'localhost',
    'port' = '3306',
    'username' = 'root',
    'password' = 'MyNewPass4!',
    'database-name' = 'emp_[0-9]+',
    'table-name' = 'employees_[0-9]+'
  );

  1. 'database-name' = 'emp_[0-9]+': Aquí está el uso de expresiones regulares para conectar múltiples bibliotecas al mismo tiempo
  2. 'table-name' = 'employees_[0-9]+': Aquí está el uso de expresiones regulares para conectar varias tablas al mismo tiempo

Consultando la tabla CDC, podemos ver los siguientes datos, indicando que todo es normal

select * from employees_source limit 10;

imagen

6.4 Crear la mesa del fregadero Doris

CREATE TABLE cdc_doris_sink (
    emp_no       int ,
    birth_date   STRING,
    first_name   STRING,
    last_name    STRING,
    gender       STRING,
    hire_date    STRING,
    database_name STRING,
    table_name    STRING
) 
WITH (
  'connector' = 'doris',
  'fenodes' = '172.19.0.12:8030',
  'table.identifier' = 'demo.all_employees_info',
  'username' = 'root',
  'password' = '',
  'sink.properties.two_phase_commit'='true',
  'sink.label-prefix'='doris_demo_emp_001'
);

Descripción de parámetros:

  1. conector : Especifica que el conector es doris
  2. fenodes: dirección IP del nodo Doris FE y puerto http
  3. table.identifier: la base de datos y el nombre de la tabla correspondiente a Doris
  4. nombre de usuario: doris nombre de usuario
  5. contraseña: contraseña de usuario doris
  6. fregadero.properties.two_phase_commit: especifique el uso de la confirmación de dos fases, de modo que cuando se cargue la transmisión, se agregará al encabezado http two_phase_commit:true; de lo contrario, fallará
  7. sink.label-prefix : este es un parámetro que se debe agregar durante el envío de dos fases para garantizar la coherencia de los datos en ambos extremos; de lo contrario, fallará
  8. Para otros parámetros, consulte la documentación oficial https://doris.apache.org/zh-CN/docs/ecosystem/flink-doris-connector.html

En este momento, no hay datos para consultar la tabla de receptores de Doris.

select * from cdc_doris_sink;

imagen

6.5 Insertar datos en la tabla Doris

Ejecute el siguiente SQL:

insert into cdc_doris_sink (emp_no,birth_date,first_name,last_name,gender,hire_date,database_name,table_name) 
select emp_no,cast(birth_date as string) as birth_date ,first_name,last_name,gender,cast(hire_date as string) as hire_date ,database_name,table_name from employees_source;

Luego podemos ver la información de ejecución de la tarea en la interfaz de usuario WEB de Flink

imagen

Aquí podemos ver la información de registro del TaskManager, y encontraremos que aquí se usa el envío en dos fases, y los datos se transmiten continuamente al lado BE a través del método fragmentado http. Después de completar el punto de control, continuará el envío de la siguiente tarea.

2022-06-22 19:04:01,350 INFO  io.debezium.relational.history.DatabaseHistoryMetrics        [] - Started database history recovery
2022-06-22 19:04:01,350 INFO  io.debezium.relational.history.DatabaseHistoryMetrics        [] - Finished database history recovery of 0 change(s) in 0 ms
2022-06-22 19:04:01,351 INFO  io.debezium.util.Threads                                     [] - Requested thread factory for connector MySqlConnector, id = mysql_binlog_source named = binlog-client
2022-06-22 19:04:01,352 INFO  io.debezium.connector.mysql.MySqlStreamingChangeEventSource  [] - Skip 0 events on streaming start
2022-06-22 19:04:01,352 INFO  io.debezium.connector.mysql.MySqlStreamingChangeEventSource  [] - Skip 0 rows on streaming start
2022-06-22 19:04:01,352 INFO  io.debezium.util.Threads                                     [] - Creating thread debezium-mysqlconnector-mysql_binlog_source-binlog-client
2022-06-22 19:04:01,374 INFO  io.debezium.util.Threads                                     [] - Creating thread debezium-mysqlconnector-mysql_binlog_source-binlog-client
2022-06-22 19:04:01,381 INFO  io.debezium.connector.mysql.MySqlStreamingChangeEventSource  [] - Connected to MySQL binlog at localhost:3306, starting at MySqlOffsetContext [sourceInfoSchema=Schema{io.debezium.connector.mysql.Source:STRUCT}, sourceInfo=SourceInfo [currentGtid=null, currentBinlogFilename=mysql_bin.000005, currentBinlogPosition=211725, currentRowNumber=0, serverId=0, sourceTime=null, threadId=-1, currentQuery=null, tableIds=[], databaseName=null], partition={server=mysql_binlog_source}, snapshotCompleted=false, transactionContext=TransactionContext [currentTransactionId=null, perTableEventCount={}, totalEventCount=0], restartGtidSet=null, currentGtidSet=null, restartBinlogFilename=mysql_bin.000005, restartBinlogPosition=211725, restartRowsToSkip=0, restartEventsToSkip=0, currentEventLengthInBytes=0, inTransaction=false, transactionId=null]
2022-06-22 19:04:01,381 INFO  io.debezium.util.Threads                                     [] - Creating thread debezium-mysqlconnector-mysql_binlog_source-binlog-client
2022-06-22 19:04:01,381 INFO  io.debezium.connector.mysql.MySqlStreamingChangeEventSource  [] - Waiting for keepalive thread to start
2022-06-22 19:04:01,497 INFO  io.debezium.connector.mysql.MySqlStreamingChangeEventSource  [] - Keepalive thread is running
2022-06-22 19:04:08,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:04:08,321 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6963,
    "Label": "doris_demo_001_0_1",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 634,
    "NumberLoadedRows": 634,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 35721,
    "LoadTimeMs": 9046,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9041,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:04:08,321 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:08,321 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_2
2022-06-22 19:04:08,321 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:04:08,325 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 1
2022-06-22 19:04:08,329 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6963] commit successfully."
}
2022-06-22 19:04:18,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:04:18,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6964,
    "Label": "doris_demo_001_0_2",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 9988,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9983,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:04:18,310 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:18,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_3
2022-06-22 19:04:18,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:04:18,312 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 2
2022-06-22 19:04:18,317 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6964] commit successfully."
}
2022-06-22 19:04:28,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:04:28,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6965,
    "Label": "doris_demo_001_0_3",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 9998,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9993,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:04:28,308 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:28,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_4
2022-06-22 19:04:28,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:04:28,311 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 3
2022-06-22 19:04:28,316 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6965] commit successfully."
}
2022-06-22 19:04:38,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:04:38,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6966,
    "Label": "doris_demo_001_0_4",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 9999,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9994,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:04:38,308 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:38,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_5
2022-06-22 19:04:38,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:04:38,311 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 4
2022-06-22 19:04:38,317 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6966] commit successfully."
}
2022-06-22 19:04:48,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:04:48,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6967,
    "Label": "doris_demo_001_0_5",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 10000,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9996,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:04:48,310 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:48,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_6
2022-06-22 19:04:48,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:04:48,312 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 5
2022-06-22 19:04:48,317 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6967] commit successfully."
}
2022-06-22 19:04:58,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:04:58,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6968,
    "Label": "doris_demo_001_0_6",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 9998,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9993,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:04:58,308 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:58,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_7
2022-06-22 19:04:58,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:04:58,311 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 6
2022-06-22 19:04:58,316 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6968] commit successfully."
}
2022-06-22 19:05:08,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:05:08,309 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6969,
    "Label": "doris_demo_001_0_7",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 9999,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9995,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:05:08,309 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:08,309 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_8
2022-06-22 19:05:08,309 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:05:08,311 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 7
2022-06-22 19:05:08,316 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6969] commit successfully."
}
2022-06-22 19:05:18,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:05:18,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6970,
    "Label": "doris_demo_001_0_8",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 9999,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9993,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:05:18,308 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:18,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_9
2022-06-22 19:05:18,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:05:18,311 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 8
2022-06-22 19:05:18,317 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6970] commit successfully."
}
2022-06-22 19:05:28,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:05:28,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6971,
    "Label": "doris_demo_001_0_9",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 10000,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9996,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:05:28,310 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:28,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_10
2022-06-22 19:05:28,310 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:05:28,315 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 9
2022-06-22 19:05:28,320 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6971] commit successfully."
}
2022-06-22 19:05:38,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:05:38,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6972,
    "Label": "doris_demo_001_0_10",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 0,
    "NumberLoadedRows": 0,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 0,
    "LoadTimeMs": 9998,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 9992,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:05:38,308 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:38,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_11
2022-06-22 19:05:38,308 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:05:38,311 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 10
2022-06-22 19:05:38,316 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6972] commit successfully."
}
2022-06-22 19:05:48,303 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load stopped.
2022-06-22 19:05:48,315 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - load Result {
    "TxnId": 6973,
    "Label": "doris_demo_001_0_11",
    "TwoPhaseCommit": "true",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 520,
    "NumberLoadedRows": 520,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 29293,
    "LoadTimeMs": 10005,
    "BeginTxnTimeMs": 0,
    "StreamLoadPutTimeMs": 0,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 10001,
    "CommitAndPublishTimeMs": 0
}
​
2022-06-22 19:05:48,315 INFO  org.apache.doris.flink.sink.writer.RecordBuffer              [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:48,315 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - stream load started for doris_demo_001_0_12
2022-06-22 19:05:48,315 INFO  org.apache.doris.flink.sink.writer.DorisStreamLoad           [] - start execute load
2022-06-22 19:05:48,322 INFO  org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 11
2022-06-22 19:05:48,327 INFO  org.apache.doris.flink.sink.committer.DorisCommitter         [] - load result {
    "status": "Success",
    "msg": "transaction [6973] commit successfully."
}

6.6 Consulta de datos de Doris

Aquí he insertado 636 datos,

mysql> select count(1) from  all_employees_info ;
+----------+
| count(1) |
+----------+
|      634 |
+----------+
1 row in set (0.01 sec)
​
mysql> select * from  all_employees_info limit 20;
+--------+------------+------------+-------------+--------+------------+---------------+-------------+
| emp_no | birth_date | first_name | last_name   | gender | hire_date  | database_name | table_name  |
+--------+------------+------------+-------------+--------+------------+---------------+-------------+
|  10001 | 1953-09-02 | Georgi     | Facello     | M      | 1986-06-26 | emp_1         | employees_1 |
|  10002 | 1964-06-02 | Bezalel    | Simmel      | F      | 1985-11-21 | emp_1         | employees_1 |
|  10003 | 1959-12-03 | Parto      | Bamford     | M      | 1986-08-28 | emp_1         | employees_1 |
|  10004 | 1954-05-01 | Chirstian  | Koblick     | M      | 1986-12-01 | emp_1         | employees_1 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak    | M      | 1989-09-12 | emp_1         | employees_1 |
|  10006 | 1953-04-20 | Anneke     | Preusig     | F      | 1989-06-02 | emp_1         | employees_1 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski   | F      | 1989-02-10 | emp_1         | employees_1 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi    | M      | 1994-09-15 | emp_1         | employees_1 |
|  10009 | 1952-04-19 | Sumant     | Peac        | F      | 1985-02-18 | emp_1         | employees_1 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau    | F      | 1989-08-24 | emp_1         | employees_1 |
|  10011 | 1953-11-07 | Mary       | Sluis       | F      | 1990-01-22 | emp_1         | employees_1 |
|  10012 | 1960-10-04 | Patricio   | Bridgland   | M      | 1992-12-18 | emp_1         | employees_1 |
|  10013 | 1963-06-07 | Eberhardt  | Terkki      | M      | 1985-10-20 | emp_1         | employees_1 |
|  10014 | 1956-02-12 | Berni      | Genin       | M      | 1987-03-11 | emp_1         | employees_1 |
|  10015 | 1959-08-19 | Guoxiang   | Nooteboom   | M      | 1987-07-02 | emp_1         | employees_1 |
|  10016 | 1961-05-02 | Kazuhito   | Cappelletti | M      | 1995-01-27 | emp_1         | employees_1 |
|  10017 | 1958-07-06 | Cristinel  | Bouloucos   | F      | 1993-08-03 | emp_1         | employees_1 |
|  10018 | 1954-06-19 | Kazuhide   | Peha        | F      | 1987-04-03 | emp_1         | employees_1 |
|  10019 | 1953-01-23 | Lillian    | Haddadi     | M      | 1999-04-30 | emp_1         | employees_1 |
|  10020 | 1952-12-24 | Mayuko     | Warwick     | M      | 1991-01-26 | emp_1         | employees_1 |
+--------+------------+------------+-------------+--------+------------+---------------+-------------+
20 rows in set (0.00 sec)

6.7 Eliminación de prueba

mysql> use emp_2;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
​
Database changed
mysql> show tables;
+-----------------+
| Tables_in_emp_2 |
+-----------------+
| employees_1     |
| employees_2     |
+-----------------+
2 rows in set (0.00 sec)
​
mysql> delete from employees_2 where emp_no in (12013,12014,12015);
Query OK, 3 rows affected (0.01 sec)

Verificar la eliminación de datos de Doris

mysql> select count(1) from  all_employees_info ;
+----------+
| count(1) |
+----------+
|      631 |
+----------+
1 row in set (0.01 sec)

7. Resumen

Esta pregunta presenta principalmente cómo sincronizar la subbase de datos y las subtablas de FLink CDC en tiempo real, y combina el mecanismo, el principio de integración y el método de uso de Flink 2PC y Doris Stream Load 2PC integrado con la última versión de Apache Doris Flink Connector.

Espero traerte algo de ayuda.

8. Enlaces relacionados:

Sitio web oficial de SelectDB:

https://selectdb.com

Sitio web oficial de Apache Doris:

http://doris.apache.org

Apache Doris Github:

https://github.com/apache/doris

Grupo de correo de desarrolladores de Apache Doris:

[email protected]

imagen.png

{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/5735652/blog/5555473
Recomendado
Clasificación