Definición
La $iceberg etapa especifica una conexión en el Registro de conexiones a un bucket S3 de AWS donde puede escribir datos en una tabla de Apache Iceberg.
Ubicación
$iceberg Debe ser la última etapa de cualquier canalización en la que aparezca. Solo se puede usar una etapa $iceberg por canalización.
Sintaxis
La etapa de canalización $iceberg tiene la siguiente forma prototipo:
{ "$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" } } }
La etapa $iceberg procesa un documento con los siguientes campos:
Campo | Tipo | Necesidad | Descripción |
|---|---|---|---|
| string | Requerido | Nombre de la conexión AWS S3 que se utilizará para lecturas y escrituras. Este nombre debe coincidir con el nombre de la conexión en el Registro de conexiones. |
| string | Requerido | Nombre del bucket S que3 contiene la base de datos Apache Iceberg de destino. |
| string | Requerido | Nombre de la base de datos Apache Iceberg que contiene la tabla de destino. |
| string | expresión | Requerido | Nombre de la tabla de destino de Apache Iceberg. Debe ser una cadena de texto o una expresión que se evalúe como una cadena de texto. Utilice expresiones para el enrutamiento dinámico por documento. |
| string | Requerido | Clave de prefijo de la ruta a su base de datos Apache Iceberg. |
| string | Condicional | Región deAWS del bucket. Requerido para los procesadores de flujo que no se ejecutan en AWS. |
| string | Opcional | Estrategia para determinar qué operación realizar por cada documento de entrada.
Se establece por defecto en |
| string | Opcional | Nombre del campo y de la columna utilizados como clave de fila en el modo Se establece por defecto en |
| Documento | Opcional | Especificación de particionamiento. Si no configura este campo, Debe ser un documento que contenga uno o más pares clave-valor. Cada clave debe ser el nombre de una columna sobre la cual realizar una transformación de partición, y cada valor debe ser la transformación de partición a utilizar. La primera transformación de partición debe aplicarse a El valor de transformación de partición de un campo determinado debe ser uno de los siguientes:
Para obtener más información sobre las transformaciones de particiones de Apache Iceberg, consulte la documentación de Apache Iceberg. |
| Documento | Opcional | Documento que define el catálogo Iceberg a utilizar. Debe ser un documento que contenga el |
Comportamiento
Si utiliza la etapa $iceberg, debe ser la última etapa de su procesador de flujo.
Atlas Stream Processing admite la etapa $iceberg solo para los procesadores de flujo SP10, SP30 y SP50. Su nivel de procesador determina la cantidad máxima de tablas admitidas para el enrutamiento dinámico:
Nivel | Tablas máximas |
|---|---|
SP10 | 5 |
SP30 | 10 |
SP50 | 50 |
La $iceberg etapa infiere el esquema de la tabla resultante de Apache Iceberg a partir del esquema de los datos de salida del procesador de flujo. A medida que Atlas Stream Processing detecta nuevos campos en el flujo, el esquema de la tabla evoluciona en consecuencia.
Si especifica una tabla que aún no existe, Apache Iceberg la crea cuando recibe el primer mensaje que la tiene como objetivo.
Atlas Stream Processing garantiza el procesamiento al menos una vez para la salida a las tablas de Apache Iceberg.
Puede utilizar una expresión dinámica como valor del tableName campo. Al usar una expresión dinámica para capturar valores específicos del documento, puede enrutar los documentos de entrada a diferentes tablas según estos valores. La expresión debe evaluarse como una cadena. Para ver un ejemplo, consulte Enrutamiento dinámico. Para obtener más información, consulte Operadores de expresiones.
Si se especifica un tema con una expresión dinámica, pero Atlas Stream Processing no puede evaluar la expresión para un mensaje determinado, lo envía a la cola de mensajes no entregados (si está configurada) y procesa los mensajes subsiguientes. Si no hay ninguna cola de mensajes no entregados configurada, Atlas Stream Processing omite el mensaje por completo y procesa los mensajes subsiguientes.
Conversión de tipo
Atlas Stream Processing realiza una conversión de tipos de BSON a tipos primitivos Iceberg al escribir en tablas en la $iceberg etapa.
BSON | Apache Iceberg Primitivo | Detalles |
|---|---|---|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| Codificado en hexadecimal |
|
| UUID en formato de cadena |
|
| No se aplica a UUID |
|
| Hora UTC, medida al microsegundo. |
|
| Hora UTC, medida al microsegundo |
|
| Serializado como una cadena JSON básica |
|
| Serializado como una cadena JSON básica |
Otros tipos BSON no son compatibles. Atlas Stream Processing envía los documentos con tipos BSON no compatibles a la cola de documentos no entregados (DLQ).
Ejemplos
Los siguientes ejemplos ilustran diversas aplicaciones de la etapa $iceberg.
Archivar un flujo de cambios
El siguiente ejemplo demuestra cómo escribir el contenido inicial y el flujo de cambios de una base de datos Atlas en una tabla de Apache Iceberg de forma de solo escritura, creando un archivo duradero del historial operativo de esa base de datos. Esta agregación tiene dos etapas:
La etapa establece una conexión con la base de datos Atlas, específicamente con
$sourcelaorderscolección en la base de datos. Permite ladbsincronización inicial para capturar documentos en la base de datos al activarse el procesador y garantiza que cada evento de cambio capture el documento completo.La
$icebergetapa establece una conexión con el bucket S3 de AWS, escribiendo en una tabla llamadamyTableen laiceberg-warehouse/ruta. Al especificar soloinsertoperaciones, garantiza un flujo de escritura de solo adición, estilo registro.
{ "$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" } }
Reflejando una colección
El siguiente ejemplo muestra cómo replicar una colección de Atlas en su totalidad en una tabla de Apache Iceberg.
Antes de definir la agregación, establezca la siguiente variable:
const isDeleteExpr = {$eq: [{$meta: "stream.source.operationType"}, "delete"]};
La siguiente agregación agrega, actualiza y elimina entradas de la tabla Apache Iceberg en sincronía con los cambios en la colección de origen de Atlas. Consta de cuatro etapas:
La etapa establece una conexión con la base de datos Atlas, específicamente con
$sourcelaorderscolección en la base de datos. Permite ladbsincronización inicial para capturar documentos en la base de datos al activarse el procesador y garantiza que cada evento de cambio capture el documento completo.La etapa filtra en
$matchdeoperationTypemodo que solo se procesan los documentos con declaraciones de tipo de operación válidas.La etapa cambia la raíz del documento dependiendo del tipo de
$replaceRootoperación.Para las operaciones de eliminación, se cambia la raíz del documento a la clave del documento. Esto genera un registro de que el documento fue eliminado, pero excluye su contenido de cualquier procesamiento posterior.
Para todas las demás operaciones, cambia la raíz del documento a
fullDocument, pasando el contenido del documento para su posterior procesamiento, pero excluyendo los metadatos del flujo de cambios.
La
$icebergetapa establece una conexión con el bucket S3 de AWS, escribiendo en una tabla de Apache Iceberg llamadamyTableen laiceberg-warehouse/ruta. Encdcel modo, esta etapa determina la operación a realizar sobre la tabla de Apache Iceberg leyendo elstream.source.operationTypecampo de metadatos de 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" } }
Desde una fuente de múltiples colecciones hasta un objetivo Apache Iceberg de múltiples tablas
En el siguiente ejemplo, Atlas Stream Processing utiliza expresiones dinámicas para enrutar documentos de forma dinámica a diversos destinos de salida.
La etapa establece una conexión con la base de datos Atlas, específicamente con las colecciones, y de la base de datos.
$sourcePermiteabcladbsincronización inicial para capturar documentos en la base de datos al activarse el procesador y garantiza que cada evento de cambio capture el documento completo.La etapa
$matchfiltra los documentos cuyooperationTypees uno de"insert","update","delete"o"replace".La etapa cambia la raíz del documento dependiendo del tipo de
$replaceRootoperación.Para las operaciones de eliminación, se cambia la raíz del documento a la clave del documento. Esto genera un registro de que el documento fue eliminado, pero excluye su contenido de cualquier procesamiento posterior.
Para todas las demás operaciones, cambia la raíz del documento a
fullDocument, pasando el contenido del documento para su posterior procesamiento, pero excluyendo los metadatos del flujo de cambios.
La
$icebergetapa establece una conexión con el bucket de AWS S3myDatallamado, escribiendo en una tabla de Apache Iceberg en laiceberg-warehouse/ruta. Determina el nombre de la tabla según el nombre de la fuente,collectionobtenido de los metadatos del documento. También determina la operación a realizar según los metadatos del 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" } }