我有一个2节点的Spark群集,每个节点有4个核心。
MASTER
(Worker-on-master) (Worker-on-node1)
Spark配置:
我想了解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上看到切片的效果。
如何以编程方式查找上述地图功能的工作集大小?我认为它是n/slices
(上面100000)
执行程序运行的多个任务是顺序运行还是在多个线程中并行运算?
推理每个CPU 2-4片。
我认为理想情况下我们应该调整SPARK_WORKER_INSTANCES
以对应每个节点(在同类群集中)的核心数,以便每个核心获得自己的执行者和任务(1:1:1)< / p>
答案 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)的情况下,工人将处于闲置状态。