我试图了解Apache Spark调度程序的工作原理。为此,我设置了一个本地群集,其中包含一个主服务器和两个工作服务器。我只提交一个应用程序,它只读取4个文件(2个小(~10MB)和2个大(~1,1GB)),加入它们并收集结果。另外,我在内存中缓存了两个小文件。
我正在使用FIFO运行独立集群模式。我已经了解了阶段是如何形成的,但我无法弄清楚如何确定数据流(箭头)。当我看到SparkUI时,我注意到每次,即使阶段以相同的方式形成,箭头(我猜的数据流和控制流)也是不同的。就像调度程序非确定性地工作一样。
我已经阅读过Jacek Laskowski的书中的相关章节(关于DAG和任务计划程序),但我的脑海中仍然不清楚控制流程是如何确定的。在此先感谢您的帮助。
干杯,
吉姆
答案 0 :(得分:1)
就像调度程序非确定性地工作一样。
是的,在安排任务时有一些随机性,以使其更加“公平”#34;从这个意义上说,Spark调度程序可以在非确定性的情况下工作,但是在可接受的执行放置限制内(即将具有较少位置偏好的任务分配给执行者)。
Apache Spark中为任务集选择任务(对应于一个阶段)的工作是TaskSetManager:
在TaskSchedulerImpl中的单个TaskSet中计划任务。此类跟踪每个任务,如果失败(最多有限次数)则重试任务,并通过延迟调度处理此TaskSet的位置感知调度。它的主要接口是resourceOffer,它询问TaskSet是否要在一个节点上运行任务,以及statusUpdate,它告诉它其中一个任务改变了状态(例如,已完成)。