Spark on thread ejecutor, núcleos, función del controlador y configuración

Significado del parámetro

Los comandos de envío comunes para chispa en hilo son los siguientes:

${SPARK_HOME}/bin/spark-submit --class org.apache.spark.examples.SparkPi \
    --master yarn \
    --deploy-mode cluster \
    --driver-memory 2g \
    --executor-memory 1g \
    --executor-cores 4 \
    --num-executors 3 \
    --queue default \
    ${SPARK_HOME}/examples/jars/spark-examples*.jar \
    10
  • num-executors se refiere al número de ejecutores que se utilizarán.
  • memoria-ejecutor se refiere al tamaño de memoria asignado por cada ejecutor.
  • núcleos de ejecutor se refiere a la cantidad de núcleos de CPU asignados a cada ejecutor.
  • La memoria del controlador se refiere al tamaño de la memoria asignada por el controlador.

La aplicación enviada se ejecuta como un controlador en AM, construye objetos sparkContext, objetos DAGScheduler, objetos TaskScheduler, analiza operaciones RDD en gráficos acíclicos dirigidos, divide etapas según dependencias amplias y estrechas, construye tareas, encapsula conjuntos de tareas, etc., etc. las operaciones requieren espacio de memoria y la memoria del controlador le asigna memoria.

Finalmente, RDD se analiza en tareas y se ejecuta en el ejecutor, y cada núcleo de CPU ejecuta una tarea. Hay ejecutores en el clúster num-executors, y cada ejecutor tiene executor-coresnúcleos de CPU, por lo que se puede procesar un máximo de tareas en paralelo al mismo tiemponum-executors * executor-cores . Es decir, estos dos parámetros ajustan la capacidad máxima de procesamiento en paralelo de las tareas. el paralelismo también está relacionado con el número de particiones de datos .

La estructura de memoria del ejecutor se muestra en la figura siguiente, que consta de dos partes: memoria de sobrecarga de hilo y memoria de montón JVM. La memoria de montón JVM se puede dividir en tres partes: memoria caché RDD, memoria aleatoria y montón de trabajo, lo que indica tamaño del montón de JVM executor-memory. Una de las razones por las que Spark es más rápido que mapreduce es que mantiene los resultados intermedios de los cálculos en la memoria en lugar de volver a escribirlos en el disco. Por lo tanto, cuando la memoria es mayor, RDD puede almacenar en caché más datos y la operación aleatoria puede usar más memoria y escribir la menor cantidad de datos posible en el disco, lo que reduce la E/S del disco; cuando se ejecuta la tarea, el espacio de memoria más grande significa Por Al realizar la recolección de basura con menos frecuencia, el rendimiento se puede mejorar a partir de este momento. Por supuesto, cuanto mayor sea el espacio de memoria, mejor. Si el espacio de memoria es demasiado grande, el clúster no puede asignarlo y el hilo mata directamente la tarea. Sin embargo, aumentar la aplicación de recursos hasta cierto punto puede mejorar la eficiencia de la tarea. ejecución.


Cómo aprovechar al máximo los recursos aplicados

Sólo haciendo un uso completo de los recursos se pueden ejecutar las tareas de manera más eficiente. En realidad, esto es simple, en una oración: el número de tareas coincide con el número de núcleos ejecutores . Suponiendo que executor-cores = 4 y num-executors = 3, se pueden ejecutar 12 tareas en paralelo. Sin embargo, si hay menos de 12 tareas al ejecutar una determinada etapa, esto resultará en un desperdicio de recursos aplicados y una eficiencia de ejecución relativamente baja.

# 总数据量 12G 时:
分区		每个分区数据量    使用的 cores   效率
10 			1.2G		    1012 			10G			    12

El documento oficial tiene esta descripción.

Clusters will not be fully utilized unless you set the level of parallelism for each operation high enough.
Spark automatically sets the number of “map” tasks to run on each file according to its size (though you can 
control it through optional parameters to SparkContext.textFile, etc), and for distributed “reduce” operations, 
such as groupByKey and reduceByKey, it uses the largest parent RDD’s number of partitions. You can pass the 
level of parallelism as a second argument (see the spark.PairRDDFunctions documentation), or set the config 
property spark.default.parallelism to change the default. In general, we recommend 2-3 tasks per CPU core in 
your cluster.

Puede leer los detalles usted mismo. Durante las operaciones de reducción, como reduceByKey y groupByKey, puede modificar el número de particiones a través de parámetros, o puede usar spark.default.parallelism en el archivo de configuración para modificar el número de particiones. Generalmente, se recomienda asignar de 2 a 3 tareas a cada núcleo de la CPU, es decir, la cantidad de tareas es 2 a 3 veces mayor que la de todos los núcleos.

Supongo que te gusta

Origin blog.csdn.net/yy_diego/article/details/128023875
Recomendado
Clasificación