Solucionar problemas de flujos de procesamiento por lotes de Cloud Data Fusion

En esta página se explica cómo solucionar problemas con las canalizaciones por lotes de Cloud Data Fusion.

Error de la canalización: archivo de texto ocupado

Se produce el siguiente error al ejecutar una canalización por lotes, lo que provoca que falle:

error=26, Text file busy

Para solucionar este problema, configura un activador que vuelva a intentar ejecutar una canalización automáticamente cuando falle.

  1. Detén el flujo de procesamiento.
  2. Crea un activador. En este caso, cuando selecciones un evento para ejecutarlo, elige Falla. Para obtener más información, consulta Crear un activador de entrada en una canalización de datos de nivel inferior.
  3. Inicia la canalización.

El flujo de procesamiento simultáneo se ha quedado atascado

En Cloud Data Fusion, ejecutar muchos flujos de procesamiento por lotes simultáneos puede sobrecargar la instancia, lo que provoca que los trabajos se queden atascados en los estados Starting, Provisioning o Running. Por lo tanto, no se pueden detener las canalizaciones a través de la interfaz web ni de las llamadas a la API. Si ejecutas muchas canalizaciones simultáneamente, la interfaz web puede ralentizarse o dejar de responder. Este problema se debe a las múltiples solicitudes de interfaz de usuario que se realizan al controlador HTTP en el backend.

Para solucionar este problema, controla el número de solicitudes nuevas mediante el control de flujo de Cloud Data Fusion.

Se agota el tiempo de espera de la conexión SSH mientras se ejecuta una canalización

Se produce el siguiente error al ejecutar una canalización por lotes:

java.io.IOException: com.jcraft.jsch.JSchException:
java.net.ConnectException: Connection timed out (Connection timed out)

Para solucionar este problema, sigue estos pasos:

  • Comprueba si falta alguna regla de cortafuegos (normalmente, el puerto 22). Para crear una regla de cortafuegos, consulta Configuración de la red de clústeres de Dataproc.
  • Comprueba que el verificador de Compute Engine permita la conexión entre tu instancia de Cloud Data Fusion y el clúster de Dataproc.

Código de respuesta: 401. Error desconocido

Se produce el siguiente error al ejecutar una canalización por lotes:

java.io.IOException: Failed to send message for program run program_run:
Response code: 401. Error: unknown error

Para solucionar este problema, debes asignar el rol Cloud Data Fusion Runner (roles/datafusion.runner) a la cuenta de servicio que usa Dataproc.

La canalización con el complemento de BigQuery falla y muestra el error Access Denied

Se ha detectado un problema que provoca que se produzca un error Access Denied en una canalización al ejecutar trabajos de BigQuery. Esto afecta a las canalizaciones que usan los siguientes complementos:

  • Fuentes de BigQuery
  • Sumideros de BigQuery
  • Receptores multitabla de BigQuery
  • Inserción de transformaciones

Ejemplo de error en los registros (puede variar en función del complemento que estés usando):

POST https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Access Denied: Project xxxx: User does not have bigquery.jobs.create permission in project PROJECT_ID",
"reason" : "accessDenied"
} ],
"message" : "Access Denied: Project PROJECT_ID: User does not have bigquery.jobs.create permission in project PROJECT_ID.",
"status" : "PERMISSION_DENIED"
}

En este ejemplo, PROJECT_ID es el ID de proyecto que has especificado en el complemento. La cuenta de servicio del proyecto especificado en el complemento no tiene permiso para hacer al menos una de las siguientes acciones:

  • Ejecutar una tarea de BigQuery
  • Leer un conjunto de datos de BigQuery
  • Crear un segmento temporal
  • Crear un conjunto de datos de BigQuery
  • Crear la tabla de BigQuery

