Apache Spark Optimization Techniques and Performance Tuning

By Chandan Gaur / Ingeniería de Big Data / 05,Oct, 2020

¿Qué es Apache Spark?

Apache, en 2012, describió la base de Conjuntos de datos Distribuidos Resilientes (RDD en Apache Spark) con conjuntos de datos distribuidos de solo lectura en clústeres distribuidos y lo nombró Apache Spark. Más tarde, introducen API de conjuntos de datos y, a continuación, API de marcos de datos para la transmisión por lotes y estructurada de datos. Este artículo enumera las mejores Técnicas de Optimización de Apache Spark.

Apache Spark es una plataforma de computación en clúster rápida desarrollada para realizar más cálculos y procesamiento de flujos. Spark puede manejar una amplia variedad de cargas de trabajo en comparación con los sistemas tradicionales que requieren varios sistemas para ejecutarse y ser compatibles. Las tuberías de análisis de datos son facilitadas por Spark en combinación con diferentes tipos de procesamiento que son necesarios para la producción. Apache Spark se crea para operar con un administrador de clúster externo, como YARN o su administrador independiente.

Características de Apache Spark

Algunas características de Apache Spark incluyen:-

  • Plataforma unificada para escribir aplicaciones de big data.
  • Facilidad de desarrollo.
  • Diseñado para ser altamente accesible.
  • Spark puede funcionar de forma independiente. Por lo tanto, da flexibilidad.
  • Rentable.

XenonStack proporciona servicios y Soluciones de análisis para la Ingesta, el procesamiento y el análisis de datos en tiempo Real y de Flujo de datos de forma rápida y eficiente para el Internet de las Cosas, la Supervisión, el Mantenimiento Preventivo y Predictivo.

Del Artículo, Servicios de Análisis de Streaming y en Tiempo Real

¿Comprende cómo funciona la Optimización de Apache Spark?

Para entender cómo funciona la optimización de Apache Spark, primero debe comprender su arquitectura y en la sección posterior, elaboraremos la misma.

La arquitectura de Apache Spark

La arquitectura en tiempo de ejecución de Spark consta de tres partes:

Controlador de Spark (Proceso Maestro)

El Controlador de Spark convierte los programas en tareas y programa las tareas para los Ejecutores. El Programador de tareas es la parte del Controlador y ayuda a distribuir tareas a los ejecutores.

Gestor de clústeres de Spark

Un gestor de clústeres es el núcleo de Spark que permite iniciar ejecutores y, a veces, también puede iniciar controladores. El programador de Spark programa las acciones y los trabajos en la aplicación Spark de forma FIFO en el propio administrador de clúster. También deberías leer sobre Apache Airflow.

Ejecutores (Procesos esclavos)

Los ejecutores son las entidades individuales en las que se ejecuta la tarea individual del trabajo. Los ejecutores siempre se ejecutarán hasta el ciclo de vida de una aplicación de Spark una vez que se hayan iniciado. Los ejecutores fallidos no detienen la ejecución del trabajo de spark.

RDD (Conjuntos de datos distribuidos resilientes)

Un RDD es una colección distribuida de conjuntos de datos inmutables en nodos distribuidos del clúster. Un RDD se divide en una o varias particiones. RDD es el núcleo de spark como su distribución entre varios nodos del clúster que aprovecha la localidad de datos. Para lograr paralelismo dentro de la aplicación, las particiones son las unidades para ella. Las transformaciones de repartición o fusión pueden ayudar a mantener el número de particiones. El acceso a los datos se optimiza utilizando el barajado RDD. Como Spark está cerca de los datos, envía datos a través de varios nodos y crea las particiones necesarias según sea necesario.

DAG (Gráfico Acíclico dirigido)

