¿Qué hace beam?
Guía completa para desarrollar correctamente nuevos conectores I/O de Apache Beam, incluyendo transformaciones I/O principales, SchemaTransforms, definiciones de protos URN, integración con API administrada, servicio de expansión entre lenguajes y pruebas.
Introducción
Esta guía proporciona un enfoque paso a paso para construir conectores I/O de Apache Beam robustos y mantenibles. Apache Beam ofrece un modelo de programación unificado para pipelines de datos, y los conectores I/O son el mecanismo para leer y escribir datos desde y hacia sistemas externos.
Transformaciones I/O principales
Las transformaciones I/O principales son la base de cualquier conector. Deben implementar las interfaces PTransform, BoundedSource o UnboundedSource, y Sink según corresponda.
Lectura (Read)
Para implementar una transformación de lectura, se debe crear una subclase de PTransform que devuelva un PCollection. El origen debe definir cómo dividir el trabajo en paralelo y cómo leer los registros.
public class MyIO {
public static Read read() {
return new Read();
}
}
Escritura (Write)
Las transformaciones de escritura deben implementar la interfaz Sink y gestionar correctamente la escritura en lotes o streaming.
SchemaTransforms
Los SchemaTransforms permiten que los conectores expongan su esquema de manera explícita, facilitando la integración con el sistema de tipos de Beam y la conversión automática entre formatos.
Definiciones de protos URN
Cada conector debe tener un identificador único definido mediante un URN (Uniform Resource Name) en formato proto. Esto permite la identificación y el enrutamiento correcto entre diferentes lenguajes.
syntax = "proto3";
package beam.connectors;
message MyConnectorSpec {
option (beam.urn) = "beam:connector:my_connector:v1";
// configuration fields
}
Integración con API administrada
La API administrada de Beam proporciona una capa de abstracción sobre los conectores, permitiendo su descubrimiento, configuración y ejecución de manera consistente. Los conectores deben implementar el contrato definido por la API administrada.
Servicio de expansión entre lenguajes
Para soportar múltiples SDKs (Java, Python, Go), es necesario implementar un servicio de expansión entre lenguajes (cross-language expansion service). Esto se logra mediante el uso de gRPC y la definición de servicios proto específicos.
Pruebas
Las pruebas son fundamentales para garantizar la corrección de los conectores. Se recomienda:
- Pruebas unitarias para transformaciones individuales.
- Pruebas de integración con sistemas externos reales o emulados.
- Pruebas de rendimiento para validar la escalabilidad.
./gradlew :sdks:java:io:my-connector:test