Este tópico apresenta o passo a passo para construir um pipeline de analytics de lakehouse unificado stream-batch usando materialized tables. Você também aprenderá a alternar entre processamento batch e stream ajustando a frequência de atualização de uma materialized table para habilitar atualizações de dados em tempo real.
O que é uma materialized table?
Uma materialized table é um novo tipo de tabela introduzido no Flink SQL para simplificar pipelines de dados tanto para processamento batch quanto stream, entregando uma experiência de desenvolvimento unificada. Ao criar uma materialized table, não é necessário declarar campos nem seus tipos. Em vez disso, especifique a frequência de atualização desejada e uma instrução de consulta. O motor Flink infere automaticamente o schema a partir da consulta e cria o pipeline de atualização de dados correspondente para atender ao requisito especificado. Para mais informações, consulte Materialized Table Management.
Diagrama do Pipeline de Lakehouse em Tempo Real
O Flink grava dados das fontes no Paimon para formar a camada Operational Data Store (ODS).
O Flink enriquece e amplia os dados da camada ODS por meio de joins entre tabelas e grava o resultado em uma materialized table para formar a camada Data Warehouse Detail (DWD).
Múltiplas materialized tables com diferentes configurações de atualização executam agregações de negócio multidimensionais para formar a camada Data Warehouse Service (DWS), que atende às consultas das aplicações.
Pré-requisitos
Você criou um workspace do Flink. Para mais informações, consulte Activate Realtime Compute for Apache Flink.
Se você acessa recursos como usuário RAM ou função RAM (Resource Access Management), confirme que possui as permissões necessárias para o console do Flink. Para mais informações, consulte Permission Management.
Etapa 1: Preparar dados de teste
-
Crie um Paimon Catalog.
As materialized tables são viabilizadas pelo Apache Paimon. É necessário criar um Paimon Catalog com o tipo de metastore Filesystem . Pule esta etapa se você já tiver um. Para mais informações, consulte Create a Paimon Catalog.
-
Crie a tabela de log comportamental do usuário ods_user_log e a tabela de informações de produtos ods_dim_product.
Acesse o Realtime Compute Management Console.
Clique em Console na coluna Actions do workspace desejado.
-
No painel de navegação à esquerda, escolha . Copie e cole o seguinte código para criar as tabelas source.
Este exemplo assume que você já criou um Paimon Catalog chamado paimon e está usando o banco de dados padrão (default).
CREATE TABLE `paimon`.`default`.`ods_user_log` ( item_id INT NOT NULL, user_id INT NOT NULL, vtime TIMESTAMP(6), ds VARCHAR(10) NOT NULL ) PARTITIONED BY(ds) WITH ( 'bucket' = '4', -- Set the number of buckets to 4. 'bucket-key' = 'item_id' -- Specify the key used to determine bucket assignment. Rows with the same item_id go into the same bucket. ); CREATE TABLE `paimon`.`default`.`ods_dim_product` ( item_id INT NOT NULL, title VARCHAR(255), pict_url VARCHAR(255), brand_id INT, seller_id INT, PRIMARY KEY(item_id) NOT ENFORCED ) WITH ( 'bucket' = '4', 'bucket-key' = 'item_id' ); Clique em Run no canto superior direito para criar as tabelas.
No painel de navegação à esquerda, escolha Catalogs, clique no seu Paimon Catalog e, em seguida, clique em Refresh para visualizar as novas tabelas.
-
Use o Faker connector for simulated data generation para gerar dados simulados e gravá-los nas tabelas Paimon.
No painel de navegação à esquerda, escolha .
Clique em New, selecione Blank stream draft, clique em Next e, em seguida, clique em Create.
-
Copie a seguinte instrução SQL para o editor SQL.
CREATE TEMPORARY TABLE `user_log` ( item_id INT, // Product ID user_id INT, // User ID vtime TIMESTAMP, ds AS DATE_FORMAT(CURRENT_DATE,'yyyyMMdd') ) WITH ( 'connector' = 'faker', -- Faker connector 'fields.item_id.expression'='#{number.numberBetween ''0'',''1000''}', -- Generate a random number between 0 and 1000 'fields.user_id.expression'='#{number.numberBetween ''0'',''100''}', 'fields.vtime.expression'='#{date.past ''5'',''HOURS''}', -- Generate data up to 5 hours before the current time 'rows-per-second' = '3' -- Generate 3 rows per second ); CREATE TEMPORARY TABLE `dim_product` ( item_id INT NOT NULL, title VARCHAR(255), pict_url VARCHAR(255), brand_id INT, seller_id INT, PRIMARY KEY(item_id) NOT ENFORCED ) WITH ( 'connector' = 'faker', -- Faker connector 'fields.item_id.expression'='#{number.numberBetween ''0'',''1000''}', 'fields.title.expression'='#{book.title}', 'fields.pict_url.expression'='#{internet.domainName}', 'fields.brand_id.expression'='#{number.numberBetween ''1000'',''10000''}', 'fields.seller_id.expression'='#{number.numberBetween ''1000'',''10000''}', 'rows-per-second' = '3' -- Generate 3 rows per second ); BEGIN STATEMENT SET; INSERT INTO `paimon`.`default`.`ods_user_log` SELECT item_id, user_id, vtime, CAST(ds AS VARCHAR(10)) AS ds FROM `user_log`; INSERT INTO `paimon`.`default`.`ods_dim_product` SELECT item_id, title, pict_url, brand_id, seller_id FROM `dim_product`; END; Clique em Deploy no canto superior direito para implantar o job.
No painel de navegação à esquerda, escolha . Clique em Start na coluna Actions do job desejado, selecione Initial Mode e clique em Start.
-
Consulte os dados simulados.
No painel de navegação à esquerda, escolha . Copie a seguinte instrução SQL para o editor SQL e clique em Run no canto superior direito.
SELECT * FROM `paimon`.`default`.ods_dim_product LIMIT 10; SELECT * FROM `paimon`.`default`.ods_user_log LIMIT 10;
Etapa 2: Criar materialized tables
Esta seção constrói uma materialized table da camada DWD chamada dwd_user_log_product ampliando as tabelas source. Em seguida, cria materialized tables downstream com base na dwd_user_log_product para realizar agregações de negócio, completando a camada DWS.
-
Construa a camada DWD do data warehouse criando a materialized table dwd_user_log_product.
No painel de navegação à esquerda, escolha Catalogs e clique no Paimon Catalog desejado.
-
Clique no banco de dados desejado (neste exemplo, default) e, em seguida, clique em Create Materialized Table. Copie a seguinte instrução SQL para o editor SQL e clique em Create.
-- DWD layer widening logic CREATE MATERIALIZED TABLE dwd_user_log_product( PRIMARY KEY (item_id) NOT ENFORCED ) PARTITIONED BY(ds) WITH ( 'partition.fields.ds.date-formatter' = 'yyyyMMdd' ) FRESHNESS = INTERVAL '1' HOUR -- Refresh every hour AS SELECT l.ds, l.item_id, l.user_id, l.vtime, r.brand_id, r.seller_id FROM `paimon`.`default`.`ods_user_log` l INNER JOIN `paimon`.`default`.`ods_dim_product` r ON l.item_id = r.item_id;
-
Construa a camada DWS executando agregações de negócio multidimensionais com base na materialized table dwd_user_log_product.
Este tópico demonstra como criar a materialized table dws_overall, que agrega contagens de PV/UV por hora ao longo do dia. Siga a etapa anterior para criar a materialized table dws_overall.
// Aggregate PV/UV by day CREATE MATERIALIZED TABLE dws_overall( PRIMARY KEY(ds, hh) NOT ENFORCED ) PARTITIONED BY(ds) WITH ( 'partition.fields.ds.date-formatter' = 'yyyyMMdd' ) FRESHNESS = INTERVAL '1' HOUR -- Refresh every hour AS SELECT ds, COALESCE(hh, 'day') AS hh, count(*) AS pv, count(distinct user_id) AS uv FROM (SELECT ds, date_format(vtime, 'HH') AS hh, user_id FROM `paimon`.`default`.`dwd_user_log_product`) tmp GROUP BY GROUPING SETS(ds, (ds, hh));
Etapa 3: Atualizar materialized tables
Iniciar atualização
A frequência de atualização de dados neste exemplo está definida para 1 hora. Após clicar em Start, as atualizações de dados ficarão defasadas em relação às atualizações da tabela base por pelo menos 1 hora.
No painel de navegação à esquerda, escolha e pesquise pela materialized table desejada.
Clique na view da materialized table e, em seguida, clique em Start no canto inferior direito da página.
Repreenchimento de dados
O repreenchimento de dados regrava dados históricos em partições específicas ou em toda a tabela. Use este recurso para corrigir resultados de processamento stream ou para atualizar imediatamente os dados de jobs batch que ainda não atingiram o horário programado.
Selecione a view da materialized table dwd_user_log_product e clique em Trigger Update no canto inferior direito. Insira a data atual (por exemplo, 20241216) como nome da partição, marque Cascade update downstream materialized table e clique em Confirm. Na caixa de diálogo de confirmação, clique em Confirm para sobrescrever os dados imediatamente.
Para mais informações sobre repreenchimento de dados, consulte Backfill historical data.
Modificar a frequência de atualização de dados
Ajuste a frequência de atualização de dados para atualizar as materialized tables diariamente, por hora, por minuto ou até por segundo, conforme as necessidades do seu negócio.
Atualize as configurações de atualização das materialized tables dwd_user_log_product e dws_overall. Clique na view da materialized table e, em seguida, clique em Modify Freshness no canto inferior direito. Defina a frequência de atualização para o nível de minutos para obter atualizações em tempo real.
Para mais informações sobre como modificar a frequência de atualização de dados, consulte Modify data freshness.
Etapa 4: Consultar materialized tables
Prévia de dados
É possível visualizar as últimas 100 linhas de uma materialized table.
No painel de navegação à esquerda, escolha e pesquise pela materialized table desejada.
Clique na view da materialized table e, em seguida, clique em Details no canto inferior direito da página.
Na aba Data Preview da materialized table, clique no ícone Query.
Consulta de dados
No painel de navegação à esquerda, escolha . Copie a seguinte instrução SQL para o editor SQL, selecione o trecho de código e clique em Run para consultar a materialized table dws_overall.
SELECT * FROM `paimon`.`default`.dws_overall ORDER BY hh;
Referências
Para mais informações sobre materialized tables, consulte Materialized Table Management.
Para mais informações sobre como criar e usar materialized tables, consulte Create and use materialized tables.