Este tutorial proporciona un ejemplo concreto para demostrar cómo utilizar las funciones clave de Realtime Compute for Apache Flink en el procesamiento por lotes.
Funciones
Realtime Compute for Apache Flink ofrece las siguientes funciones clave para admitir el procesamiento por lotes de Flink:
Job development map: En la pestaña Drafts de la página SQL Editor, puede crear un borrador por lotes, el cual posteriormente se despliega y ejecuta como un despliegue por lotes.
Deployment management: En la página Deployments, puede desplegar directamente despliegues por lotes JAR o Python. Seleccione BATCH en la lista desplegable superior para ver los despliegues por lotes implementados. Expanda un despliegue por lotes objetivo para consultar su lista de instancias de trabajo. Por lo general, las distintas instancias de trabajo de un despliegue por lotes comparten la misma lógica de procesamiento, pero utilizan parámetros diferentes, como la fecha de los datos que se procesan.
Data query: En la pestaña Scripts de la página SQL Editor, puede ejecutar sentencias DDL o consultas breves para una gestión y exploración rápida de datos. Estas consultas cortas se ejecutan en una sesión de Flink creada previamente, lo que permite una ejecución de baja latencia para consultas simples mediante la reutilización de recursos.
Data management: En la página Catalogs, puede crear y consultar catálogos, incluidas las bases de datos y tablas que contienen. También puede verlos en la pestaña Catalogs de la página SQL Editor para mejorar la eficiencia del desarrollo.
Task orchestration (Public Preview): En la página Workflows, puede usar una interfaz visual para definir un flujo de trabajo que orqueste las dependencias entre los despliegues por lotes. Puede activar el flujo de trabajo manualmente o programarlo para que se ejecute periódicamente.
Manage resource queues: En la página Queue Management, puede particionar los recursos dentro de un espacio de trabajo para evitar la contención de recursos entre despliegues de streaming y por lotes, así como entre despliegues con diferentes prioridades.
Requisitos previos
Ha creado un espacio de trabajo de Realtime Compute for Apache Flink. Para obtener más información, consulte Activate Realtime Compute for Apache Flink.
Ha activado Object Storage Service (OSS). Para obtener más información, consulte Console quick start. La clase de almacenamiento del bucket de OSS debe ser Standard. Para obtener más información, consulte Storage classes.
Este tutorial utiliza Apache Paimon para almacenar datos y requiere Ververica Runtime (VVR) 8.0.5 o posterior.
Escenario de ejemplo
Este tutorial utiliza una plataforma de comercio electrónico como ejemplo, donde los datos se almacenan en formato lakehouse de Apache Paimon. Simula una estructura de almacén de datos con múltiples capas: Operational Data Store (ODS), Data Warehouse Detail (DWD) y Data Warehouse Service (DWS). Utilizará las capacidades de procesamiento por lotes de Flink para procesar y limpiar datos antes de escribirlos en tablas Paimon, con el fin de construir una estructura de datos por capas.

