【问题标题】:Spark performs task with not enough parallelismSpark 执行并行度不足的任务
【发布时间】:2017-01-27 18:41:11
【问题描述】:

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

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

val fichero = sc.textFile(file, numPartitions)

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

对于图像质量感到抱歉,但我不得不将变焦调低很多。在此执行中,有 128 个分区。但是,从图中可以看出,整个 RDD 仅在 12 个可用的执行程序中执行,因此某些任务是按顺序执行的,我不希望这种行为。

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

spark.default.parallelism

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

【问题讨论】:

  • 你为启动设置了多少个执行者?
  • 你玩过 spark submit 中的 --num-executors--executor-cores 选项吗?
  • 在 spark-submit 中将 --num-executors 设置为 12 不起作用。仍在使用 2 个执行器。我在独立模式下使用 Spark。

标签: scala apache-spark parallel-processing rdd


【解决方案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/

【讨论】:

  • 我认为这个解决方案应该可行,因为我用不同数量的执行者证明了良好的结果。但是,我的数据量不够大,无法发送到集群上的所有物理节点。但是 --num-executors 解决方案有效。谢谢!
【解决方案2】:

numPartition 是提示而非要求。 最后传递给 InputFormat https://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/mapred/FileInputFormat.html#getSplits(org.apache.hadoop.mapred.JobConf,整数) 您可以随时检查分区的实际数量

val fichero = sc.textFile(file, numPartitions)
fichero.partitions.size

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多