Para solucionar este problema, concede los roles que faltan al proyecto (PROJECT_ID) que has especificado en el complemento:

  • Para ejecutar una tarea de BigQuery, concede el rol Usuario de tareas de BigQuery (roles/bigquery.jobUser).

  • Para leer un conjunto de datos de BigQuery, asigna el rol Lector de datos de BigQuery (roles/bigquery.dataViewer).

  • Para crear un segmento temporal, concede el rol Administrador de almacenamiento (roles/storage.admin).

  • Para crear un conjunto de datos o una tabla de BigQuery, otorga el rol Editor de datos de BigQuery (roles/bigquery.dataEditor).

Para obtener más información, consulta la documentación de solución de problemas del complemento (Google BigQuery Multi Table Sink Troubleshooting).

El flujo de procesamiento no se detiene al alcanzar el umbral de error

Es posible que una canalización no se detenga después de producirse varios errores, aunque hayas definido el umbral de error en 1.

El umbral de error está pensado para cualquier excepción que se produzca en la directiva en caso de que se produzca un fallo que no se gestione de otro modo. Si la directiva ya usa la API emitError, el umbral de error no se activa.

Para diseñar una canalización que falle cuando se alcance un umbral determinado, usa la directiva FAIL.

Siempre que se cumpla la condición que se ha pasado a la directiva FAIL, se contabilizará en el umbral de error y la canalización fallará cuando se alcance el umbral.

El complemento de origen de lotes de Oracle convierte NUMBER en string

En las versiones 1.9.0, 1.8.3 y anteriores de la fuente de lote de Oracle, el NUMBERtipo de datos de Oracledecimal(38,0), con precisión y escala indefinidas, se asigna al tipo de datos decimal(38,0)de CDAP.

Las versiones 1.9.1, 1.8.4 y 1.8.5 del complemento no son compatibles con versiones anteriores, y es posible que las canalizaciones que usen versiones anteriores no funcionen después de actualizar a las versiones 1.9.1, 1.8.5 y 1.8.4 si una fase posterior de la canalización depende del esquema de salida de la fuente, ya que el esquema de salida ha cambiado. Si se ha definido un esquema de salida para el tipo de datos NUMBER de Oracle sin precisión ni escala en la versión anterior del complemento, al actualizar a las versiones 1.9.1, 1.8.5 o 1.8.4, el complemento de origen por lotes de Oracle genera el siguiente error de incompatibilidad de esquemas para los tipos: Schema field '<field name>' is expected to have type 'decimal with precision <precision> and scale <scale> but found 'string'. Change the data type of field <field name> to string.

Las versiones 1.9.1, 1.8.5 y 1.8.4 funcionarán con un esquema de salida del tipo de datos de CDAP string para el tipo de datos de Oracle NUMBER definido sin precisión ni escala. Si hay algún tipo de datos de Oracle NUMBER definido sin precisión ni escala en el esquema de salida de la fuente de Oracle, no se recomienda usar la versión anterior del complemento de Oracle, ya que puede provocar errores de redondeo.

El caso especial se da cuando se usa una macro para el nombre de la base de datos, el nombre del esquema o el nombre de la tabla, y no se ha especificado manualmente un esquema de salida. El esquema se detecta y se asigna en el tiempo de ejecución. La versión anterior del complemento de origen por lotes de Oracle asigna el tipo de datos NUMBER de Oracle definido sin precisión ni escala al tipo de datos decimal(38,0) de CDAP, mientras que las versiones 1.9.1, 1.8.5 y 1.8.4 y posteriores asignan los tipos de datos a string en el tiempo de ejecución.

Para resolver el posible problema de pérdida de precisión al trabajar con tipos de datos NUMBER de Oracle con precisión y escala indefinidas, actualiza tus flujos de procesamiento para usar las versiones 1.9.1, 1.8.5 o 1.8.4 del complemento de origen por lotes de Oracle.

Después de la actualización, el tipo de datos NUMBER de Oracle definido sin precisión ni escala se asigna al tipo de datos string de CDAP en el tiempo de ejecución. Si tienes una fase o un receptor posteriores que consumen el tipo de datos decimal original de CDAP (al que se asignó el tipo de datos NUMBER de Oracle definido sin precisión ni escala), actualízalo o espera que consuma datos de cadena.

