es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spark solo ejecuta mi aplicación con una tarea única.

He escrito una aplicación Spark simple en AWS EMR 6.4.0 que básicamente hace esto:

SparkConf sparkConf = new SparkConf().setAppName("MyAppName").setMaster("local");
JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
JavaRDD<string> dataSet = javaSparkContext.parallelize(alistwith100elements);
// aquí también intenté forzar 100 divisiones con .parallelize(alistwith100elements, 100)

long count = dataSet.flatMap(....)
    .flatMap(...)
    .map(somethingthatoutputs0or1)
    .reduce(Integer::sum);

javaSparkContext.stop();

Estoy ejecutando la aplicación usando el siguiente comando:

aws emr add-steps --profile myprofile --region us-east-1 --cluster-id j-SOMEID --steps Type=CUSTOM_JAR,Name=test-downloader,ActionOnFailure=CONTINUE,Jar=command-runner.jar,Args=spark-submit,--class,com.my.main.MyClass,s3://somebucket/my.packaged.app-1.0.jar,-arg1,some,more,cli,args

Pero tanto localmente como en un clúster con 10 hosts, solo veo registros como este:

20:20:21.354 [Executor task launch worker for task 0.0 in stage 0.0 (TID 0)] INFO  some log from my flatMap with element 0 from the list
20:20:21.789 [Executor task launch worker for task 0.0 in stage 0.0 (TID 0)] INFO  some log from my flatMap with element 0 from the list
20:20:22.354 [Executor task launch worker for task 0.0 in stage 0.0 (TID 0)] INFO  some log from my map with element 0 from the list
20:20:22.678 [Executor task launch worker for task 0.0 in stage 0.0 (TID 0)] INFO  some log from my flatMap with element 1 from the list
20:20:23.975 [Executor task launch worker for task 0.0 in stage 0.0 (TID 0)] INFO  some log from my flatMap with element 1 from the list
20:20:24.354 [Executor task launch worker for task 0.0 in stage 0.0 (TID 0)] INFO  some log from my map with element 1 from the list
[...] more logs with the other elements, consecutively

Siempre veo la tarea 0 en los registros y la aplicación se está ejecutando lentamente como si estuviera ejecutando una sola tarea a pesar de que tengo 10 máquinas en el clúster.

¿Qué estoy haciendo mal? ¿Cómo puedo hacer que se ejecute más cosas en paralelo? Cada map o flatMap devuelve uno o más elementos, así que no es como si se quedara sin cosas que hacer (excepto el último map que en realidad está descargando algo y devuelve 0 o 1 dependiendo de si tuvo éxito o no).

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que estás ejecutando tu aplicación de Spark en AWS EMR 6.4.0 con 10 hosts, pero solo estás viendo logs para la tarea 0. Esto sugiere que tu aplicación no se está ejecutando en paralelo y solo se está ejecutando en una tarea. Para hacer que tu aplicación se ejecute en paralelo, deberás configurar el número de particiones en tu RDD. Puedes hacer esto usando el método .parallelize() y especificando el número de particiones que deseas. Por ejemplo:

    JavaRDD<string> dataSet = javaSparkContext.parallelize(_una_lista_con_100_elementos_, 10);
    

    Esto creará 10 particiones en tu RDD, lo que permitirá que tu aplicación se ejecute en paralelo en varias tareas.

Comments are closed.