Preparativos
-
Cree un script.
En la pestaña Scripts, puede crear un catálogo que contenga bases de datos y tablas, e insertar datos de muestra en dichas tablas.
-
Cree un catálogo Paimon.
-
En el editor de la pestaña Scripts, introduzca la siguiente sentencia SQL.
CREATE CATALOG `my_catalog` WITH ( 'type' = 'paimon', 'metastore' = 'filesystem', 'warehouse' = '<warehouse>', 'fs.oss.endpoint' = '<fs.oss.endpoint>', 'fs.oss.accessKeyId' = '<fs.oss.accessKeyId>', 'fs.oss.accessKeySecret' = '<fs.oss.accessKeySecret>' );La siguiente tabla describe los parámetros.
Parámetro
Descripción
Obligatorio
Observaciones
type
El tipo de catálogo.
Sí
Establezca el valor en
paimon.metastore
El tipo de metastore.
Sí
En este tutorial, establezca el valor en
filesystem. Para obtener más información sobre otros tipos, consulte Manage Paimon Catalogs.warehouse
El directorio del almacén de datos en Object Storage Service (OSS).
Sí
El formato es
oss://<bucket>/<object>, donde:-
bucket: El nombre de su bucket de OSS. -
object: la ruta donde se almacenan sus datos.
Puede encontrar el bucket y la ruta del objeto en la consola de OSS.
fs.oss.endpoint
El endpoint de Object Storage Service (OSS).
No
Obligatorio si el bucket de OSS especificado por
warehousese encuentra en una región diferente a la de su espacio de trabajo de Flink, o si pertenece a otra cuenta de Alibaba Cloud.Para obtener más información, consulte Regions and endpoints.
fs.oss.accessKeyId
El AccessKey ID de una cuenta de Alibaba Cloud o un usuario RAM que tenga permisos de lectura y escritura en el bucket de OSS.
No
Obligatorio si el bucket de OSS especificado por
warehousese encuentra en una región diferente a la de su espacio de trabajo de Flink, o si pertenece a otra cuenta de Alibaba Cloud. Para obtener información sobre cómo conseguir un par de AccessKey, consulte Create an AccessKey pair.fs.oss.accessKeySecret
El AccessKey secret correspondiente al AccessKey ID.
No
-
-
Seleccione el código y haga clic en Run a la izquierda.
El mensaje
The following statement has been executed successfully!indica que el catálogo se creó correctamente. Ahora puede consultar el catálogo en la página Catalogs o en la pestaña Catalogs de la página SQL Editor.
-
Procedimiento
Paso 1: Crear tablas ODS e insertar datos de prueba
Para simplificar este tutorial, insertamos datos de prueba directamente en las tablas ODS para poblar las tablas DWD y DWS subsiguientes. En un entorno de producción, normalmente se usa el procesamiento de streaming de Flink para leer datos de fuentes externas y escribirlos en el lago de datos como capa ODS. Para obtener más información, consulte Get started with Paimon: Basic features.
-
En el editor de la pestaña Scripts, introduzca las siguientes sentencias SQL y haga clic en Run a la izquierda.
CREATE DATABASE `my_catalog`.`order_dw`; USE `my_catalog`.`order_dw`; CREATE TABLE orders ( order_id BIGINT, user_id STRING, shop_id BIGINT, product_id BIGINT, buy_fee BIGINT, create_time TIMESTAMP, update_time TIMESTAMP, state INT ); CREATE TABLE orders_pay ( pay_id BIGINT, order_id BIGINT, pay_platform INT, create_time TIMESTAMP ); CREATE TABLE product_catalog ( product_id BIGINT, catalog_name STRING ); -- Insert test data INSERT INTO orders VALUES (100001, 'user_001', 12345, 1, 5000, TO_TIMESTAMP('2023-02-15 16:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100002, 'user_002', 12346, 2, 4000, TO_TIMESTAMP('2023-02-15 15:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100003, 'user_003', 12347, 3, 3000, TO_TIMESTAMP('2023-02-15 14:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100004, 'user_001', 12347, 4, 2000, TO_TIMESTAMP('2023-02-15 13:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100005, 'user_002', 12348, 5, 1000, TO_TIMESTAMP('2023-02-15 12:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100006, 'user_001', 12348, 1, 1000, TO_TIMESTAMP('2023-02-15 11:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100007, 'user_003', 12347, 4, 2000, TO_TIMESTAMP('2023-02-15 10:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1); INSERT INTO orders_pay VALUES (2001, 100001, 1, TO_TIMESTAMP('2023-02-15 17:40:56')), (2002, 100002, 1, TO_TIMESTAMP('2023-02-15 17:40:56')), (2003, 100003, 0, TO_TIMESTAMP('2023-02-15 17:40:56')), (2004, 100004, 0, TO_TIMESTAMP('2023-02-15 17:40:56')), (2005, 100005, 0, TO_TIMESTAMP('2023-02-15 18:40:56')), (2006, 100006, 0, TO_TIMESTAMP('2023-02-15 18:40:56')), (2007, 100007, 0, TO_TIMESTAMP('2023-02-15 18:40:56')); INSERT INTO product_catalog VALUES (1, 'phone_aaa'), (2, 'phone_bbb'), (3, 'phone_ccc'), (4, 'phone_ddd'), (5, 'phone_eee');NotaLas tablas creadas en este tutorial son tablas Paimon de solo anexión, las cuales no tienen claves primarias. Ofrecen un mejor rendimiento de escritura por lotes que las tablas con clave primaria, pero no admiten operaciones de actualización basadas en claves.
El resultado de la ejecución contendrá varias subpestañas, y el mensaje
The following statement has been executed successfully!indica que la sentencia DDL correspondiente se ejecutó correctamente.Las sentencias DML como INSERT devuelven un JobId, lo que indica que un trabajo de Flink se está ejecutando en la sesión de Flink. Haga clic en Flink UI a la izquierda de la pestaña Results para ver el estado de ejecución de estas sentencias SQL. Espere unos segundos a que finalicen.
-
Explore los datos de la tabla ODS.
En el editor de la pestaña Scripts, introduzca las siguientes sentencias SQL y haga clic en Run a la izquierda.
SELECT count(*) as order_count FROM `my_catalog`.`order_dw`.`orders`; SELECT count(*) as pay_count FROM `my_catalog`.`order_dw`.`orders_pay`; SELECT * FROM `my_catalog`.`order_dw`.`product_catalog`;Estas sentencias SQL también se ejecutan en la sesión de Flink. Puede consultar los resultados en sus respectivas páginas de resultados.
El valor
order_countde la tabla orders es 7. El valorpay_countde la tabla orders_pay es 7. La tabla product_catalog contiene 5 registros conproduct_iddel 1 al 5 y valores decatalog_namephone_aaa, phone_bbb, phone_ccc, phone_ddd y phone_eee, respectivamente.
Paso 2: Crear tablas DWD y DWS
En el editor de la pestaña Scripts, introduzca las siguientes sentencias SQL y haga clic en Run a la izquierda.
USE `my_catalog`.`order_dw`;
CREATE TABLE dwd_orders (
order_id BIGINT,
order_user_id STRING,
order_shop_id BIGINT,
order_product_id BIGINT,
order_product_catalog_name STRING,
order_fee BIGINT,
order_create_time TIMESTAMP,
order_update_time TIMESTAMP,
order_state INT,
pay_id BIGINT,
pay_platform INT COMMENT 'platform 0: phone, 1: pc',
pay_create_time TIMESTAMP
) WITH (
'sink.parallelism' = '2'
);
CREATE TABLE dws_users (
user_id STRING,
ds STRING,
total_fee BIGINT COMMENT 'Total amount paid on the current day'
) WITH (
'sink.parallelism' = '2'
);
CREATE TABLE dws_shops (
shop_id BIGINT,
ds STRING,
total_fee BIGINT COMMENT 'Total amount paid on the current day'
) WITH (
'sink.parallelism' = '2'
);
Las tablas creadas aquí también son tablas Paimon de solo anexión. Cuando se utiliza una tabla Paimon como sink de Flink, este no infiere automáticamente el paralelismo. Debe establecer explícitamente el paralelismo para evitar posibles errores.
Paso 3: Crear y desplegar los despliegues DWD y DWS
-
Cree y despliegue el despliegue DWD.
-
Cree el despliegue de actualización de la tabla DWD.
En la página , cree un blank batch draft llamado
dwd_orders. Se recomienda seleccionar una versión de motor con la etiqueta recomendada. Use el dialecto Flink SQL predeterminado. Copie la siguiente sentencia SQL en el editor. Dado que la tabla DWD es una tabla Paimon de solo anexión, utilice una sentenciaINSERT OVERWRITEpara sobrescribir toda la tabla.INSERT OVERWRITE my_catalog.order_dw.dwd_orders SELECT o.order_id, o.user_id, o.shop_id, o.product_id, c.catalog_name, o.buy_fee, o.create_time, o.update_time, o.state, p.pay_id, p.pay_platform, p.create_time FROM my_catalog.order_dw.orders as o, my_catalog.order_dw.product_catalog as c, my_catalog.order_dw.orders_pay as p WHERE o.product_id = c.product_id AND o.order_id = p.order_id En la esquina superior derecha de la página, haga clic en Deploy y luego en OK para desplegar el despliegue
dwd_orders.
-
-
Cree y despliegue los despliegues DWS.
-
Cree los despliegues de actualización de las tablas DWS.
Siguiendo los mismos pasos que para creating the DWD table update deployment, cree dos borradores por lotes llamados
dws_shopsydws_users. Copie las siguientes sentencias SQL en sus respectivos editores.INSERT OVERWRITE my_catalog.order_dw.dws_shops SELECT order_shop_id, DATE_FORMAT(pay_create_time, 'yyyyMMdd') as ds, SUM(order_fee) as total_fee FROM my_catalog.order_dw.dwd_orders WHERE pay_id IS NOT NULL AND order_fee IS NOT NULL GROUP BY order_shop_id, DATE_FORMAT(pay_create_time, 'yyyyMMdd');INSERT OVERWRITE my_catalog.order_dw.dws_users SELECT order_user_id, DATE_FORMAT(pay_create_time, 'yyyyMMdd') as ds, SUM(order_fee) as total_fee FROM my_catalog.order_dw.dwd_orders WHERE pay_id IS NOT NULL AND order_fee IS NOT NULL GROUP BY order_user_id, DATE_FORMAT(pay_create_time, 'yyyyMMdd'); En la esquina superior derecha de la página, haga clic en Deploy y luego en OK para desplegar los despliegues
dws_shopsydws_users.
-
Paso 4: Iniciar y consultar los despliegues DWD y DWS
-
Inicie el despliegue DWD y consulte sus datos.
-
Vaya a la página . Seleccione BATCH en la lista desplegable. Busque el despliegue
dwd_ordersy haga clic en Start en la columna Actions.Aparecerá una instancia de trabajo con estado STARTING en la lista de instancias de trabajo por lotes.
Cuando el estado de la instancia de trabajo cambie a FINISHED, el procesamiento de datos habrá finalizado.
-
Explore los resultados de los datos.
En el editor de la pestaña Scripts, introduzca la siguiente sentencia SQL y haga clic en Run a la izquierda para consultar los datos en la tabla DWD.
SELECT * FROM `my_catalog`.`order_dw`.`dwd_orders`;El resultado se muestra en la siguiente figura.

-
-
Inicie los despliegues DWS y consulte sus datos.
En la página , seleccione BATCH en la lista desplegable. Busque los despliegues
dws_shopsydws_users, y haga clic en Start en la columna Actions de cada uno.-
En el editor de la pestaña Scripts, introduzca las siguientes sentencias SQL y haga clic en Run a la izquierda para consultar los datos en las tablas DWS.
SELECT * FROM `my_catalog`.`order_dw`.`dws_shops`; SELECT * FROM `my_catalog`.`order_dw`.`dws_users`;Los resultados se muestran en las siguientes figuras.

Paso 5: Construir un pipeline por lotes con orquestación de tareas
En este paso, orquestará los despliegues en un flujo de trabajo, lo que permite activarlos conjuntamente y ejecutarlos en secuencia.
-
Cree un flujo de trabajo.
En el panel de navegación izquierdo, elija y luego haga clic en Create Workflow.
En el panel que aparece, introduzca
wf_orderscomo nombre. Mantenga el tipo de programación predeterminado (Manual Scheduling), seleccionedefault-queuepara la Resource Queue y luego haga clic en Create para abrir el editor de flujos de trabajo.-
Edite el flujo de trabajo.
Haga clic en el nodo inicial, asígnele el nombre
v_dwd_ordersy seleccione el desplieguedwd_orderspara dicho nodo.Haga clic en Add Task para crear un nodo llamado
v_dws_shops. Seleccione el desplieguedws_shopspara este nodo y configurev_dwd_orderscomo nodo ascendente.Haga clic nuevamente en Add Task para crear un nodo llamado
v_dws_users. Seleccione el desplieguedws_userspara este nodo y configurev_dwd_orderscomo nodo ascendente.En la esquina superior derecha, haga clic en Save y luego en OK.
-
Active manualmente el flujo de trabajo.
NotaTambién puede configurar el flujo de trabajo para que se ejecute según una programación periódica. En la página Workflows, haga clic en Edit Workflow a la derecha del flujo de trabajo y cambie el modo de programación a Periodic Scheduling. Para obtener más información, consulte Task orchestration (Public Preview).
-
Antes de activar el flujo de trabajo, inserte nuevos datos en las tablas ODS para verificar los resultados de ejecución del flujo.
En el editor de la pestaña Scripts, introduzca las siguientes sentencias SQL y haga clic en Run a la izquierda.
USE `my_catalog`.`order_dw`; INSERT INTO orders VALUES (100008, 'user_001', 12346, 1, 10000, TO_TIMESTAMP('2023-02-15 17:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100009, 'user_002', 12347, 2, 20000, TO_TIMESTAMP('2023-02-15 18:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100010, 'user_003', 12348, 3, 30000, TO_TIMESTAMP('2023-02-15 19:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1); INSERT INTO orders_pay VALUES (2008, 100008, 1, TO_TIMESTAMP('2023-02-15 20:40:56')), (2009, 100009, 1, TO_TIMESTAMP('2023-02-15 20:40:56')), (2010, 100010, 1, TO_TIMESTAMP('2023-02-15 20:40:56'));Haga clic en Flink UI a la izquierda de la pestaña Results para supervisar el estado del trabajo.
-
En la página , busque el flujo de trabajo creado en el paso anterior, haga clic en Execute en la columna Actions y luego en OK para activar el flujo de trabajo.
Haga clic en el nombre del flujo de trabajo para ir a la página Overview, donde puede consultar la lista de instancias del flujo de trabajo.
Haga clic en el ID de la instancia del flujo de trabajo en ejecución para ir a su página de detalles de ejecución y observar el estado de cada nodo. Espere a que finalice todo el flujo de trabajo.
-
-
Consulte los resultados de ejecución del flujo de trabajo.
-
En el editor de la pestaña Scripts, introduzca las siguientes sentencias SQL y haga clic en Run a la izquierda.
SELECT * FROM `my_catalog`.`order_dw`.`dws_shops`; SELECT * FROM `my_catalog`.`order_dw`.`dws_users`; -
Revise los resultados de ejecución del flujo de trabajo.
Podrá observar que el flujo de trabajo ha procesado los nuevos datos de la capa ODS y los ha escrito en las tablas DWS.

-
Documentos relacionados
Para obtener más información sobre los principios y el ajuste de configuración del procesamiento por lotes de Flink, consulte Flink batch processing tuning guide.
Para construir un lakehouse de datos de streaming mediante Flink y Paimon, consulte Build a streaming data lakehouse with Paimon and StarRocks.
Además de desarrollar trabajos de Flink en la consola de Realtime Compute for Apache Flink, también puede desarrollar estos trabajos localmente. Para obtener más información, consulte Develop with the VS Code extension.