Spark tiende a generar un gráfico de operador cuando ingresamos nuestro código en la consola Spark. Cuando se activa una acción para Spark RDD, Spark envía ese gráfico al DAGScheduler. Luego divide esos gráficos de operador en etapas de la tarea dentro de DAGScheduler. Cada paso puede contener trabajos basados en varias particiones de los datos entrantes. El DAGScheduler canaliza esos gráficos de operador individuales juntos. Por ejemplo, los gráficos del operador de mapas programan para una sola etapa y estas etapas pasan al. Programador de tareas en el administrador de clústeres para su ejecución. Esta es la tarea de Trabajo o Ejecutores para ejecutar estas tareas en el esclavo.

Procesamiento distribuido usando particiones de manera eficiente

Aumentar el número de ejecutores en clústeres también aumenta el paralelismo en el trabajo de procesamiento de Spark. Pero para esto, uno debe tener información adecuada sobre cómo se distribuirían esos datos entre esos ejecutores a través de particiones. RDD es útil para este caso con tráfico insignificante para el barajamiento de datos entre estos ejecutores. Se puede personalizar la partición para par RDD (RDD con pares clave-valor). Spark asegura que el conjunto de claves siempre aparecerá junto en el mismo nodo porque no hay un control explícito en este caso.

Apache Spark security ayuda a la autenticación a través de un secreto compartido. La autenticación Spark es el parámetro de configuración a través del cual se puede configurar la autenticación. Es el parámetro que comprueba si los protocolos de la comunicación spark están haciendo autenticación usando un secreto compartido o no.

Del artículo, Apache Spark Security

Errores a evitar al escribir aplicaciones Spark

reduceByKey o groupByKey

Tanto groupByKey como reduceByKey producen la misma respuesta, pero el concepto para producir resultados es diferente. reduceByKey es el más adecuado para conjuntos de datos grandes porque en Spark combina la salida con una clave compartida para cada partición antes de barajar los datos. Mientras que en el otro lado, groupByKey baraja todos los pares clave-valor. groupByKey provoca mezclas innecesarias y transferencia de datos a través de la red.

Mantenga el tamaño requerido de los bloques barajados

De forma predeterminada, el bloque barajado Spark no puede exceder los 2 GB. El mejor uso es aumentar las particiones y reducir su capacidad a ~128 MB por partición, lo que reducirá el tamaño del bloque aleatorio. Podemos usar la repartición o la fusión en aplicaciones regulares. Las particiones grandes hacen que el proceso sea lento debido a un límite de 2 GB, y pocas particiones no permiten escalar el trabajo y lograr el paralelismo.

Formatos de archivo y delimitadores

Elegir los formatos de archivo correctos para cada especificación relacionada con los datos es un dolor de cabeza. Uno debe elegir sabiamente el formato de datos para los tipos de ingestión, Tipo intermedio y Tipo de salida final. También podemos clasificar los formatos de archivo de datos para cada tipo de varias maneras, como podemos usar el formato de archivo AVRO para almacenar datos de medios, ya que Avro está mejor optimizado para datos binarios que Parquet. Parquet se puede utilizar para almacenar información de metadatos, ya que está altamente comprimida.

Pequeños archivos de datos

La difusión es una técnica para cargar pequeños archivos de datos o conjuntos de datos en bloques de memoria para que se puedan unir con conjuntos de datos más masivos con menos sobrecarga de datos mezclados. Por ejemplo, podemos almacenar archivos de datos pequeños en n número de bloques y los archivos de datos grandes se pueden unir a estos bloques de datos en el futuro, ya que los archivos de datos grandes se pueden distribuir entre estos bloques de manera paralela.

Sin supervisión de etapas de trabajo

DAG es una estructura de datos utilizada en Spark que describe varias etapas de tareas en formato gráfico. La mayoría de los desarrolladores escriben y ejecutan el código, pero el monitoreo de las tareas del trabajo es esencial. Este monitoreo se logra mejor gestionando el DAG y reduciendo las etapas. El trabajo con 20 pasos se prolonga en comparación con un trabajo con 3-4 etapas.

ByKey, repartición o cualquier otra operación que desencadene barajamientos

La mayoría de las veces necesitamos evitar barajamientos tanto como podamos como barajamientos de datos en muchos, y a veces se vuelve muy complejo obtener escalabilidad de esos barajamientos. groupByKey puede ser un activo valioso, pero su necesidad debe describirse primero.

