我正在运行Spark工作,似乎任务分配不均匀(参见附件)。有没有办法让任务更均匀地分布?谢谢!
答案 0 :(得分:1)
仔细查看发布的图像,我可以确定两个主要事实:
这让我想知道你的应用程序的性质。是否所有任务都相同或者其中一些任务需要更多时间来完成其他任务?如果任务是异构的,则需要更仔细地查看您的问题。想象一下以下场景:
任务数量:20,每个人需要 10 秒才能完成,但最后一个除外:
Task 01: 10 seconds
Task 02: 10 seconds
Task 03: 10 seconds
Task ...
Task 20: 120 seconds
如果我们必须均匀分配任务,我们会看到每个执行者总共需要处理5个任务。考虑到一个执行程序被分配了第20个任务,需要120秒才能完成,执行流程如下:
最后,用户界面会显示与您类似的结果,任务数量均匀分布,但不是实际的计算时间。
Executor 01 -> tasks completed: 5 -> time: 0:50 minutes
Executor 02 -> tasks completed: 5 -> time: 0:50 minutes
Executor 03 -> tasks completed: 5 -> time: 0:50 minutes
Executor 04 -> tasks completed: 5 -> time: 2:40 minutes
虽然不一样,但在你的情况下可能会发生类似的事情。
答案 1 :(得分:0)
我认为任务在不同的工作人员中均匀分布,因为每个任务在地址栏中都有不同的端口号。
答案 2 :(得分:0)
只看你的截图,很难诊断一些东西。但是,您可能需要考虑两件事:
Spark UI(截至1.3.1,我还没有在1.4.0中尝试)只显示已完成任务的统计数据总和。如果您在应用程序运行时使用此屏幕截图,则很可能某些任务正在运行,并且在统计数据中尚未显示!
在给定的Spark阶段,您不能拥有比数据分区更多的任务。如果没有更多的代码,很难说,但是你可能想要使用rdd.partition()函数,通常你可以在处理之前使用rdd.repartition(sparkContext.getConf.getInt("spark.executor.instances", defaultValueInt)
生成更多的分区,从而平滑执行程序的负载
答案 3 :(得分:0)
如果你想要平等分配,你可以在将文件加载到RDD时使用spark的分区功能,
val ratings = sc.textFile(File_name,partition)
就像你有10个节点,每个节点有2个核心,那么你可以有20个分区值,同样。