星火文献称
每个应用程序都有自己的执行程序进程,这些进程将持续整个应用程序的持续时间,并在多个应用程序中运行任务螺纹。
如果我理解这一点,在静态分配中,当在集群中的所有节点上创建Spark上下文时(在集群模式中(,Spark应用程序会获取执行器。我有几个问题
-
如果执行器在所有节点上都被获取,并且将被分配给该应用程序在整个应用程序的持续时间内,难道没有机会让很多节点保持空闲状态吗?
-
当Spark上下文为创建而不在DAGScheduler中?我的意思是申请可以任意长,它只是持有资源。
-
因此,当DAGScheduler试图获得首选位置和那些节点中的执行器正在运行任务,是吗放弃其他节点上的执行者?
我检查了一个相关的问题纱线上的Spark在启动执行程序时处理数据位置吗
但我不确定是否有一个决定性的答案
- 如果在所有节点上都获取了执行器,并且在整个应用程序的持续时间内将被分配给该应用程序,那么很多节点是否有可能保持空闲
是的,有机会。如果数据有偏差,就会发生这种情况。挑战在于调整执行器和执行器核心,以便获得最大的利用率。Spark还提供了动态资源分配,确保删除空闲的执行器。
- 当创建Spark上下文而不是在DAGScheduler中时,获取资源的优势是什么?我的意思是,应用程序可能是任意长的,它只是占用了资源
Spark在进行转换时试图将数据保存在内存中。与映射减少模型相反,在每次映射操作后,它都会写入磁盘。只有确保代码在同一台机器上执行,Spark才能将数据保存在内存中。这就是事先分配资源的原因。
- 因此,当DAGScheduler尝试获取首选位置,而这些节点中的执行器正在运行任务时,它会放弃其他节点上的执行器吗
Spark无法在执行器上启动任务,除非执行器空闲。现在火花应用程序主与纱线协商以获得首选位置。它可能会,也可能不会。若并没有得到,它将在不同的执行器中启动任务。