Aprendizaje por refuerzo

El aprendizaje por refuerzo no solo es el concepto para obtener un mejor entorno de aprendizaje automático, sino también para procesar decisiones de una mejor manera. Uno debe aplicar el aprendizaje de refuerzo profundo en spark si el modelo de transición y el modelo de recompensa se construyen correctamente en conjuntos de datos y también los agentes son lo suficientemente capaces de estimar los resultados.

Factores y técnicas de optimización de Apache Spark

Una de las mejores características de la optimización de Apache Spark es que ayuda a los cálculos de datos en memoria. El cuello de botella para estos cálculos de optimización de spark puede ser la CPU, la memoria o cualquier recurso del clúster. Una necesidad de serializar los datos, reducir la memoria puede surgir en tales casos. Estos factores para la optimización de chispas, si se usan correctamente, pueden–

  • Elimine el proceso de trabajo de larga duración
  • Motor de ejecución de corrección
  • Mejora el tiempo de rendimiento mediante la gestión de recursos

13 Técnicas simples para la optimización de Apache Spark Los acumuladores

son variables globales para los ejecutores que solo se pueden agregar a través de una operación asociativa y conmutativa. Por lo tanto, puede ser eficiente en paralelo. Los acumuladores se pueden usar para implementar contadores (lo mismo que en Map Reduce) u otra tarea, como el seguimiento de llamadas a la API.

De forma predeterminada, Spark admite acumuladores numéricos, pero los programadores tienen la ventaja de agregar soporte para nuevos tipos. Spark asegura que la actualización de cada tarea solo se aplicará una vez a las variables acumuladoras. Durante las transformaciones, los usuarios deben tener conocimiento de la actualización de cada tarea, ya que se pueden aplicar más de una vez si se vuelven a ejecutar las etapas del trabajo.

Colmena O de Rendimiento

O resultados con un número fijo de archivos como podemos especificar el número de segmentos con un cubo. Hive tomó el campo, calculó el hash y asignó un registro a ese cubo en particular. El bucketing es más estable cuando el campo tiene alta cardinalidad, Procesamiento de Datos Grandes y registros distribuidos uniformemente entre todos los cubos, mientras que el particionamiento funciona cuando la cardinalidad del campo de particionamiento es baja.

El bucketing reduce la sobrecarga de clasificación de archivos. Por ejemplo, si estamos uniendo dos tablas que tienen un número igual de cubos, spark une los datos directamente como claves que ya están ordenadas. El número de archivos de cubo se puede calcular como varias particiones en varios cubos.

Optimización de empuje de predicados

El empuje de predicados es una técnica para procesar solo los datos requeridos. Los predicados se pueden aplicar a SparkSQL definiendo filtros en condiciones where. Al usar el comando explain to query, podemos verificar las etapas de procesamiento de consultas. Si el plan de consultas contiene filtro push, la consulta está optimizada para seleccionar solo los datos necesarios, ya que cada predicado devuelve Verdadero o Falso.

Si no se encuentra ningún filtro empujado en el plan de consulta, lo mejor es convertir la condición where. Las pulsaciones de predicados limitan la cantidad de archivos y particiones que SparkSQL lee durante las consultas, lo que reduce los inicios de E/S de disco En el análisis de memoria. La consulta de datos en cubos con empuje de predicados produce resultados más rápidos con menos mezcla.

Serialización/Deserialización de datos cero con Apache Arrow

Apache Arrow se utiliza como formato de tiempo de ejecución en memoria para motores de consultas analíticas. Flecha proporciona datos de serialización/deserialización cero baraja a través de la memoria compartida. Arrow flight envía los grandes conjuntos de datos a través de la red. Arrow tiene su formato de archivo arrow que permite el acceso aleatorio de copia cero a los datos en los discos. Arrow tiene una capa de acceso a datos estándar para todas las aplicaciones spark.

