Spark如何将切片并行化到任务/执行者/工作者?

时间:2014-09-05 01:29:43

标签: apache-spark

我有一个2节点的Spark群集,每个节点有4个核心。

        MASTER
(Worker-on-master)              (Worker-on-node1)

Spark配置:

  • 奴隶:master,node1
  • SPARK_WORKER_INSTANCES = 1

我想了解Spark的paralellize行为。 sparkPi示例包含以下代码:

val slices = 8  // my test value for slices
val n = 100000 * slices
val count = spark.parallelize(1 to n, slices).map { i =>
  val x = random * 2 - 1
  val y = random * 2 - 1
  if (x*x + y*y < 1) 1 else 0
}.reduce(_ + _)

根据文件:

  

Spark将为群集的每个切片运行一个任务。通常,您希望群集中的每个CPU都有2-4个切片。

我将切片设置为8,这意味着工作集将在群集上的8个任务之间划分,反过来每个工作节点获得4个任务(每个核心1:1)

问题:

  1. 我在哪里可以看到任务级别的详细信息?在执行程序内部,我没有看到任务细分,所以我可以在UI上看到切片的效果。

  2. 如何以编程方式查找上述地图功能的工作集大小?我认为它是n/slices(上面100000)

  3. 执行程序运行的多个任务是顺序运行还是在多个线程中并行运算?

  4. 推理每个CPU 2-4片。

  5. 我认为理想情况下我们应该调整SPARK_WORKER_INSTANCES以对应每个节点(在同类群集中)的核心数,以便每个核心获得自己的执行者和任务(1:1:1)< / p>

3 个答案:

答案 0 :(得分:7)

我会尽力回答你的问题:

1.-我在哪里可以看到任务级别详细信息?

提交作业时,Spark会在除主服务器之外的每个工作节点上存储有关任务细分的信息。我相信(我只使用Spark for EC2测试)存储了这些数据,位于 spark 目录下的 work 文件夹中。

2.-如何以编程方式查找地图功能的工作集大小?

虽然我不确定它是否在切片的内存中存储大小,但第一个答案中提到的日志提供了有关每个RDD分区包含的行数的信息。

3.-执行程序运行的多个任务是否在多个线程中顺序或并行运行?

我相信节点内的不同任务是按顺序运行的。这显示在上面显示的日志中,表示每个任务的开始和结束时间。

4.-推理每个CPU 2-4片

某些节点比其他节点更快完成任务。拥有比可用核心更多的切片以平衡的方式分配任务,从而避免由于较慢的节点而导致的处理时间过长。

答案 1 :(得分:2)

刺伤#4:

对于#4,值得注意的是&#34;切片&#34;和&#34;分区&#34;同样的事情,提交了一个错误并努力清理文档:https://issues.apache.org/jira/browse/SPARK-1701

这是一个扩展#4中推理的链接:http://spark.apache.org/docs/latest/tuning.html#level-of-parallelism

具体看看这一行:

  

通常,我们建议群集中每个CPU核心有2-3个任务。

一个重要的考虑因素是避免改组,并且设置切片数量是其中的一部分。这是一个比我完全理解的更复杂的主题,在这里完全解释 - 基本的想法是将你的数据分成足够的分区/切片,以避免Spark不得不重新洗牌,以便以后获得更多的分区。

答案 2 :(得分:0)

1)我在哪里可以看到任务级别的详细信息?在执行程序内部,我看不到任务分解,因此可以看到切片对UI的影响。

我不明白您的问题,因为从用户界面中我们绝对可以看到分区(或切片)的效果。

2)如何以编程方式找到上述地图功能的工作集尺寸?我认为是n / slices(100000以上)

请提供您感兴趣的尺寸的更多详细信息。如果您是说每个工作人员消耗的内存量...每个Spark分区都有64MB,那么...来自官方Spark文档:

Spark在主数据库上打印每个任务的序列化大小,因此您可以查看它以确定您的任务是否太大;通常,大约20 KB以上的任务可能值得优化。

3)执行程序执行的多个任务是顺序运行还是并行运行在多个线程中?

这个问题的一个很好的来源:

Spark executor & tasks concurrency

4)推理每个CPU 2-4个切片。 我认为理想情况下,我们应该调整SPARK_WORKER_INSTANCES以使其与每个节点(同质集群中)的核心数量相对应,以便每个核心都有自己的执行器和任务(1:1:1)

主要目标是不让空闲的工作人员……一旦完成一项任务,它将在等待其他节点完成更长的任务时总是有工作要做。在(1:1:1)的情况下,工人将处于闲置状态。