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 +I
representa el nuevo valor, representa -U
el valor antes de la actualización del registro, que +U
representa la actualización del registro El último valor, -D
que 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)
- 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.
- 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.
- 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:
- El coordinador envía solicitudes de confirmación a todos los participantes.
- 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.
- 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:
- El coordinador envía una solicitud de reversión a todos los participantes.
- 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.
- 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
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
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.
- 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.
- 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:
- Comprometerse en dos fases
- 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.
- 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.
- 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
- Configurar en be.conf
disable_stream_load_2pc=false
(reiniciar para que surta efecto) - 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.
- 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.
- 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,
- Si falla, Flink reproducirá los datos a través del punto de control cuando se reinicie.
- 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.
- Aquí usamos Flink CDC para completar la recopilación de datos de la subtabla y la subbase de datos MySQL
- Luego complete el almacenamiento de datos a través del Doris Flink Connector
- 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
- Tenga en cuenta que, de forma predeterminada, solo necesita modificar
fe.conf
ybe.conf
la misma configuración que la anterior. - El directorio de metadatos fe predeterminado se encuentra en el
fe/doris-meta
directorio - Los datos de be se almacenan en el
be/storage
directorio
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:
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
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]+'
);
- 'database-name' = 'emp_[0-9]+': Aquí está el uso de expresiones regulares para conectar múltiples bibliotecas al mismo tiempo
- '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;
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:
- conector : Especifica que el conector es doris
- fenodes: dirección IP del nodo Doris FE y puerto http
- table.identifier: la base de datos y el nombre de la tabla correspondiente a Doris
- nombre de usuario: doris nombre de usuario
- contraseña: contraseña de usuario doris
- 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á - 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á
- 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;
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
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:
Sitio web oficial de Apache Doris:
Apache Doris Github:
https://github.com/apache/doris
Grupo de correo de desarrolladores de Apache Doris: