Serverless Data Processing with Dataflow: Módulo 6
Cloud Dataflow
Cloud Dataflow es el servicio de ejecución para el procesamiento de datos paralelos usando apache beam. Apache Beam es un software de código abierto que puede ser ejecutado usando flink, incluso se puede usar flink si se desea ejecutar operaciones en paralelo o en otra nube. Google Cloud, DataFlow es la ejecución más eficaz para ejecutar Apache Beam.
La razón por la que Dataflow es perfecto para hacer el procesamiento de datos de Google Cloud es que Dataflow no tiene servidor, en si no tiene que administrar clúster, además Dataflow le permite utilizar el mismo código para batch y steam, indispensable para crear una nueva canalización de procesamiento de datos.
Como Data-engineer es recomendable aprender DataFlow y Dataproc y en función de los conocimientos tomar las decisiones adecuada a la situación. Si el proyecto tiene dependencias de Hadoop o Spark, utilice Dataproc. En otras ocasiones cuando el equipo de producción puede estar más cómodo con un DevOps con un enfoque donde aprovisionan máquinas sin servidor también puede hacer uso de Daraproc. Finalmente, si no importa el streaming y tu objetivo principal es mover cargas de trabajo entonces también puede usar Dataproc.
Cloud Dataflow aparte de proporcionar un servicio sin servidor puede ejecutar lotes y datos de streaming con una baja latencia, además es un sistema escalable de forma horizontal a más máquinas haciéndolo de forma transparente.
Al inicio la programación por lotes y el procesamiento de datos solían ser cosas distintas en la década de los 40’s, por lo cual había dos ideas una de código y otra muy diferente de datos, con el código se usaba para procesar datos, para ese tiempo existían las tarjetas perforadas llamado un lote. Por otra parte, el procesamiento de flujos surgió en la década de los 70’s con la idea de que el procesamiento de datos es algo que está en curso, la idea en si dice que los datos siguen llegando y usted los sigue procesando en micro-lotes.
Beam proporciona abstracciones que unifican el lote tradicional con los conceptos de programación con conceptos de procesamiento de datos. Los cuatro conceptos principales son PTransforms, Pcollections, Piplines, Pipeline runners.
Un pipeline identifica los datos a ser procesados y las acciones que se van analizar en los datos, estos se mantienen en una abstracción de datos distribuida denominada Pcollection.
Pcollection es inmutable ante cualquier cambio que ocurra en un pipeline, no cambia la Pcolleccion entrante. Las acciones o el código contenidos en una abstracción se denomina Ptransform, este controla la entrada, transformación y salida de los datos. Los datos de un Pcollection se pasan a lo largo de un gráfico de un Ptransform a otro.
Los pipelines runners son análogos al host de contenedores, el mismo pipeline puede ejecutarse en una computadora local, datacenter o máquina virtual o un servicio como Dataflow en la nube. La única diferencia es la escala y el acceso a la plataforma específica de servicios. Los servicios the runners usa para su ejecución el código back-end system.
Los datos inmutables es una de las diferencias entre la programación por lotes y programación de datos. Asumiendo que la arquitectura de Von Neuman operaba y cambiaba los datos en un lugar que tenía una memoria eficiente, esto provocó que las memorias sean muy caras y escasas. Datos inmutables donde el resultado de la transformación es una nueva “copia”, significa que no es necesario coordinar el control de acceso o compartir los datos originales, lo que resulta en una simplificación de la distribución.
El modelo de un pipeline no es de forma lineal como observamos en la imagen, si no que es un gráfico con varias ramas y agregaciones. Por el contexto histórico nos referimos a ella como un pipeline en general pero un datagraph podría ser una descripción más precisa.
El PCollection representa los datos de streaming y los datos por lotes, no existe límite para PCollection. El straeming de los datos es una PCollection que no tiene un fin, cada elemento dentro de ella puede tener acceso individual y capacidad de procesar. De esta forma usted define el pipeline y las transformaciones de PCollection, y la implementación de las transformaciones en cada elemento, distribuyendo el trabajo según sea necesario par la escala y los recursos disponibles. Una vez creado un elemento de PCollection este es inmutable y o puede ser cambiado o eliminado, estos elementos representan diferentes tipos de datos en lo programas tradicionales los tipos de datos se almacenan en la memoria con un formato específico para su tratamiento, es decir cada tipo de dato es diferente, ahora en una PCollection todos los tipos de datos se almacenan en un estado serializado como cadenas de bytes, de esta manera no hay que serializar los datos antes de la transferencia de red y se deserializan al momento de llegar a su destino, estos también se deserializan cuando PTransform requiere realizar alguna acción en ellos.
Porque los clientes valoran a Dataflow
Dataflow provee un sistema eficiente de ejecución conjunto con Apache Beam. El beam pipeline específica que se va a hacer. El servicio de Dataflowelige cómo se ejecutará el pipeline. El típico pipeline consta de lectura de los datos de una u otra fuente, aplicación de un procesamiento de datos, y escritura de una o más receptores. Como siguiente para ejecutar el pipeline del servicio de Dataflow primero se optimiza la Graph, a continuación, divide el trabajo en unidades y lo reparte para varios trabajadores, una de las cosas más interesantes de Dataflow es su optimización siempre trabajando, es decir que las unidades de trabajo se reequilibran continuamente. Los recursos se derriban al final del trabajo, etapa donde se garantiza que el trabajo programado en recursos se procesará. Unidades de trabajo son continuamente rebalanceadas y los recursos son computados conjunto con el almacenamiento. El trabajo de puede reequilibrar dinámicamente entre los recursos, lo que proporciona tolerancia a fallos, la marca de agua maneja las llegadas tardías de datos y
vienen con reinicios, monitoreos. El flujo de datos proporciona una forma viable, sin servidor específica para el trabajo de procesar sus datos.
En resumen, las ventajas del Dataflow son:
- La administración del flujo de datos está configurado automáticamente.
- Dataflow ejecuta las transformaciones en Apache Beam, y optimiza el gráfico, fusionando operaciones. Además puede iniciar un nuevo paso sin haber completado el anterior.
- A medida que el trabajo necesita más recursos, recibe más recursos. No tiene que escalar recursos manualmente para satisfacer las necesidades laborales.
- El trabajo general termina más rápido porque si las máquinas terminan su tarea, continúan con otra, las tareas siempre están en cola.
- El reequilibrio dinámico a la mitad del trabajo, elimina la necesidad de gastar tiempo de recursos operativos.
- Tiempo de seguimiento rico, las agregaciones, como sumas y recuentos, son correctas incluso si la fuente de entrada envía registros duplicados.
- Buena integración con otros servicios de GCP. Actúa como un pegamento que junta muchos servicios de GCP. Se puede utilizar en combinaciones como BigQuery-BigTable, o Pub/Sub-Cloud SQL.
Dataflow Pipelines (Tuberías de Dataflow)
En la figura se puede observar una tubería simple donde hay una PCollection de entrada y pasar a través de 3 PTransforms para obtener una PCollection de salida. La sintaxis se muestra en Python. Tiene la entrada, el símbolo de tubería, la primera PTransform, del mismo modo en la segunda PTransform, y así sucesivamente.
El operador de tubería esencialmente aplica la transformación a la PCollection de entrada y envía una PCollection de salida. Las primeras tres veces, no se le da un nombre a la salida. Sin embargo, la salida de PTransform_3 se guarda en una variable PCollection llamada PCollection_out.
En Java es la misma sintaxis, excepto que, en lugar del símbolo de tubería, se usa el método apply ().
Si se requiere hacer ramificaciones, se envía la misma PCollection, a través de dos transformaciones diferentes. Se le da un nombre a cada salida,y después se lo puede utilizar al resto del programa.
Lo anteriormente expuesto se trataba de la parte media de la tubería.
Posteriormente se crea una PCollection tomando el objeto de canalización P y pasándolo sobre un archivo de texto en Google Cloud Storage. Esa es la línea ReadFromText. Luego, se aplica el PTransform llamado FlatMap a las líneas leídas del archivo de texto. El FlatMap aplica una función a cada fila de la entrada y concatena todas las salidas. Cuando la función se aplica a una fila, puede devolver cero o más elementos que van a la salida PCollection. La función count_words. Toma una línea de texto y devuelve un entero.
Dichos enteros se escriben en un archivo de texto en Google Cloud Storage, ya que la tubería se creó en una cláusula WITH, y porque no es una tubería de transmisión, eso quiere decir que al salir de WITH la tubería se detiene automáticamente.
Una vez escrito en la tubería o pipeline, se puede ejecutar.
Por defecto, el programa se ejecuta utilizando DefaultRunner, es decir se ejecuta en la misma máquina en la que se ejecutó el programa Python. Cuando crea la tubería, puede pasar un conjunto de opciones como el RUNNER. Se tendrá que configurar los parámetros de la línea de comandos para cambiar de forma transparente. Para ejecutar la tubería localmente, se ejecuta main (). Para ejecutar en la nube, especifique los parámetros de la nube.
Para diseñar tuberías, necesita saber cómo funciona cada paso en los elementos contenido en una PCollection. Para diseñar tuberías en necesario conocer:
- Entrada y salida
- PTransforms
Se comenzará con las entradas y salidas.
Lea datos del sistema de archivos local, Cloud Storage, Cloud Pub / Sub, BigQuery
Escribir en una tabla de BigQuery
Crear una colección de PC a partir de datos en memoria
Ahora se hablará de los PTransforms
Map y FlatMap
- Use Map para una relación 1: 1 entre entrada y salida
- Map (fn) usa un fn invocable para hacer una transformación uno a uno.
- Use FlatMap para relaciones no 1: 1, generalmente con un generador
- FlatMap es similar a Map, pero fn devuelve un iterable de cero o más elementos.
- Los iterables se aplanan en una PCollection. En el ejemplo de longitud de palabra, hay una salida de longitud para cada entrada de palabra. En el ejemplo grep, la función my_grep () devuelve cada instancia del término que es buscando en la línea. Puede haber múltiples instancias del término en una sola línea.
- Una relación de uno a muchos. En este caso, desea que my_grep () devuelva el siguiente instancia cada vez que se llama, razón por la cual la función se ha implementado con un generador utilizando ‘rendimiento’. El comando de rendimiento tiene el efecto de preservar el estado de la función para que la próxima vez que se llame pueda continuar desde donde se quedó. Mapa plano tiene el efecto de iterar sobre la relación uno a muchos. El ejemplo de Map devuelve un par clave-valor (en Python, esto es simplemente una tupla de 2) para cada palabra.
- El ejemplo de FlatMap produce la línea solo para las líneas que contienen el término de búsqueda.
ParDo implementa procesos en paralelo
- ParDo es un paso intermedio común en una tubería. Puede usarlo para extraer ciertos campos de un conjunto de registros de entrada sin formato, o convertir la entrada sin formato en un formato diferente; tú también podría usar ParDo para convertir datos procesados en un formato de salida, como filas de tabla para BigQuery o cadenas para imprimir.
- Filtrar un conjunto de datos. Puede usar ParDo para considerar cada elemento en una PCollection y enviar ese elemento a una nueva colección, o descartarlo.
- Formatear o convertir cada elemento en un conjunto de datos. Si su entrada PCollection contiene elementos que son de un tipo o formato diferente al que desea, puede usar ParDo para realizar una conversión en cada elemento y generar el resultado en un nuevo PCollection.
- Extracción de partes de cada elemento en un conjunto de datos. Si tiene una colección de registros de PC con múltiples campos, por ejemplo, puede usar un ParDo para analizar solo los campos que querer considerar en una nueva PCollection.
- Realizar cálculos en cada elemento en un conjunto de datos. Puedes usar ParDo para realizar cálculos simples o complejos en cada elemento, o ciertos elementos, de un PCollection y muestra los resultados como una nueva PCollection.
ParDo requiere el código pasado como un objeto DoFn
- Cuando aplique una transformación ParDo, deberá proporcionar un código de usuario en forma de DoFn objeto. DoFn es una clase Beam SDK que define un procesamiento distribuido función.
- Su código DoFn debe ser completamente serializable, idempotente y seguro para subprocesos.
- El método ParDo puede emitir múltiples variables.
GroupByKey baraja explícitamente pares clave-valor
Funciona en una colección de pares clave / valor (tuplas de dos elementos), grupos por común clave y devuelve pares (clave, iter <valor>). La idea aquí es que queremos encontrar todos los códigos postales asociados con una ciudad.
Por ejemplo, Nueva York es la ciudad y puede tener códigos postales 10001 10002.
Primero puede crear un par clave-valor en un ParDo, luego agrupar por la clave.
Los pares clave-valor resultantes son simplemente 2-tuplas.
Cuando el mismo ejemplo es escalado en presencia de datos sesgados, la situación empeora.
En el ejemplo hay millones de valores en x y solo unos miles de valores en y. GroupBKey agrupará los valores de x a un solo trabajador, haciendo que el analice los millones de datos mientras el otro trabajador de y sólo analizará los miles.
Dataflow está diseñada para evitar ineficiencias al mantener los datos balanceados.
CoGroupByKey realiza una unión relacional de 2 o más valores clave con la misma clave.
Combine (combinar) es usada para combinar colecciones de elementos o valores en los datos.
CombinePerKey(fn) es similar a GroupByKey, pero combina los valores por un CombineFn o un invocable que toma un iterable como sum o max.
CombineGlobally(fn) reduce una PCollection a un valor simple aplicando fn.
Al aplicar una transformación de Combine, se debe proveer la función que contenga la lógica para combinar los elementos o valores.
La función de combinar debe ser conmutativa y asociativa, debido a que la función no es necesariamente invocada exactamente una vez en todos los valores con una clave dada.
Para funciones de combinación más complejas se puede definir una subclase de CombineFn. Una operación general de combinación consiste de cuatro operaciones. Al crear una subclase de CombineFn, se debe proveer las cuatro operaciones sobreescribiendo los métodos correspondientes:
- Crear un acumulador (create_acumulator)
- Agregar entradas (add_input)
- Combinar el acumulador (merge_acumulator)
- Extraer salida (extract_output)
Combine es mucho más rápido que GroupByKey, debido a que Cloud DataFlow sabe cómo paralelizar un paso combinado. De la manera que trabaja GroupByKeys, Dataflow puede usar más de un trabajador por clave.
Flatten es una transformación Beam para objetos PCollection que almacenan el mismo tipo de datos. Flatten combina múltiples objetos PCollection en una sola PCollection lógica.
Partition es una transformación Beam para objetos PCollection que almacenan el mismo tipo de datos. La partición divide una sola colección de PC en un número fijo de colecciones más pequeñas.
Además de la entrada principal PCollection, se puede proporcionar entradas adicionales a una transformación ParDo en forma de entradas laterales. Una entrada lateral es una
entrada adicional que el DoFn puede acceder cada vez que procesa un elemento en la entrada PCollection.
Autores:
- Steve Acosta
- Matías Idrobo
- Williams Ortiz
- Paúl Ramírez
Módulo 1: Introduction to Data Engineering
Módulo 2: Construyendo un Data Lake en GCP
Módulo 3: Building a Data Warehouse
Módulo 4: Procesamiento — AWS IOT CORE
Conoce más: http://bootcampai.org/di