Reduce la sobrecarga de las operaciones SerDe para barajar datos, ya que tiene un lugar común donde residen todos los datos y en un formato específico de flecha.

Ajuste de recolección de basura usando G1GC Collection

Al ajustar colectores de basura, primero recomendamos usar G1 GC para ejecutar aplicaciones Spark. El colector de basura G1 maneja por completo montones crecientes que se ven comúnmente con Spark. Con G1, se necesitarán menos opciones para proporcionar un mayor rendimiento y una menor latencia. Para controlar las características y comportamientos impredecibles de varias aplicaciones, es necesario dominar el ajuste de GC de acuerdo con los registros generados.

Antes de esto, se deben aplicar otras técnicas de optimización, como Streaming y Soluciones de Análisis en Tiempo Real, en la lógica y el código del programa. La mayoría de las veces, G1GC ayuda a optimizar el tiempo de pausa entre procesos que a menudo se encuentran en aplicaciones Spark, lo que disminuye el tiempo de ejecución del trabajo con un sistema más confiable.

Gestión y ajuste de memoria

Como sabemos, para cálculos como barajar, ordenar, etc., se usa memoria de ejecución, mientras que para fines de almacenamiento en caché se usa memoria de almacenamiento que también propaga datos internos. Puede haber algunos casos en los que los trabajos no están utilizando ninguna caché; por lo tanto, casos de error de espacio durante la ejecución. Los trabajos en caché siempre aplican menos espacio de almacenamiento donde no se permite que los datos se desalojen por ningún requisito de ejecución. Además, se puede hacer una aplicación de transmisión en tiempo real con Apache Spark.

Podemos configurar spark.memoria.fracción para determinar cuánto espacio de montón de JVM se utiliza para la memoria de ejecución de Spark. Por lo general, el valor predeterminado es el 60%. La memoria del ejecutor debe mantenerse lo menos posible porque puede provocar un retraso en la recolección de basura de JVM. Este hecho también es aplicable para ejecutores pequeños, ya que se pueden ejecutar varias tareas en una sola instancia de JVM.

Localidad de datos

En Apache Spark, las tareas de procesamiento se optimizan colocando el código de ejecución cerca de los datos procesados, lo que se denomina localidad de datos. A veces, la tarea de procesamiento tiene que esperar antes de obtener datos porque los datos no están disponibles. Sin embargo, cuando el tiempo de la chispa.localidad.la espera expira, Spark intenta un nivel menos local, es decir, Local al nodo para rack a cualquiera.

La transferencia de datos entre discos es muy costosa, por lo que la mayoría de las operaciones deben realizarse en el lugar donde residen los datos. Ayuda cargar solo una pequeña cantidad de datos, pero requiere la cantidad de datos junto con el desarrollo basado en pruebas para Apache Spark.

Usando uniones colocadas

Las uniones colocadas toman decisiones de redistribución y difusión. Podemos definir pequeños conjuntos de datos que se ubicarán en múltiples bloques de memoria para lograr un mejor uso de la radiodifusión. Al aplicar uniones en dos conjuntos de datos, spark Primero ordena los datos de ambos conjuntos de datos por clave y los combina.

Pero, también podemos aplicar la clave de partición de ordenación antes de unirlas o al crear esos marcos de datos en la Arquitectura de flechas de almacenamiento. Esto optimizará el tiempo de ejecución de la consulta, ya que no habrá llamadas a funciones innecesarias para ordenar.

Almacenamiento en caché en Spark

El almacenamiento en caché en Apache Spark con GPU es la mejor técnica para la optimización de Apache Spark cuando necesitamos algunos datos una y otra vez. Pero no siempre es aceptable almacenar datos en caché.

Tenemos que usar cache () RDD y DataFrames en cualquiera de los siguientes casos–

  • Cuando hay un bucle iterativo, como en algoritmos de aprendizaje automático.
  • Cuando se accede a RDD varias veces en un solo trabajo o tarea.
  • Cuando el coste de generar de nuevo las particiones RDD es mayor.

