我有一个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 回答
我会尽力回答你的问题:
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
有些节点比其他节点更快完成任务 . 具有比可用核心更多的切片以均衡的方式分配任务,从而避免由于较慢的节点而导致的长处理时间 .
刺痛#4:
对于#4,值得注意"slices"和"partitions"是相同的,有一个错误提交并努力清理文档:https://issues.apache.org/jira/browse/SPARK-1701
这是一个扩展#4中推理的链接:http://spark.apache.org/docs/latest/tuning.html#level-of-parallelism
具体看看这一行:
一个重要的考虑因素是避免改组,并且设置切片数量是其中的一部分 . 这是一个比我完全理解的更复杂的主题,在这里完全解释 - 基本思想是将数据分成足够的分区/切片,以避免Spark不得不重新洗牌,以便以后获得更多分区 .
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 就会闲着 .