Gráficos de tareas de Dataflow

La interfaz de monitorización de Dataflow proporciona una representación gráfica de cada tarea: el gráfico de tareas. El gráfico de tareas también proporciona un resumen de las tareas, un registro de tareas e información sobre cada paso de la canalización.

Para ver el gráfico de un trabajo, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Dataflow > Trabajos.

    Ir a Tareas

  2. Selecciona un trabajo.

  3. Haz clic en la pestaña Gráfico de empleo.

De forma predeterminada, en la página del gráfico de tareas se muestra la vista de gráfico. Para ver tu gráfico de tareas como una tabla, en Vista de pasos de la tarea, selecciona Vista de tabla. La vista de tabla contiene la misma información en un formato diferente. La vista de tabla es útil en los siguientes casos:

  • Tu trabajo tiene muchas fases, por lo que es difícil desplazarse por el gráfico de trabajo.
  • Quieres ordenar los pasos de un trabajo por una propiedad específica. Por ejemplo, puedes ordenar la tabla por tiempo real para identificar los pasos lentos.

Vista de gráfico

El gráfico de tareas representa cada transformación de la canalización como un recuadro. En la siguiente imagen se muestra un gráfico de trabajo con tres transformaciones: Read PubSub Events, 5m Window y Write File(s).

Captura de pantalla del gráfico de tareas en la interfaz de monitorización

Cada cuadro contiene la siguiente información:

Si un paso representa una transformación compuesta, puedes desplegarlo para ver las subtransformaciones. Para desplegar el paso, haz clic en la flecha Desplegar nodo.

Nombres de las transformaciones

Dataflow ofrece varias formas de obtener el nombre de la transformación que se muestra en el gráfico de monitorización de trabajos. Los nombres de las transformaciones se usan en lugares visibles públicamente, como la interfaz de monitorización de Dataflow, los archivos de registro y las herramientas de depuración. No uses nombres de transformación que incluyan información personal identificable, como nombres de usuario o nombres de organizaciones.

Java

  • Dataflow puede usar el nombre que le asignes cuando apliques la transformación. El primer argumento que proporciones al método apply es el nombre de la transformación.
  • Dataflow puede inferir el nombre de la transformación, ya sea a partir del nombre de la clase, si creas una transformación personalizada, o del nombre del objeto de función DoFn, si usas una transformación principal como ParDo.

Python

  • Dataflow puede usar el nombre que le asignes cuando apliques la transformación. Para definir el nombre de la transformación, especifica el argumento label de la transformación.
  • Dataflow puede inferir el nombre de la transformación, ya sea a partir del nombre de la clase, si creas una transformación personalizada, o del nombre del objeto de función DoFn, si usas una transformación principal como ParDo.

Go

  • Dataflow puede usar el nombre que le asignes cuando apliques la transformación. Puedes definir el nombre de la transformación especificando el Scope.
  • Dataflow puede inferir el nombre de la transformación, ya sea a partir del nombre de la estructura si usas un DoFn estructural o del nombre de la función si usas un DoFn funcional.

Ver información de los pasos

Cuando haces clic en un paso del gráfico de trabajo, el panel Información del paso muestra más detalles sobre el paso. Para obtener más información, consulta Información sobre los pasos de un trabajo.

Cuellos de botella

Si Dataflow detecta un cuello de botella, el gráfico de la tarea muestra un símbolo de alerta en los pasos afectados. Para ver la causa del cuello de botella, haz clic en el paso para abrir el panel Información del paso. Para obtener más información, consulta Solucionar problemas de cuellos de botella.

Dos pasos de trabajo con alertas de cuello de botella

Ejemplos de gráficos de tareas

En esta sección se muestra un ejemplo de código de una canalización y los gráficos de trabajo correspondientes.

Gráfico de la tarea básico

Código de la canalización:

Java

  // Read the lines of the input text.
  p.apply("ReadLines", TextIO.read().from(options.getInputFile()))
     // Count the words.
     .apply(new CountWords())
     // Write the formatted word counts to output.
     .apply("WriteCounts", TextIO.write().to(options.getOutput()));

Python

(
    pipeline
    # Read the lines of the input text.
    | 'ReadLines' >> beam.io.ReadFromText(args.input_file)
    # Count the words.
    | CountWords()
    # Write the formatted word counts to output.
    | 'WriteCounts' >> beam.io.WriteToText(args.output_path))

Go

  // Create the pipeline.
  p := beam.NewPipeline()
    s := p.Root()
  // Read the lines of the input text.
  lines := textio.Read(s, *input)
  // Count the words.
  counted := beam.ParDo(s, CountWords, lines)
  // Write the formatted word counts to output.
  textio.Write(s, *output, formatted)
Gráfico de la tarea:

El gráfico de ejecución de un flujo de procesamiento de WordCount, tal como se muestra en la interfaz de monitorización de Dataflow.

Figura 1: Código de un flujo de procesamiento de WordCount con el gráfico de ejecución resultante en la interfaz de monitorización de Dataflow.

Gráfico de trabajo con transformaciones compuestas

Las transformaciones compuestas son transformaciones que contienen varias subtransformaciones anidadas. En el gráfico de la tarea, las transformaciones compuestas se pueden desplegar. Para desplegar la transformación y ver las subtransformaciones, haz clic en la flecha.

Código de la canalización:

Java

  // The CountWords Composite Transform
  // inside the WordCount pipeline.

  public static class CountWords
    extends PTransform<PCollection<String>, PCollection<String>> {

    @Override
    public PCollection<String> apply(PCollection<String> lines) {

      // Convert lines of text into individual words.
      PCollection<String> words = lines.apply(
        ParDo.of(new ExtractWordsFn()));

      // Count the number of times each word occurs.
      PCollection<KV<String, Long>> wordCounts =
        words.apply(Count.<String>perElement());

      return wordCounts;
    }
  }

Python

# The CountWords Composite Transform inside the WordCount pipeline.
@beam.ptransform_fn
def CountWords(pcoll):
  return (
      pcoll
      # Convert lines of text into individual words.
      | 'ExtractWords' >> beam.ParDo(ExtractWordsFn())
      # Count the number of times each word occurs.
      | beam.combiners.Count.PerElement()
      # Format each word and count into a printable string.
      | 'FormatCounts' >> beam.ParDo(FormatCountsFn()))

Go

  // The CountWords Composite Transform inside the WordCount pipeline.
  func CountWords(s beam.Scope, lines beam.PCollection) beam.PCollection {
    s = s.Scope("CountWords")

    // Convert lines of text into individual words.
    col := beam.ParDo(s, &extractFn{SmallWordLength: *smallWordLength}, lines)

    // Count the number of times each word occurs.
    return stats.Count(s, col)
  }
Gráfico de la tarea:

El gráfico de tareas de un flujo de procesamiento de WordCount con la transformación CountWords ampliada
              para mostrar sus transformaciones de componentes.

Figura 2: Código de la canalización de los subpasos de la transformación CountWords. Se muestra con el gráfico de la tarea ampliado para toda la canalización.

En el código de tu canalización, puedes usar el siguiente código para invocar tu transformación compuesta:

result = transform.apply(input);

Las transformaciones compuestas invocadas de esta forma omiten el anidamiento esperado y pueden aparecer expandidas en la interfaz de monitorización de Dataflow. Tu canalización también puede generar advertencias o errores sobre nombres únicos estables durante el tiempo de ejecución de la canalización.

Para evitar estos problemas, invoca tus transformaciones con el formato recomendado:

result = input.apply(transform);

Siguientes pasos