Si conoces el riesgo de que se produzcan pérdidas de datos debido a errores de redondeo, pero decides usar el tipo de datos NUMBER de Oracle definido sin precisión ni escala como tipo de datos decimal(38,0) de CDAP, implementa la versión 1.8.6 del complemento de Oracle (para Cloud Data Fusion 6.7.3) o la 1.9.2 (para Cloud Data Fusion 6.8.1) desde el Hub y actualiza las canalizaciones para que los usen.

Para obtener más información, consulta la referencia de la fuente de lote de Oracle.

Eliminar un clúster de Dataproc efímero

Cuando Cloud Data Fusion crea un clúster de Dataproc efímero durante el aprovisionamiento de la ejecución de un flujo de procesamiento, el clúster se elimina una vez que finaliza la ejecución del flujo de procesamiento. En casos excepcionales, no se puede eliminar el clúster.

Muy recomendable: actualiza a la versión más reciente de Cloud Data Fusion para asegurarte de que el mantenimiento del clúster es adecuado.

Definir tiempo máximo de inactividad

Para solucionar este problema, configure la opción Max Idle Time. De esta forma, Dataproc puede eliminar clústeres automáticamente, aunque falle una llamada explícita al finalizar la canalización.

Max Idle Time está disponible en Cloud Data Fusion 6.4 y versiones posteriores.

Recomendación: En las versiones anteriores a la 6.6, define Max Idle Time manualmente en 30 minutos o más.

Eliminar clústeres manualmente

Si no puedes actualizar tu versión o configurar la opción Max Idle Time, elimina los clústeres obsoletos manualmente:

  1. Obtén el ID de cada proyecto en el que se crearon los clústeres:

    1. En los argumentos de tiempo de ejecución de la canalización, comprueba si el ID del proyecto de Dataproc se ha personalizado para la ejecución.

      Comprobar si el ID del proyecto de Dataproc se ha personalizado para la ejecución

    2. Si no se especifica explícitamente un ID de proyecto de Dataproc, determina qué aprovisionador se utiliza y, a continuación, busca un ID de proyecto:

      1. En los argumentos de tiempo de ejecución de la canalización, comprueba el valor de system.profile.name.

        Obtener el nombre del aprovisionador en los argumentos de tiempo de ejecución

      2. Abre los ajustes del aprovisionador y comprueba si se ha definido el ID del proyecto de Dataproc. Si el ajuste no está presente o el campo está vacío, se usa el proyecto en el que se ejecuta la instancia de Cloud Data Fusion.

  2. En cada proyecto:

    1. Abre el proyecto en la consola Google Cloud y ve a la página Clústeres de Dataproc.

      Ir a Clústeres

    2. Ordena los clústeres por la fecha en la que se crearon, de más antiguo a más reciente.

    3. Si el panel de información está oculto, haz clic en Mostrar panel de información y ve a la pestaña Etiquetas.

    4. En cada clúster que no se esté usando (por ejemplo, si ha pasado más de un día), comprueba si tiene una etiqueta de versión de Cloud Data Fusion. Esto indica que se ha creado con Cloud Data Fusion.

    5. Selecciona la casilla situada junto al nombre del clúster y haz clic en Eliminar.

Los flujos de procesamiento fallan cuando se ejecutan en clústeres de Dataproc con trabajadores principales o secundarios

En las versiones 6.8 y 6.9 de Cloud Data Fusion, se produce un problema que provoca que los flujos de procesamiento fallen si se ejecutan en clústeres de Dataproc:

ERROR [provisioning-task-2:i.c.c.i.p.t.ProvisioningTask@161] - PROVISION task failed in REQUESTING_CREATE state for program run program_run:default.APP_NAME.UUID.workflow.DataPipelineWorkflow.RUN_ID due to
Caused by: io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
Caused by: com.google.protobuf.GeneratedMessageV3$Builder.parseUnknownField(Lcom/google/protobuf/CodedInputStream;Lcom/google/protobuf/ExtensionRegistryLite;I)Z.

Para solucionar este problema, actualiza al parche revisión 6.8.3.1, 6.9.2.1 o posterior.