F3 - un formato de archivo de datos de código abierto para el futuro
(github.com/future-file-format)- F3 es un formato de archivo de datos diseñado pensando en la eficiencia, la interoperabilidad y la escalabilidad
- Ofrece una forma de organización de datos que corrige las limitaciones de diseño de formatos de generaciones anteriores como Parquet, mientras mantiene la interoperabilidad y la extensibilidad mediante decodificadores Wasm integrados
- Los archivos F3 autodescriptivos están estructurados para contener no solo datos y metadatos, sino también el binario de WebAssembly que decodifica los datos
- El enfoque de integrar el decodificador dentro del archivo requiere un espacio mínimo de almacenamiento de unos pocos kilobytes y está diseñado para garantizar compatibilidad en cualquier plataforma, incluso cuando no exista un decodificador nativo
- Es un proyecto de Future-proof File Format que proporciona una estructura de organización de datos y una API genérica para que los desarrolladores puedan agregar fácilmente nuevos métodos de codificación
- Su estado actual es un prototipo de investigación que valida las ideas del artículo, y no debe usarse en producción
- La compilación solo se ha probado en Debian 12 sobre máquinas Intel, y la compilación del paquete PoC y las pruebas unitarias se ejecutan con
cargo build -p fff-pocycargo test -p fff-poc - La definición del formato de archivo se basa en FlatBuffer, y también se incluyen el código principal, la implementación de decodificación Wasm, y los benchmarks y scripts para los experimentos del artículo
- La licencia es MIT License
1 comentarios
Comentarios en Hacker News
No me queda claro por qué recibió tantas recomendaciones, y como la landing page tampoco convence, parece mejor leer el paper: https://dl.acm.org/doi/epdf/10.1145/3749163
Parece un formato de almacenamiento orientado a columnas que intenta compensar algunas desventajas de Parquet, pero el verdadero campo de batalla de estos formatos es la compatibilidad, y un formato nuevo arranca en desventaja en ese punto
Parquet es demasiado fuerte solo por haber sido el primero en difundirse ampliamente, y según el paper, la versión de Parquet más usada sigue siendo la más antigua, de 2013, así que ni siquiera Parquet ha logrado reemplazar a Parquet
Para que F3 supere eso, harían falta resultados muy sólidos, y no parece que los tenga
Personalmente, tampoco aborda mi mayor queja sobre Parquet, el tema de una sola tabla por archivo, así que hasta el nombre se siente algo exagerado, y además, aunque mete un binario Wasm para decodificación, igual necesitas FlatBuffers para parsear ese bloque, lo que desdibuja el objetivo
Su principal logro parece ser la mejora en acceso aleatorio, pero el almacenamiento orientado a columnas existe justamente para sacrificar acceso aleatorio y obtener análisis rápidos, y F3 da la impresión de sacrificar análisis rápidos por culpa del decodificador Wasm, así que no termino de entenderlo
Spark, DataFusion y DuckDB probablemente no sabrían muy bien qué hacer aunque les dieras un archivo con múltiples tablas
Es cierto que Parquet hace muchas cosas bien, pero eso no significa que, por haber llegado primero, deba ser para siempre el único formato de archivos para análisis
El análisis rápido y las cargas de trabajo modernas de aprendizaje automático mezclan de forma natural escaneos por lotes y acceso aleatorio
Algunos autores de F3 también escribieron un paper que analiza en detalle las desventajas de Parquet: https://www.vldb.org/pvldb/vol17/p148-zeng.pdf
Formatos recientes como Vortex, Lance y F3 intentan resolver los problemas resumidos en ese paper
Lance tiene ideas interesantes, y Vortex reemplaza los codificadores de caja negra de Parquet por codificaciones transparentes, enfocándose en extensibilidad y rendimiento
Eso permite reducir el compromiso entre decodificación masiva y decodificación elemento por elemento, logrando a la vez escaneos completos eficientes y acceso aleatorio muy rápido
Por ejemplo, LangChain explicó que reconstruyó un sistema basado en archivos Parquet usando Vortex y vio una gran mejora de velocidad: https://www.langchain.com/blog/introducing-smithdb
Como referencia, estoy desarrollando Vortex, así que he pensado bastante en la pregunta de “¿por qué crear un formato nuevo?”
Si necesitas varias tablas, puedes empaquetar varios archivos Parquet en un tar, y es una simplicidad elegantísima porque resulta fácil de leer en cualquier lenguaje que tenga bibliotecas para tar y Parquet
.parquetzSi fuera un archivo zip con varios archivos Parquet sin comprimir adentro, podrías mover múltiples tablas en un solo archivo y aun así permitir acceso mediante range requests
Es bastante ingenioso que no dependa de SDK o bibliotecas por lenguaje y que, si no existen, pueda hacer fallback a métodos Wasm integrados
“Cada archivo F3 autodescriptivo incluye no solo los datos y los metadatos, sino también el binario WebAssembly (Wasm) que decodifica los datos. El espacio de almacenamiento necesario para incrustar el decodificador en cada archivo es pequeño (del orden de kilobytes) y garantiza compatibilidad en todas las plataformas incluso cuando no existe un decodificador nativo”
¿Cómo sería un decodificador incrustado para PDF?
Como está tan acoplado a los bytes del archivo, el autor del archivo sí puede elegir qué formato tiene sentido, pero no todos los formatos tienen una única “etapa correcta de decodificación”
¿Con qué decodifica el decodificador?
Va a depender por completo del tipo de datos: algunos formatos son flujos de bytes, otros son planos de píxeles 2D, otros necesitan vértices, planos de píxeles 2D y mapas UV, y en algunos casos un grafo de objetos es más natural
No entiendo qué están viendo los demás para hablar de esto
En el README casi no hay información sobre qué es esto ni qué problema resuelve; solo veo una explicación de FlatBuffers y enlaces a directorios del código fuente
¿Me estoy perdiendo de algún contexto?
Parece que hace falta un poco más de “por qué”
Dicen que supera las desventajas de Parquet, pero me da curiosidad cuáles son exactamente
Desde luego, no sería por tener un soporte de herramientas más amplio
¿Por qué habría que dejar Parquet u ORC y usar esta estructura?
Conviene ver primero el paper: https://doi.org/10.1145/3749163
Este artículo me pareció interesante: https://medium.com/@reliabledataengineering/f3-the-future-pr...
Algunos dijeron que era genial, pero haciendo de molesto escéptico de HN, esto se ve algo tonto
Los formatos de compresión de datos son algo secundario frente a lo que se va a hacer con esos datos después de decodificarlos
Un archivo de audio y una imagen SVG son cosas totalmente distintas, y aunque hubiera una VM embebida que descompusiera video a píxeles en bruto, eso no haría que un editor de texto pudiera reproducir ese video, así que no aparece una interoperabilidad fundamentalmente nueva
Cada formato nuevo sigue necesitando manejo específico del formato
Por ejemplo, si inventaras una compresión de video mejor que H.265 pero no todos los sistemas la soportaran, podría servir para meter un decodificador y reproducirlo en hardware viejo
Pero incluso eso muestra una debilidad. Es poco probable que hardware antiguo pueda manejar bien por software la decodificación de formatos de video del futuro, y aunque esta idea hubiera aparecido en los 90, no habría hecho posible ver Netflix en un i386
Del mismo modo, también dudo que esto hubiera permitido abrir archivos de Word 2021 en Word 97, porque no existe una correspondencia 1:1 entre las estructuras de datos
Si esa compatibilidad no es una victoria clara, no sé cuál sería el objetivo
Los inconvenientes sí están claros. Si aparece un bug en el decodificador que haya que corregir, ¿cómo parcheas todos los archivos que ya llevan ese decodificador embebido?
Además están el sobrecosto en tamaño y los riesgos de seguridad, y esto añade una superficie de ataque considerable a todos los parsers de formatos, aumentando las oportunidades de ejecución remota de código, ataques de agotamiento de recursos, etc.
No es que siempre sea un enfoque equivocado, pero importa cuál es la ganancia
Si buscas formatos de almacenamiento columnar, hoy en día sus ventajas y desventajas están bastante bien documentadas
Claro, no es para decodificar video
Una ventaja de algunos formatos modernos es que las herramientas pueden leerlos con una velocidad percibida muy alta
Por ejemplo, DuckDB puede aplicar todo tipo de optimizaciones al leer su propio formato nativo o Parquet
Pero no tengo claro si esas optimizaciones podrán aplicarse con eficacia a un formato que requiere ejecutar un bloque de Wasm para entenderlo
Ya sea con SIMD o sin SIMD, si haces una pasada sobre los datos y esa pasada no entiende la consulta, quizá ya perdiste desde ahí
Solo hojeé el inicio del paper, así que el formato real podría ser menos general de lo que suena
Más o menos puedo imaginarlo como reemplazo de los EXE autoextraíbles, pero gran parte de la razón para elegir un formato de archivo específico es por las funciones concretas que ofrece ese formato
Un sistema autodescriptivo podría caer en el mismo estado que otros formatos: “demasiadas funciones en competencia y nadie puede manejar todas”
Por ejemplo, ¿este archivo puede usarse eficientemente con
mmap?Tal vez sí si por dentro imita a tar, pero no lo sabrás hasta ejecutarlo
¿Se puede saltar a una posición específica de bytes y descomprimir solo una parte?
Quizá solo soporte la versión preliminar pública de la navegación ISO-36898533, y la biblioteca de archivos que usas dejó de soportarla hace 6 años
Si reescribes 1 MB en medio, ¿solo hay que cambiar las páginas correspondientes en disco, o hay que reescribir todo?
Puede que el bloque de Wasm soporte 97 APIs para eso, 35 de ellas copias con otro nombre, y que haya terminado siendo más grande que los propios datos, pero a nadie le importó
Al final hay 19 opciones reconocibles, pero la aceleración nativa de Wasm del CPU solo maneja dos o tres, así que igual quizá haya que especializar bastante el código
Al menos con
*.tar.gzuno tiene cierta idea de lo que se puede hacerBien. El mundo siempre necesita formatos de datos mejores
Solo que creo que el README llamaría más la atención si pusiera de inmediato las ventajas frente a Parquet y otros formatos de archivo
Cuando alguien entre a https://github.com/future-file-format/f3, debería poder ver por qué valdría la pena probarlo
Publiquen ventajas y métricas, y las métricas pueden ser solo las que les favorezcan
Puede que tenga buenos casos de uso, pero con el README actual no queda claro quién debería usarlo ni por qué
Si vas a guardar datos a escala de PB durante más de 10 años, no quisiera depender de que en el futuro siga existiendo un intérprete de Wasm y además sea lo bastante rápido como para leer los archivos
Quiero una especificación de bytes simple y bien documentada, como Parquet
Además, meter la lógica de decodificación dentro de un binario Wasm añade una capa de ejecución activa a algo que debería ser almacenamiento en frío
Está sandboxeado y fue ampliamente aceptado, y Wasm tiene esa misma capacidad de aislamiento
Incluso podría considerarse mejor para preservación a largo plazo
Porque no necesitas llevar aparte el programa de descompresión; ya viene dentro del propio archivo
Si la decodificación falla, me preocupa tener que depurar el Wasm que metió otra persona, y que además pueda contener bugs arbitrarios
Podría ayudar que hubiera una biblioteca decodificadora estándar que el proyecto mantenga y pruebe, pero no estoy seguro de si eso mata la ventaja de flexibilidad que ofrece este enfoque
Es decir, no es un problema nuevo creado por mi sistema, y ellos deberían poder reproducirlo de forma independiente de cualquier cliente