Definição
O estágio $iceberg especifica uma conexão no Registro de Conexão a um bucket Amazon Web Services S3 onde você pode gravar dados em uma tabela Apache Iceberg.
Colocação
$iceberg deve ser o último estágio de qualquer pipeline em que apareça. Você pode usar apenas um estágio $iceberg por pipeline.
Sintaxe
O estágio de pipeline do $iceberg tem a seguinte forma de protótipo:
{ "$iceberg": { "connectionName": "<registered-connection>", "bucket": "<target-bucket>", "databaseName": "<database>", "tableName": "<string>" | <expression>, "path": "<key-prefix>", "region": "<target-region>", "mode": "cdc" | "insert", "idFieldName": "<field-name>", "partitionedBy": { "<column-name>": "<partition-transform>", . . . }, "catalog": { "type": "hadoop" | "glue" } } }
O estágio $iceberg recebe um documento com os seguintes campos:
Campo | Tipo | necessidade | Descrição |
|---|---|---|---|
| string | Obrigatório | Nome da conexão do Amazon Web Services S3 a ser usada para leitura e gravação. Isso deve corresponder ao nome da conexão no Registro de Conexões. |
| string | Obrigatório | Nome do bucket S3 que contém o banco de dados Apache Iceberg de destino. |
| string | Obrigatório | Nome do banco de dados Apache Iceberg que contém a tabela de destino. |
| corda | expressão | Obrigatório | Nome da tabela de destino Apache Iceberg. Deve ser uma string ou uma expressão que avalie para uma string. Use expressões para roteamento dinâmico por documento. |
| string | Obrigatório | Chave de prefixo do caminho para seu banco de dados Apache Iceberg. |
| string | Condicional | Região do AWS do bucket. Necessário para processadores de fluxo não executados no AWS. |
| string | Opcional | Estratégia para determinar qual operação executar por documento de entrada.
Padrão é |
| string | Opcional | Nome do campo e da coluna usado como chave de linha no modo Padrão é |
| documento | Opcional | Especificação de particionamento. Se você não definir esse campo, Deve ser um documento contendo um ou mais pares de chave-valor. Cada chave deve ser o nome de uma coluna em relação à qual executar uma transformação de partição, e cada valor deve ser a transformação de partição a ser usada. A primeira transformação de partição deve ser contra O valor de transformação de partição de um determinado campo deve ser um dos seguintes:
Para obter mais informações sobre as transformações de partição do Apache Iceberg, consulte a documentação do Apache Iceberg. |
| documento | Opcional | Documento que define o catálogo Iceberg a ser usado. Deve ser um documento que contenha o campo |
Comportamento
Se você usar o estágio $iceberg, ele deverá ser o último estágio do seu processador de fluxo.
O Atlas Stream Processing suporta o estágio $iceberg apenas para processadores de stream SP10, SP30 e SP50. Seu tier de processador determina o número máximo de tabelas suportadas para roteamento dinâmico:
Nível | Tabelas máximas |
|---|---|
SP10 | 5 |
SP30 | 10 |
SP50 | 50 |
O estágio $iceberg infere o esquema da tabela Apache Iceberg resultante do esquema dos dados de saída do processador de stream. À medida que o Atlas Stream Processing observa novos campos no stream, o esquema da tabela evolui de acordo.
Se você especificar uma tabela que ainda não existe, o Apache Iceberg criará a tabela quando receber a primeira mensagem destinada a ela.
O Atlas Stream Processing garante o processamento de pelo menos uma vez para saída para tabelas Apache Iceberg.
Você pode usar uma expressão dinâmica como o valor do campo tableName. Ao usar uma expressão dinâmica para capturar valores específicos do documento, você pode rotear documentos de entrada para diferentes tabelas de acordo com esses valores. A expressão deve ser avaliada como uma string. Para obter um exemplo, consulte Roteamento dinâmico. Para saber mais, consulte operadores de expressão.
Se você especificar um tópico com uma expressão dinâmica, mas o Atlas Stream Processing não puder avaliar a expressão de uma determinada mensagem, ele enviará essa mensagem para a fila de mensagens não entregues (DLQ), se ela estiver configurada, e processará as mensagens subsequentes. Se não houver uma fila de mensagens não entregues (DLQ) configurada, o Atlas Stream Processing ignorará completamente a mensagem e processará as mensagens subsequentes.
conversão de tipo
O Atlas Stream Processing executa a conversão de tipo de BSON para tipos primitivos Iceberg ao gravar em tabelas no estágio $iceberg.
BSON | Apache Iceberg Primitivo | Detalhes |
|---|---|---|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| Codificado em hexadecimal |
|
| UUID stringificado |
|
| Não se aplica ao UUID |
|
| Horário UTC, medido em microssegundos |
|
| Horário UTC, medida em microssegundos |
|
| Serializado como uma string JSON básica |
|
| Serializado como uma string JSON básica |
Outros BSON types não são suportados. O Atlas Stream Processing envia documentos com BSON types não suportados para o DLQ.
Exemplos
Os exemplos a seguir ilustram vários aplicativos do estágio $iceberg.
Arquivando um Changestream
O exemplo a seguir demonstra como gravar o conteúdo inicial e o changestream de um banco de dados Atlas em uma tabela Apache Iceberg de forma somente anexa, criando um arquivo durável do histórico operacional desse banco de dados. Esta agregação tem duas etapas:
O estágio
$sourceestabelece uma conexão com o banco de dados Atlas, visando especificamente a coleçãoordersno banco de dadosdb. Ele permite que a sincronização inicial capture documentos no banco de dados no momento da ativação do processador e garante que o documento completo seja capturado por cada evento de changestream.O estágio
$icebergestabelece uma conexão com o bucket AWS S3, gravando em uma tabela chamadamyTableno caminhoiceberg-warehouse/. Ao especificar apenasinsertoperações, ele garante um fluxo de gravação somente de acréscimo, estilo log.
{ "$source": { "connectionName": "atlas1", "db": "db", "coll": "orders", "initialSync": { "enable": true }, "config": { "fullDocument": "required" } }, "$iceberg": { "connectionName": "myS3Connection", "bucket": "myData", "path": "iceberg-warehouse/", "tableName": "myTable", "mode": "insert" } }
Espelhando uma coleção
O exemplo a seguir demonstra como espelhar uma coleção do Atlas em sua totalidade para uma tabela Apache Iceberg.
Antes de definir a agregação, defina a seguinte variável:
const isDeleteExpr = {$eq: [{$meta: "stream.source.operationType"}, "delete"]};
A agregação a seguir adiciona, atualizar e excluir entradas de tabela Apache Iceberg em sincronização com as alterações na coleção de origem do Atlas. Tem quatro etapas:
O estágio
$sourceestabelece uma conexão com o banco de dados Atlas, visando especificamente a coleçãoordersno banco de dadosdb. Ele permite que a sincronização inicial capture documentos no banco de dados no momento da ativação do processador e garante que o documento completo seja capturado por cada evento de changestream.A etapa
$matchfiltraoperationTypepara que apenas documentos com declarações de tipo de operação válidas sejam processados.A fase
$replaceRootaltera a raiz do documento dependendo do tipo de operação.Para operações de exclusão, ele altera a raiz do documento para a chave do documento. Isso resulta em um registro de que o documento foi excluído, mas exclui seu conteúdo em processamento posterior.
Para todas as outras operações, ele altera a raiz do documento para o
fullDocument, passando o conteúdo do documento para em processamento adicional, excluindo metadados de fluxo de alteração.
O estágio
$icebergestabelece uma conexão com o bucket AWS S3, gravando em uma tabela Apache Iceberg chamadamyTableno caminhoiceberg-warehouse/. No modocdc, este estágio determina a operação a ser executada na tabela Apache Iceberg lendo o campo de metadadosstream.source.operationTypede cada documento.
{ "$source": { "connectionName": "atlas1", "db": "db", "coll": "orders", "initialSync": { "enable": true }, "config": { "fullDocument": "required" } }, "$match": { "operationType": { "$in": ["insert", "update", "delete", "replace"] } }, "$replaceRoot": { "newRoot": { "$cond": { "if": isDeleteExpr, "then": "$documentKey", "else": "$fullDocument" } } } "$iceberg": { "connectionName": "myS3Connection", "bucket": "myData", "path": "iceberg-warehouse/", "tableName": "myTable", "mode": "cdc" } }
De fonte de várias coleções para destino de várias tabelas Apache Iceberg
No exemplo a seguir, o Atlas Stream Processing usa expressões dinâmicas para rotear dinamicamente documentos para vários destinos de saída.
O estágio
$sourceestabelece uma conexão com o banco de dados Atlas, visando especificamente as coleçõesa,becno banco de dadosdb. Ele permite que a sincronização inicial capture documentos no banco de dados no momento da ativação do processador e garante que o documento completo seja capturado por cada evento de changestream.O estágio
$matchfiltra documentos cujooperationTypeé um de"insert","update","delete"ou"replace".A fase
$replaceRootaltera a raiz do documento dependendo do tipo de operação.Para operações de exclusão, ele altera a raiz do documento para a chave do documento. Isso resulta em um registro de que o documento foi excluído, mas exclui seu conteúdo em processamento posterior.
Para todas as outras operações, ele altera a raiz do documento para o
fullDocument, passando o conteúdo do documento para em processamento adicional, excluindo metadados de fluxo de alteração.
O estágio
$icebergestabelece uma conexão com o bucket AWS S3 chamadomyData, gravando em uma tabela Apache Iceberg no caminhoiceberg-warehouse/. Ele determina o nome da tabela de acordo com o nome da origemcollectionconforme recuperado dos metadados do documento. Ele também determina a operação a ser executada de acordo com os metadados do documento.
{ "$source": { "connectionName": "atlas1", "db": "db", "coll": ["a", "b", "c"], "initialSync": { "enable": true }, "config": { "fullDocument": "required" } } }, { "$match": { "operationType": { "$in": ["insert", "update", "delete", "replace"] } } }, { "$replaceRoot": { "newRoot": { "$cond": { "if": { "$eq": [{ "$meta": "stream.source.operationType" }, "delete"] }, "then": "$documentKey", "else": "$fullDocument" } } } }, { "$iceberg": { "connectionName": "myS3Connection", "databaseName": "iceberg-db", "bucket": "myData", "path": "iceberg-warehouse/", "tableName": { "$meta": "stream.source.ns.coll" }, "mode": "cdc" } }