Vortex - formato de archivo columnar de alto rendimiento
(github.com/spiraldb)- "The LLVM of columnar file formats"
- Un formato de archivo columnar que incluye un toolkit para manejar arreglos comprimidos de Apache Arrow a través de memoria, disco y red
- Un ambicioso sucesor de Apache Parquet, que ofrece lecturas de acceso aleatorio 100-200 veces más rápidas y escaneos 2-10 veces más rápidos, mientras mantiene una tasa de compresión y un rendimiento de escritura casi idénticos a Parquet usando zstd
- También soporta tablas muy grandes (decenas de miles de columnas) y descompresión sobre GPU
- Vortex está diseñado para cumplir, para los formatos de archivo basados en columnas, un rol similar al que Apache DataFusion cumple para los motores de consulta
- Es decir, se caracteriza por alta extensibilidad, gran velocidad y funcionalidades incluidas desde el inicio
[!Precaución] Todavía está en desarrollo activo
- Funciones principales:
- Logical Types - Definición de esquema que no asume nada sobre el layout físico
- Zero-Copy to Arrow - Los arreglos Vortex canonicalizados pueden convertirse a arreglos Apache Arrow sin copia
- Extensible Encodings - Conjunto de layouts físicos con enfoque de plugins. Además de codificaciones compatibles con Arrow, ofrece como extensiones codificaciones modernas (FastLanes, ALP, FSST, etc.)
- Cascading Compression - Permite comprimir datos recursivamente con múltiples codificaciones anidadas
- Pluggable Compression Strategies - El compressor integrado se basa en BtrBlocks, pero también se pueden usar fácilmente otras estrategias
- Compute - Kernels básicos de cómputo que operan sobre datos codificados (por ejemplo, filter pushdown)
- Statistics - Cada arreglo tiene estadísticas resumidas calculadas opcionalmente en el momento de lectura. Se pueden usar en los kernels de cómputo y compresores
- Serialization - Serialización sin copia de arreglos para IPC y formatos de archivo
- Columnar File Format (en progreso) - Un formato de archivo moderno para almacenar datos de arreglos comprimidos usando la librería serde de Vortex. Está optimizado para lecturas de acceso aleatorio y escaneos muy rápidos. Apunta a ser el sucesor de Apache Parquet
Resumen: Logical vs Physical
- Uno de los principios centrales del diseño de Vortex es la separación estricta entre preocupaciones lógicas y físicas
- Ejemplo: un arreglo Vortex se define por su tipo de dato lógico (el tipo de sus elementos escalares) y su codificación física (el tipo del arreglo en sí)
- Las codificaciones integradas están diseñadas principalmente para modelar el formato en memoria de Apache Arrow. También existen codificaciones integradas (
sparse,chunked) que se usan como componentes útiles de otras codificaciones. Las codificaciones de extensión están pensadas principalmente para modelar arreglos comprimidos en memoria, como codificación por longitud o codificación por diccionario vortex-serdeestá diseñado para manejar los detalles físicos de bajo nivel de los arreglos Vortex. La elección de qué codificación usar y cómo fragmentar lógicamente los datos queda a cargo de la implementación deCompressor- Una de las propiedades únicas del formato de archivo Vortex (en desarrollo) es que codifica el layout físico de los datos en el footer del archivo. Esto hace que el formato sea efectivamente autodescriptivo y pueda evolucionar sin romper la compatibilidad de la especificación del formato
- Está diseñado para soportar compatibilidad hacia adelante incluyendo opcionalmente decodificadores WASM dentro del propio archivo. Esto ayudaría a evitar el endurecimiento rápido que ha afectado a otros formatos de archivo columnar
Componentes
Logical Types
- El sistema de tipos de Vortex todavía está cambiando. Tipos lógicos actuales:
- Null
- Bool
- Integer(8, 16, 32, 64)
- Float(16, b16, 32, 64)
- Binary
- UTF8
- Struct
- List (implementado parcialmente)
- Date/Time/DateTime/Duration (implementados como tipos de extensión)
- TODO: Decimal, FixedList, Tensor, Union
Canonical/Flat Encodings
- Vortex incluye por defecto codificaciones "Flat" diseñadas para ser zero-copy con Apache Arrow. Estas son la representación canónica de cada tipo de dato lógico. Codificaciones canónicas actualmente soportadas:
- Null
- Bool
- Primitive (Integer, Float)
- Struct
- VarBin (Binary, UTF8)
- VarBinView (Binary, UTF8)
- Extension
- Se agregarán más codificaciones
Compressed Encodings
- Vortex incluye un conjunto de codificaciones altamente paralelas a nivel de datos y vectorizadas. Cada una corresponde a una implementación de arreglo comprimido en memoria, lo que permite retrasar la descompresión. Actualmente existen las siguientes codificaciones:
- Adaptive Lossless Floating Point (ALP)
- BitPacked (FastLanes)
- Constant
- Chunked
- Delta (FastLanes)
- Dictionary
- Fast Static Symbol Table (FSST)
- Frame-of-Reference
- Run-end Encoding
- RoaringUInt
- RoaringBool
- Sparse
- ZigZag
- Se agregarán más codificaciones
Compression
- La estrategia de compresión predeterminada de Vortex se basa en el paper de BtrBlocks
- A grandes rasgos, se toma una muestra mínima de ~1% de datos por cada chunk de datos
- Luego se intenta una compresión (recursiva) con un conjunto de codificaciones livianas
- Se selecciona la combinación de codificaciones con mejor rendimiento y se usa para codificar el chunk completo
- Esto suena muy costoso, pero con estadísticas básicas del chunk se pueden podar muchas codificaciones a bajo costo para evitar que el espacio de búsqueda explote
Compute
- Vortex ofrece la capacidad de que cada codificación especialice la implementación de funciones de cómputo para evitar la descompresión tanto como sea posible. Por ejemplo, al filtrar un arreglo UTF8 codificado por diccionario, primero es más barato filtrar el diccionario
- Vortex no pretende ser un motor de cómputo completo; solo implementa las operaciones básicas de cómputo que podrían ser necesarias para escaneos eficientes y pushdown
Statistics
- Los arreglos Vortex tienen estadísticas resumidas calculadas de forma diferida
- A diferencia de otras librerías de arreglos, estas estadísticas pueden poblarse desde formatos en disco como Parquet y preservarse hasta el motor de cómputo
- Las estadísticas pueden usarse en kernels de cómputo y compresores
- Estadísticas actuales:
- BitWidthFreq
- TrailingZeroFreq
- IsConstant
- IsSorted
- IsStrictSorted
- Max
- Min
- RunCount
- TrueCount
- NullCount
Serialization / Deserialization (Serde)
- Objetivos de la implementación de
vortex-serde:- Soportar escaneos (proyección de columnas + filtrado de filas) sin copia y sin asignación en heap
- Soportar acceso aleatorio en tiempo constante o casi constante
- Entregar al consumidor información estadística como si está ordenado
- Proveer un formato IPC para enviar arreglos entre procesos
- Proveer un formato de archivo extensible y de primer nivel para almacenar datos columnar en disco o en object storage
Integración con Apache Arrow
- Apache Arrow es el estándar de facto para la interoperabilidad de datos de arreglos columnar. Naturalmente, Vortex está diseñado para ser lo más compatible posible con Apache Arrow
- Todos los arreglos Arrow pueden convertirse en arreglos Vortex sin copia. Los arreglos Vortex creados a partir de arreglos Arrow también pueden volver a convertirse a Arrow sin copia
- Hay que tener en cuenta que Vortex y Arrow tienen objetivos distintos pero complementarios
- Vortex se diferencia de Arrow al separar explícitamente los tipos lógicos y las codificaciones físicas. Esto permite que Vortex modele arreglos más complejos mientras expone una interfaz lógica
- Ejemplo: Vortex puede modelar un
ChunkedArrayUTF8 donde el primer chunk está codificado con run-length y el segundo chunk con codificación por diccionario. En Arrow,RunLengthArrayyDictionaryArrayson tipos separados e incompatibles, por lo que no pueden combinarse de esta manera
- Ejemplo: Vortex puede modelar un
Aún no hay comentarios.