es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Protocolo Spark Delta no se puede recuperar.

Estoy intentando eliminar un par de particiones de una tabla delta y luego escribir en ella, pero cuando lo hago, obtengo el siguiente error:

La clase de usuario generó una excepción: java.lang.IllegalStateException: 
No se pudo recuperar el protocolo de su tabla Delta al reconstruir la versión: 1. 
¿Eliminó manualmente archivos en el directorio _delta_log?
Establezca spark.databricks.delta.stateReconstructionValidation.enabled en "false" 
para omitir la validación.

El truco es que sé que no se produjo ninguna eliminación manual.

Pasos:

  1. Comenzar con una tabla delta funcional a la que inserto datos todos los días y hacer una copia profunda:
val oldtable = DeltaTable.forPath("s3://oldbucket/oldpath/")
oldtable.clone("s3://newtable/newpath/", false, true)
  1. Reasignar los datos. He verificado que esto funciona: lo comprobé manualmente y puedo leer y calcular estadísticas en esta tabla.
val newtable = DeltaTable.forPath("s3://newtable/newpath/")
newtable
  .toDF
  .drop("bad_partition")
  .repartition($"date")
  .write.format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .partitionBy("date") 
  .save("s3://newtable/newpath/")
newtable.vacuum()

Todas estas instrucciones ocurren dentro de Databricks.

Luego intento escribir en la misma tabla desde EMR:

val dTable = DeltaTable.forPath(writePath)
dTable.as("previous")
  .merge(df.repartition(partitionColNames.map(n => col(n)) : _*).as("new"), mergeCondition)
  .whenNotMatched()
  .insertAll()
  .whenMatched()
  .updateAll()
  .execute()

Obtengo la excepción anterior.

He intentado reparar la tabla con FSCK REPAIR TABLE, pero el error persiste. He buscado por todas partes, pero no he encontrado este problema en ningún otro lugar. ¿Qué está saliendo mal aquí?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que puede haber un problema con el protocolo de la tabla delta, específicamente la versión 1, y que no pudo ser recuperado durante la reconstrucción. El mensaje también sugiere que esto podría haber sido causado al eliminar manualmente archivos en el directorio _delta_log.

    Sin embargo, en este caso, el problema parece ocurrir incluso sin que se haya realizado dicha eliminación manual. El usuario ha copiado profundamente una tabla delta funcional, ha re-particionado los datos y ha limpiado la tabla dentro de Databricks. Pero cuando intentan escribir en la misma tabla desde EMR, se encuentran con la excepción.

    Una posible razón para este problema puede ser que el entorno de EMR y el entorno de Databricks no son completamente compatibles, y puede haber algunas diferencias en la forma en que tratan las tablas delta. Por ejemplo, es posible que EMR esté utilizando una versión más antigua de delta lake que no sea completamente compatible con la versión utilizada en Databricks, o que esté utilizando un conjunto diferente de parámetros de configuración.

    Para solucionar este problema, el usuario debe seguir los siguientes pasos:

    1. Verificar las versiones de delta lake utilizadas en los entornos de Databricks y EMR, y asegurarse de que sean compatibles.
    2. Comparar los parámetros de configuración utilizados en Databricks y EMR, y verificar si hay alguna diferencia que pueda estar causando el problema. Por ejemplo, es posible que el usuario necesite establecer el parámetro spark.databricks.delta.stateReconstructionValidation.enabled en false en el entorno de EMR para omitir la validación.

    3. Si el problema persiste, es posible que el usuario deba exportar los datos de la tabla delta a un archivo parquet y luego importarlos en EMR. Si bien este proceso puede ser más lento, asegurará que los datos sean totalmente compatibles con el entorno de EMR.

    En general, el usuario debe tratar de aislar el problema e identificar la causa raíz comparando el comportamiento de la tabla delta entre los entornos de Databricks y EMR.

Comments are closed.