Usa contenedores personalizados en Dataflow

En esta página, se describe cómo personalizar el entorno de ejecución del código de usuario de Python en las canalizaciones de Dataflow mediante el suministro de una imagen de contenedor personalizada.

Cuando Dataflow inicia las VM de trabajador, usa imágenes de contenedor de Docker. Puedes especificar una imagen de contenedor personalizada en lugar de usar una de las imágenes predeterminadas de Apache Beam. Cuando especificas una imagen de contenedor personalizada, Dataflow inicia a los trabajadores que extraen la imagen especificada. Estos son algunos motivos por los que puedes usar un contenedor personalizado:

  • Instala dependencias de canalización previamente para reducir el tiempo de inicio del trabajador.
  • La instalación previa de dependencias de canalización no está disponible en repositorios públicos.
  • Inicia software de terceros en segundo plano.
  • Personaliza el entorno de ejecución

Para obtener información más detallada sobre los contenedores personalizados, consulta la guía de contenedores personalizados de Apache Beam.

Antes de comenzar

Verifica que tengas instalada la versión 2.25.0 o posterior del SDK de Apache Beam. Verifica que esta versión del SDK de Apache Beam sea compatible con tu versión de Python. Si deseas obtener más información, consulta la guía para instalar el SDK de Apache Beam.

Asegúrate de tener instalado Docker para probar tu imagen de contenedor de forma local. Para obtener más información, consulta Obtén Docker.

Crea y compila la imagen de contenedor

En este ejemplo, usamos Python 3.8 con la versión 2.25.0 del SDK de Apache Beam. Para crear una imagen de contenedor personalizada, especifica la imagen de Apache Beam como la imagen principal y agrega tus propias personalizaciones.

  1. Crea un objeto Dockerfile nuevo, especificando el apache/beam_python3.8_sdk:2.25.0 como superior y agrega las personalizaciones. Si deseas obtener más información sobre cómo escribir Dockerfiles, consulta Prácticas recomendadas para la escritura de Dockerfiles.
    FROM apache/beam_python3.8_sdk:2.25.0
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
  2. Compila la imagen secundaria y envía esta imagen a un registro de contenedores.

    Cloud Build

    export PROJECT=PROJECT
    export REPO=REPO
    export TAG=TAG
    export REGISTRY_HOST=HOST
    export IMAGE_URI=$REGISTRY_HOST/$PROJECT/$REPO:$TAG
    
    gcloud builds submit --tag $IMAGE_URI

    Docker

    export PROJECT=PROJECT
    export REPO=REPO
    export TAG=TAG
    export REGISTRY_HOST=HOST
    export IMAGE_URI=$REGISTRY_HOST/$PROJECT/$REPO:$TAG
    
    docker build -f Dockerfile -t $IMAGE_URI ./
    docker push $IMAGE_URI
    Reemplaza lo siguiente:
    • PROJECT es el nombre del proyecto o el nombre de usuario
    • REPO es el nombre del repositorio de imágenes
    • TAG es la etiqueta de imagen
    • HOST es el nombre del host del registro de imágenes, por ejemplo, gcr.io

Pruebas locales

Prueba la imagen de contenedor de forma local mediante la ejecución del ejemplo wordcount de Apache Beam con PortableRunner:

python -m apache_beam.examples.wordcount \
  --input=INPUT_FILE \
  --output=OUTPUT_FILE \
  --runner=PortableRunner \
  --job_endpoint=embed \
  --environment_type=DOCKER \
  --environment_config=$IMAGE_URI

Reemplaza lo siguiente:

  • INPUT_FILE: un archivo en la imagen de contenedor que se puede leer como un archivo de texto.
  • OUTPUT_FILE: es una ruta de acceso del archivo en la imagen del contenedor para escribir la salida. No se puede acceder al archivo de salida cuando finaliza la ejecución porque el contenedor se cierra.
  • $IMAGE_URI es el URI de la imagen del contenedor personalizado. Puedes usar la variable de shell $IMAGE_URI construida en el paso anterior si la variable todavía está dentro del alcance.

Revisa los registros de la consola para verificar que la canalización se haya completado correctamente y que se usó la imagen remota, especificada por $IMAGE_URI.

Si quieres obtener más información, consulta la guía de Apache Beam para ejecutar canalizaciones con imágenes de contenedor personalizadas.

Inicia el trabajo de Dataflow

Especifica la ruta a la imagen del contenedor cuando inicias la canalización de Apache Beam en Dataflow. Si lanzas una canalización por lotes de Python, debes configurar la marca --experiment=use_runner_v2. Si inicias una canalización de Python de transmisión, no es necesario que especifiques el el experimento. Por ejemplo, para iniciar el ejemplo de conteo de palabras por lotes con una imagen de contenedor personalizada:

python -m apache_beam.examples.wordcount \
  --input=INPUT_FILE \
  --output=OUTPUT_FILE \
  --project=PROJECT_ID \
  --region=REGION \
  --temp_location=TEMP_LOCATION \
  --runner=DataflowRunner \
  --experiment=use_runner_v2 \
  --worker_harness_container_image=$IMAGE_URI

Reemplaza lo siguiente:

  • INPUT_FILE: la ruta de acceso del archivo de entrada de Cloud Storage que Dataflow lee cuando ejecuta el ejemplo.
  • OUTPUT_FILE: la ruta de acceso del archivo de salida de Cloud Storage que se escribe en la canalización de ejemplo. Esto contendrá los conteos de palabras.
  • PROJECT_ID es el ID de tu proyecto de Google Cloud.
  • REGION es el extremo regional para implementar tu trabajo de Dataflow.
  • TEMP_LOCATION es una ruta de acceso de Cloud Storage para que Dataflow almacene en etapa intermedia los archivos de trabajo temporales creados durante la ejecución de la canalización
  • $IMAGE_URI es el URI de la imagen del contenedor personalizado. Puedes usar la variable de shell $IMAGE_URI construida en el paso anterior si la variable todavía está dentro del alcance.

Soluciona problemas

En esta sección, se proporcionan instrucciones para solucionar problemas comunes durante la interacción con contenedores personalizados en Dataflow.

Antes de comunicarte con el equipo de asistencia, asegúrate de haber descartado los problemas relacionados con la imagen de contenedor. Para ello, sigue los pasos a fin de probar a nivel local y en las siguientes secciones de solución de problemas.

Busca registros de contenedores

Los registros de trabajadores de Dataflow para los mensajes de error relacionados con contenedores se pueden encontrar mediante el Explorador de registros:

  1. Selecciona los siguientes nombres de registro:

    • dataflow.googleapis.com/docker
    • dataflow.googleapis.com/kubelet
    • dataflow.googleapis.com/worker
  2. Selecciona el recurso Dataflow Step y especifica el job_id.

Los trabajadores no inician

Si tus trabajadores no se inician o se agota el tiempo de espera de tu trabajo, verifica que Dataflow pueda extraer tu imagen de contenedor personalizada.

Consulta los registros de Dataflow con el Explorador de registros para un mensaje de registro Error Syncing pod... con la siguiente consulta:

resource.type="dataflow_step" AND jsonPayload.message:("$IMAGE_URI") AND severity="ERROR"

La imagen debe ser accesible para los trabajadores de Dataflow de modo que los trabajadores puedan extraer la imagen cuando se inicie. Si usas Container Registry para alojar tu imagen de contenedor, la cuenta de servicio de Google Cloud predeterminada ya puede acceder a las imágenes en el mismo proyecto. Si Dataflow no puede extraer la imagen del contenedor, no se pueden iniciar los trabajadores.

Para obtener más información, consulta Configura el control de acceso.