Os grandes dados evoluíram significativamente desde sua criação no final dos anos 2000. Muitas organizações rapidamente se adaptaram à tendência e construíram suas plataformas de big data usando ferramentas de código aberto como o Apache Hadoop. Mais tarde, essas empresas começaram a enfrentar dificuldades para gerenciar as necessidades de processamento de dados que evoluíam rapidamente. Elas enfrentaram desafios para lidar com mudanças no nível de esquema, evolução de esquemas de partição e voltar no tempo para analisar os dados.
Eu enfrentei desafios semelhantes ao projetar sistemas distribuídos em larga escala na década de 2010 para uma grande empresa de tecnologia e um cliente do setor de saúde. Algumas indústrias precisam dessas capacidades para aderir às regulamentações de bancos, finanças e saúde. Empresas pesadamente orientadas a dados, como a Netflix, também enfrentaram desafios semelhantes. Elas inventaram um formato de tabela chamado “Iceberg”, que se posiciona sobre os arquivos de dados existentes e oferece recursos principais ao aproveitar sua arquitetura. Isso rapidamente se tornou o principal projeto da ASF, à medida que ganhou rápido interesse na comunidade de dados. Neste artigo, explorarei os 5 principais recursos do Apache Iceberg com exemplos e diagramas.
1. Viagem no Tempo
Figura 1: Viagem no tempo no formato de tabela do Apache Iceberg (imagem criada pelo autor)
Esse recurso permite que você consulte seus dados como eles existem em qualquer momento. Isso abrirá novas possibilidades para analistas de dados e negócios entenderem tendências e como os dados evoluíram ao longo do tempo. Você pode facilmente voltar a um estado anterior em caso de erros. Esse recurso também facilita verificações de auditoria, permitindo que você analise os dados em um ponto específico no tempo.
-- time travel to October 5th, 1978 at 07:00:00
SELECT * FROM prod.retail.cusotmers TIMESTAMP AS OF '1978-10-05 07:00:00';
-- time travel using a specific snapshot ID:
SELECT * FROM prod.retail.customers VERSON AS OF 949530903748831869;
2. Evolução do Esquema
A evolução do esquema do Apache Iceberg permite alterações em seu esquema sem grandes esforços ou migrações custosas. À medida que as necessidades do seu negócio evoluem, você pode:
- Adicionar e remover colunas sem qualquer tempo de inatividade ou reescritas de tabela.
- Atualizar a coluna (ampliando).
- Mudar a ordem das colunas.
- Renomear uma coluna existente.
Essas mudanças são tratadas no nível de metadados sem necessidade de reescrever os dados subjacentes.
-- add a new column to the table
ALTER TABLE prod.retail.customers ADD COLUMNS (email_address STRING);
-- remove an existing column from the table
ALTER TABLE prod.retail.customers DROP COLUMN num_of_years;
-- rename an existing column
ALTER TABLE prod.retail.customers RENAME COLUMN email_address TO email;
-- iceberg allows updating column types from int to bigint, float to double
ALTER TABLE prod.retail.customers ALTER COLUMN customer_id TYPE bigint;
3. Evolução de Partições
Usando o formato de tabela do Apache Iceberg, você pode alterar a estratégia de particionamento da tabela sem reescrever a tabela subjacente ou migrar os dados para uma nova tabela. Isso é possível pois as consultas não fazem referência aos valores de partição diretamente como no Apache Hadoop. O Iceberg mantém informações de metadados para cada versão de partição separadamente. Isso facilita a obtenção das divisões ao consultar os dados. Por exemplo, consultar uma tabela com base no intervalo de datas, enquanto a tabela estava usando o mês como coluna de partição (antes) como uma divisão e o dia como nova coluna de partição (depois) como outra divisão. Isso é chamado de planejamento de divisão. Veja o exemplo abaixo.
-- create customers table partitioned by month of the create_date initially
CREATE TABLE local.retail.customer (
id BIGINT,
name STRING,
street STRING,
city STRING,
state STRING,
create_date DATE
USING iceberg
PARTITIONED BY (month(create_date));
-- insert some data into the table
INSERT INTO local.retail.customer VALUES
(1, 'Alice', '123 Maple St', 'Springfield', 'IL', DATE('2024-01-10')),
(2, 'Bob', '456 Oak St', 'Salem', 'OR', DATE('2024-02-15')),
(3, 'Charlie', '789 Pine St', 'Austin', 'TX', DATE('2024-02-20'));
-- change the partition scheme from month to date
ALTER TABLE local.retail.customer
REPLACE PARTITION FIELD month(create_date) WITH days(create_date);
-- insert couple more records
INSERT INTO local.retail.customer VALUES
(4, 'David', '987 Elm St', 'Portland', 'ME', DATE('2024-03-01')),
(5, 'Eve', '654 Birch St', 'Miami', 'FL', DATE('2024-03-02'));
-- select all columns from the table
SELECT * FROM local.retail.customer
WHERE create_date BETWEEN DATE('2024-01-01') AND DATE('2024-03-31');
-- output
1 Alice 123 Maple St Springfield IL 2024-01-10
5 Eve 654 Birch St Miami FL 2024-03-02
4 David 987 Elm St Portland ME 2024-03-01
2 Bob 456 Oak St Salem OR 2024-02-15
3 Charlie 789 Pine St Austin TX 2024-02-20
-- View parition details
SELECT partition, file_path, record_count
FROM local.retail.customer.files;
-- output
{"create_date_month":null,"create_date_day":2024-03-02} /Users/rellaturi/warehouse/retail/customer/data/create_date_day=2024-03-02/00000-6-ae2fdf0d-5567-4c77-9bd1-a5d9f6c83dfe-0-00002.parquet 1
{"create_date_month":null,"create_date_day":2024-03-01} /Users/rvellaturi/warehouse/retail/customer/data/create_date_day=2024-03-01/00000-6-ae2fdf0d-5567-4c77-9bd1-a5d9f6c83dfe-0-00001.parquet 1
{"create_date_month":648,"create_date_day":null} /Users/rvellaturi/warehouse/retail/customer/data/create_date_month=2024-01/00000-3-64c8b711-f757-45b4-828f-553ae9779d14-0-00001.parquet 1
{"create_date_month":649,"create_date_day":null} /Users/rvellaturi/warehouse/retail/customer/data/create_date_month=2024-02/00000-3-64c8b711-f757-45b4-828f-553ae9779d14-0-00002.parquet 2
4. Transações ACID
Iceberg oferece um suporte robusto para transações em termos de Atomicidade, Consistência, Isolamento e Durabilidade (ACID). Ele permite múltiplas operações de escrita concorrentes, o que possibilita uma alta taxa de transferência em trabalhos intensivos em dados sem comprometer a consistência dos dados.
-- Start a transaction
START TRANSACTION;
-- Insert new records
INSERT INTO customers VALUES (1, 'John'), (2, 'Mike');
-- Update existing records
UPDATE customers SET column1 = 'Josh' WHERE id = 1;
-- Delete records
DELETE FROM customers WHERE id = 2;
-- Commit the transaction
COMMIT;
Todas as operações no Iceberg são transacionais, o que significa que os dados permanecem consistentes apesar de falhas ou modificações nos dados de forma concorrente.
-- Atomic update across multiple tables
START TRANSACTION;
UPDATE orders SET status = 'processed' WHERE order_id = 100;
INSERT INTO orders_processed SELECT * FROM orders WHERE order_id = 100;
COMMIT;
Ele também suporta diferentes níveis de isolamento, o que permite equilibrar desempenho e consistência com base na necessidade.
-- Set isolation level (syntax may vary depending on the query engine)
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- Perform operations
SELECT * FROM customers WHERE id = 1;
UPDATE customers SET rec_status= 'updated' WHERE id = 1;
COMMIT;
Aqui está um resumo mostrando como o Iceberg lida com atualizações e exclusões em nível de linha.
Figura 2: Processo de exclusão de registros no Apache Iceberg (imagem criada pelo autor)
5. Operações Avançadas em Tabelas
O Iceberg suporta operações avançadas em tabelas, como:
- Criar/gerenciar snapshots de tabelas: Isso proporciona a capacidade de ter um controle de versão robusto.
- Planejamento e execução de consultas rápidas com seus metadados altamente otimizados
- Ferramentas integradas para manutenção de tabelas, como compactação e limpeza de arquivos órfãos
O Iceberg foi projetado para trabalhar com todos os principais armazenamento em nuvem, como AWS S3, GCS e Azure Blob Storage. Além disso, o Iceberg integra-se facilmente com motores de processamento de dados, como Spark, Presto, Trino e Hive.
Considerações Finais
Esses recursos destacados permitem que as empresas construam lagos de dados modernos, flexíveis, escaláveis e eficientes, que podem fazer viagens no tempo, lidar facilmente com mudanças de esquema, suportar transações ACID e evolução de partições.
Source:
https://dzone.com/articles/key-features-of-apache-iceberg-for-data-lakes