我是Spark的初学者,我对Spark的行为有点迷惑。
我正在Scala中开发一个算法,在这个方法中我创建了一个RDD,其中包含用户指定的多个分区:
val fichero = sc.textFile(file, numPartitions)
我正在一个拥有12名工作人员和216个可用核心(每个节点18个)的集群下开发。但是当我去Spark UI调试应用程序时,我看到了给定阶段的以下事件时间轴:
对于图像的质量感到抱歉,但我必须大幅降低变焦。在此执行中,有128个分区。但是,正如在图像中可以看到的那样,整个RDD仅在十二个可用的执行器中执行,因此一些任务按顺序执行,我不希望这种行为。
所以问题是:这里发生了什么?我可以使用所有工人来并行执行每项任务吗?我见过这个选项:
spark.default.parallelism
但是在选择要使用的分区数时会修改此选项。我正在使用spark-submit脚本的默认参数启动应用程序。
答案 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