SevenTnewSNoticias de IA y tecnología, explicadas

Procesamiento de flujos · FLIP-21

Apache Flink quiere dejar de copiar datos en cada operador. Esa es la parte fácil

FLIP-21 permitiría a Apache Flink dejar de copiar datos entre cada operador encadenado, reemplazando un valor predeterminado de seguridad de larga data por tres modos seleccionables. DEFAULT, COPY_PER_OPERATOR y FULL_REUSE reparten la diferencia entre velocidad y cautela. La cuestión de la migración sigue abierta.

Emmanuel Fabrice Omgbwa Yasse Asistido por IA

2026-09-14 · 4 min de lectura

Apache Flink quiere dejar de copiar datos en cada operador. Esa es la parte fácil

Cada vez que los datos se mueven entre dos operadores encadenados en el runtime de streaming de Apache Flink, el runtime los copia. Ese comportamiento se incorporó deliberadamente, para evitar problemas con objetos mutables cuando los backends de estado almacenan objetos en el heap. La copia garantiza que lo que un operador pasa hacia adelante no se modifique por debajo mientras otros todavía apuntan a ello.

FLIP-21, una propuesta de cambio actualmente en discusión, busca eliminar la mayor parte de ese costo sin renunciar a la garantía. Su documento enumera cuatro problemas con el enfoque actual. Copiar es costoso para tipos complejos como Avro, Thrift y JSON. Las operaciones con clave que se ejecutan después de un shuffle nunca necesitaron la copia, porque ocupan el primer lugar de la cadena. La API DataSet no copia en cada paso, por lo que las dos mitades de Flink siguen reglas distintas para los mismos datos. Y la opción que controla todo el comportamiento, enableObjectReuse(), está mal nombrada, ya que en realidad no reutiliza objetos.

El documento describe esos costos en términos cualitativos y no adjunta ninguna cifra de benchmark a ninguno de ellos, por lo que la propuesta no establece cuánto pierde un pipeline típico a causa de las copias. Dos de las cuatro quejas son sobre los desarrolladores y no sobre el rendimiento, y importan por una razón más silenciosa. Dos API en un mismo proyecto que tratan de forma distinta la identidad de los objetos dificultan razonar qué significa una referencia en un punto dado de un job. Un flag cuyo nombre promete reutilización pero entrega otra cosa es peor, porque siembra el modelo mental equivocado sobre cuánto tiempo permanece válida una referencia.

Tres modos, y el interruptor que los controla

En lugar de desactivar la copia en todas partes, FLIP-21 define tres modos y permite a los usuarios elegir en qué punto de la línea entre seguridad y rendimiento situarse.

ModoQué haceQué cuesta
DEFAULTCrea objetos nuevos solo durante la deserialización y luego los pasa sin copiarlosSe propone que se convierta en el nuevo estándar para las API DataStream y DataSet
COPY_PER_OPERATORCopia datos entre cada operadorEl comportamiento actual de Flink; seguro, pero más lento
FULL_REUSEReutiliza objetos siempre que puedeLa opción más rápida; exige el mayor cuidado del código de usuario

DEFAULT es el modo que la propuesta espera que se convierta en el nuevo estándar tanto para la API DataStream como para la DataSet. Confina la única copia inevitable a un solo punto, la deserialización, y deja que los objetos viajen intactos desde allí. Los otros dos modos lo delimitan. COPY_PER_OPERATOR es lo que Flink hace hoy. FULL_REUSE lleva la reutilización tan lejos como puede, comprando velocidad mientras traslada la carga de manejar referencias compartidas a las funciones que reciben los objetos. El riesgo es desigual: COPY_PER_OPERATOR es lento pero indulgente, mientras que FULL_REUSE falla de maneras que dependen de cuán cuidadosamente se haya escrito el código circundante.

Un interruptor de configuración relacionado, pipeline.object-reuse, tiene como valor predeterminado false. Establecerlo en true permite que Flink reutilice objetos internamente para la deserialización y para pasar datos a las funciones de usuario. Las propias notas de la propuesta sobre el interruptor son una versión breve del compromiso: reduce la creación de objetos y la sobrecarga de recolección de basura, pero las funciones deben manejar correctamente los objetos reutilizados, no se garantiza que las referencias sigan siendo válidas después de que retorna una llamada a función, y la configuración necesita pruebas exhaustivas antes de acercarse a producción.

Migración: ruptura limpia o compatibilidad hacia atrás

La pregunta más difícil es cómo los pipelines existentes llegan a un nuevo valor predeterminado. Hay dos enfoques de migración sobre la mesa. La comunidad se inclina por el primero, el cambio mayor de entrada pero el resultado más limpio después.

La segunda preocupación es qué ocurre con las aplicaciones que ya dependen del comportamiento actual de copia. La propuesta considera que ese grupo es pequeño y señala que esos usuarios pueden conservar el modo antiguo mediante configuración, por lo que no se cuenta como un obstáculo importante. La discusión en la lista de correo ha sido en general positiva. No se ha fijado ninguna meta de disponibilidad ni fecha de lanzamiento.

Para los equipos que hoy usan Flink, el cambio inmediato es casi nulo. Hasta que llegue un nuevo valor predeterminado, la regla de copiar en cada operador se mantiene y pipeline.object-reuse sigue desactivado. Un valor predeterminado de seguridad puede seguir costando mucho después de que las condiciones que lo justificaban hayan cambiado. Solo cambia cuando alguien mide la factura y argumenta a favor del cambio.

Lo esencial de la tecnología en 3 minutos cada mañana

Un correo, cada día laborable, con lo que realmente importa en IA y tecnología.