首页 文章

Spark如何将切片分解为任务/执行者/工作者?

提问于
浏览
10

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

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

Spark配置:

  • slave: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)

问题:

  • 我在哪里可以看到任务级别的详细信息?内部执行程序我没有看到任务分解,所以我可以看到切片对UI的影响 .

  • 如何以编程方式查找上面的map函数的工作集大小?我假设它是 n/slices (上面100000)

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

  • 推理每个CPU 2-4片 .

  • 我假设理想情况下我们应该调整 SPARK_WORKER_INSTANCES 以对应每个节点(在同构集群中)的核心数,以便每个核心获得自己的 Actuator 和任务(1:1:1)

3 回答

  • 6

    我会尽力回答你的问题:

    1.- Where can I see task level details?

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

    2.- How to programmatically find the working set size for the map function?

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

    3.- Are the multiple tasks run by an executor run sequentially or paralelly in multiple threads?

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

    4.- Reasoning behind 2-4 slices per CPU

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

  • 0

    刺痛#4:

    对于#4,值得注意"slices"和"partitions"是相同的,有一个错误提交并努力清理文档: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

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

    我不明白你的问题,因为从UI我们可以肯定看到分区的效果(或者你喜欢的切片) .

    2)如何以编程方式查找上面的map函数的工作集大小?我假设它是n /切片(上面100000)

    请详细说明您感兴趣的尺寸 . 如果你的意思是每个工作者消耗的内存量...每个Spark分区都有64MB所以...来自官方的Spark文档:

    Spark prints the serialized size of each task on the master, so you can look at that to decide whether your tasks are too large; in general tasks larger than about 20 KB are probably worth optimizing.

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

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

    Spark executor & tasks concurrency

    4)推理每个CPU 2-4片 . 我假设理想情况下我们应该调整SPARK_WORKER_INSTANCES以对应每个节点(在同构群集中)的核心数,以便每个核心获得自己的 Actuator 和任务(1:1:1)

    主要目标不是让闲置的工作人员......一旦完成一项任务,在等待其他节点完成更长任务时总会有一些工作要做 . 如果(1:1:1), Worker 就会闲着 .

相关问题