Optimización de importaciones paralelas en Neo4j sin bloqueos

Fuentes: Optimizing Parallel Imports in Neo4j Without Deadlock and Lock Contention

Este artículo técnico detalla una metodología para optimizar la carga de datos masivos en Neo4j, superando las limitaciones del enfoque original de Eric Monk. La técnica se centra en la partición de relaciones para permitir la carga paralela sin conflictos de bloqueo ni deadlocks. El método original, basado en los dígitos finales de los identificadores de nodos, presentaba dos deficiencias clave: no adaptaba el número de particiones a los trabajadores disponibles y era inseguro cuando las relaciones conectaban nodos del mismo conjunto (no disjuntos).

La propuesta de mejora introduce tres mecanismos fundamentales. Primero, utiliza una función de hash para calcular las particiones, garantizando que el número de particiones coincida con el de los trabajadores asignados, lo que maximiza el uso de recursos. Segundo, implementa una nueva función específica para importar relaciones donde las fuentes y objetivos pertenecen al mismo conjunto de nodos, resolviendo así el problema de la contención de locks. Tercero, aplica el algoritmo de coloración K-1 para generar lotes de particiones que pueden procesarse en paralelo de forma segura.

El proceso comienza calculando una columna 'export_part' en las tablas de nodos y relaciones. Para los nodos, se aplica una fórmula determinista: el residuo de la función hash del ID modificado por el número de particiones. Para las relaciones, se crea una matriz cuadrada donde cada celda representa una combinación de particiones de origen y destino. Cuando los nodos son disjuntos, se utilizan diagonales cíclicas para agrupar las particiones; cuando no lo son, se emplea una rotación de turno (round-robin) para evitar que dos tareas accedan simultáneamente a la misma partición. Este enfoque permite cargar relaciones complejas, como las de auto-referencia, en paralelo, mejorando significativamente el rendimiento en la importación de grandes volúmenes de datos en Neo4j.