Cache () y persist (StorageLevel.MEMORY_ONLY) se pueden usar en lugar uno del otro. Se requiere que cada partición RDD que se expulsa de la memoria se compile de nuevo desde la fuente, lo que sigue siendo muy costoso. Una de las mejores soluciones es utilizar persist (Nivel de almacenamiento).MEMORY_AND_DISK_ONLY) que derramaría las particiones de RDD al disco local del Trabajador. Este caso solo requiere obtener datos de la unidad local del trabajador, que es relativamente rápida.

Tamaño del ejecutor

Cuando ejecutamos ejecutores con alta memoria, a menudo resulta en retrasos excesivos en la recolección de basura. Necesitamos mantener el recuento de núcleos por ejecutor por debajo de cinco tareas por ejecutor. Ejecutores demasiado pequeños no resultaron útiles en términos de ejecutar varios trabajos en una sola JVM.

Por ejemplo, las variables de difusión deben replicarse para cada ejecutor exactamente una vez, lo que dará lugar a más copias de los datos.

Función de ventana de chispa

Una función de ventana define un marco a través del cual podemos calcular las filas de entrada de una tabla. En el nivel de fila individual. Cada fila puede tener un marco claro. La ventana nos permite definir una ventana para los datos en el marco de datos. Podemos comparar varias filas en el mismo marco de datos.

Podemos establecer el tiempo de la ventana en un intervalo particular que resolverá el problema de la dependencia de datos con datos anteriores. El barajado en Apache Beam es menor en los datos procesados previamente, ya que estamos reteniendo esos datos para el intervalo de ventana.

Técnica de marcas de agua

La marca de agua es una técnica útil en la optimización de Apache Spark que restringe el sistema por diseño y ayuda a evitar que explote durante la ejecución. Marca de agua toma dos argumentos–

  • Columna de tiempo de evento y
  • Un tiempo de umbral que especifica durante cuánto tiempo se nos requiere procesar datos tardíos

La consulta en la arquitectura Apache Arrow se actualizará automáticamente si los datos están dentro de ese umbral estipulado; de lo contrario, no se activa ningún procesamiento para esos datos demorados. Hay que recordar que podemos usar el modo completo junto con la marca de agua porque el modo completo primero conserva todos los datos en la tabla resultante.

Serialización de datos

La optimización de Apache Spark funciona con datos que necesitamos procesar para algunos casos de uso, como análisis o simplemente para el movimiento de datos. Este movimiento de datos o análisis puede realizarse bien si los datos están en un formato mejor serializado. Apache Spark admite la serialización de datos para administrar los formatos de datos necesarios en Origen o Destino de manera efectiva. De forma predeterminada, Apache Spark utiliza la serialización Java, pero también admite la serialización Kryo.

De forma predeterminada, Spark utiliza ObjectOutputStream de Java para serializar los datos. La implementación puede ser a través de java.io.Clase Serializable. Codifica los objetos en un flujo de bytes. Proporciona una persistencia ligera y flexible. Pero se vuelve lento, ya que conduce a enormes formatos serializados para cada clase en la que se usa. Spark admite la biblioteca de serialización Kryo (v4) para Serializar objetos casi 10 veces más rápido que la serialización Java, ya que es más compacta que Java.

Optimización de Apache Spark: Un enfoque integral

Apache Spark, un motor de computación distribuida de código abierto, es actualmente el marco más popular para el procesamiento por lotes en memoria, que también admite la transmisión en tiempo real. Con su avanzado optimizador de consultas y motor de ejecución, las técnicas de optimización de Apache Spark pueden procesar y analizar grandes conjuntos de datos de manera muy eficiente. Sin embargo, ejecutar técnicas de optimización de uniones de Apache Spark sin un ajuste cuidadoso puede degradar el rendimiento. Si desea aprovechar la potencia de su aplicación Apache Spark, consulte nuestros servicios administrados de Apache Spark.

Categorías :

Desarrollo de Big Data, Soluciones de Big Data, Análisis de Datos de Streaming,

Compartir:

You might also like

Deja una respuesta

Tu dirección de correo electrónico no será publicada.