Spark执行没有足够并行度的任务

时间:2017-01-25 10:07:32

标签: scala apache-spark parallel-processing rdd

我是Spark的初学者,我对Spark的行为有点迷惑。

我正在Scala中开发一个算法,在这个方法中我创建了一个RDD,其中包含用户指定的多个分区:

val fichero = sc.textFile(file, numPartitions)

我正在一个拥有12名工作人员和216个可用核心(每个节点18个)的集群下开发。但是当我去Spark UI调试应用程序时,我看到了给定阶段的以下事件时间轴:

Spark Event TimeLine of a stage

对于图像的质量感到抱歉,但我必须大幅降低变焦。在此执行中,有128个分区。但是,正如在图像中可以看到的那样,整个RDD仅在十二个可用的执行器中执行,因此一些任务按顺序执行,我不希望这种行为。

所以问题是:这里发生了什么?我可以使用所有工人来并行执行每项任务吗?我见过这个选项:

  

spark.default.parallelism

但是在选择要使用的分区数时会修改此选项。我正在使用spark-submit脚本的默认参数启动应用程序。

2 个答案:

答案 0 :(得分:1)

您应该将--num-executors设置为更高的数字(默认为2),您还应该查看默认为1的--executor-cores。尝试例如--num-executors 128

确保您的分区数是多个(我通常使用2或4,具体取决于所需资源)"执行程序数乘以每个执行程序的核心数"。

请参阅spark-submit --help,为了进一步阅读,我建议您仔细阅读(特别是"调整并行度"):http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/

答案 1 :(得分:0)

numPartition是一个提示而非要求。 它最终传递给InputFormat https://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/mapred/FileInputFormat.html#getSplits(org.apache.hadoop.mapred.JobConf,int) 您始终可以使用

检查实际的分区数
val fichero = sc.textFile(file, numPartitions)
fichero.partitions.size