Solución al error HiveException: Unable to move source en entornos Spark y Hive

Al integrar Apache Spark 2.3 con Apache Hive 3.0 en un clúster HDP 3.1 gestionado por Ambari, pueden surgir conflictos de permisos y metadatos al intentar escribir datos en tablas particionadas. Específicamente, al ejecutar una sentencia de inserción con particionado mediante INSERT INTO ... PARTITION ... SELECT en Spark SQL, el motor pueede lanzar una excepción relacionada con el moivmiento de archivos temporales en HDFS.

A continuación, se muestra un ejemplo del rastreo de error que se genera cuando el sistema no puede trasladar los datos desde el directorio de staging hacia la ruta final de la partición:

org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move source hdfs://namenode-primary:8020/data/warehouse/managed/mydb/user_transactions/.hive-staging_hive_2021-05-10_09-15-22_112_9876543210987654321-1/-ext-10000 to destination hdfs://namenode-primary:8020/data/warehouse/managed/mydb/user_transactions/tx_date=20210509;
  at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:106)
  at org.apache.spark.sql.hive.HiveExternalCatalog.loadPartition(HiveExternalCatalog.scala:843)
  at org.apache.spark.sql.hive.execution.InsertIntoHiveTable.processInsert(InsertIntoHiveTable.scala:248)
  ...
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Load Data failed for hdfs://namenode-primary:8020/data/warehouse/managed/mydb/user_transactions/.hive-staging_hive_2021-05-10_09-15-22_112_9876543210987654321-1/-ext-10000 as the file is not owned by hive and load data is also not ran as hive
  at org.apache.hadoop.hive.ql.metadata.Hive.needToCopy(Hive.java:4347)
  at org.apache.hadoop.hive.ql.metadata.Hive.moveFile(Hive.java:4187)
  ... 82 more

El mensaje clave en la excepción es the file is not owned by hive and load data is also not ran as hive. Esto indica que el archivo temporal generado en HDFS no pertenece al usuario del servicio Hive, y la operación de carga no se está ejecutando con los privilegios de este usuario. Como resultado, Hive rechaza mover el archivo para mantener la integridad de los permisos en las tablas administradas.

La causa raíz de este problema radica en una configuración incorrecta del catálogo por defecto en Spark, lo que provoca que el motor intente gestionar los archivos con el usuario que ejecuta la aplicación Spark en lugar del usuario de Hive.

Para resolver esta incidencia, es necesario modificar la propiedad de configuración del catálogo en Spark. Se debe establecer metastore.catalog.default con el valor hive para forzar la compatibilidad de permisos y metadatos:

<configuration>
    <property>
        <name>metastore.catalog.default</name>
        <value>hive</value>
        <description>Define el catálogo predeterminado para asegurar la compatibilidad de permisos con Hive.</description>
    </property>
</configuration>

Después de insertar esta propiedad en la configuración de Spark, reinicie el servicio de Spark 2 para aplicar los cambios y permitir que las operaciones de carga de datos utilicen el usuario correcto de Hive.

Etiquetas: apache-spark apache-hive hdp HDFS hive-metastore

Publicado el 9-21 16:31