假设我有4个NM,我已经在yarn-client模式下配置了spark。然后,我将动态分配设置为true,以根据工作负载自动添加或删除执行程序。如果我理解正确,每个Spark执行器都作为Yarn容器运行。
那么,如果我添加更多NM,执行者的数量会增加吗?
如果我在Spark应用程序运行时删除NM,该应用程序会发生什么事情?
我可以根据其他指标添加/删除执行程序吗?如果答案是肯定的,那么有一个函数,最好是在python中,这样做吗?
答案 0 :(得分:1)
如果我理解正确,每个Spark执行器都作为Yarn容器运行。
是。这就是部署到YARN的任何应用程序,包括Spark的情况。 Spark对YARN来说并不特别。
那么,如果我添加更多NM,执行者的数量会增加吗?
没有。 YARN NodeManagers和Spark的执行者之间没有任何关系。
来自Dynamic Resource Allocation:
Spark提供了一种机制,可根据工作负载动态调整应用程序占用的资源。这意味着如果不再使用它们,您的应用程序可能会将资源返回给群集,并在需要时稍后再次请求它们。
正如您现在可能已经猜到的那样,当您决定是否请求新的执行程序或删除一些执行程序时,您的群集中有多少个NM并且工作量是无关紧要的。
如果我在Spark应用程序运行时删除NM,该应用程序会发生什么事情?
是的,但只有当Spark使用NM作为执行者时。毕竟,NodeManager为YARN集群管理器提供资源(CPU和内存),然后将它们提供给Spark应用程序等应用程序。如果你把它们拿回来,比如关闭节点,那么资源将不再可用,并且Spark执行器的进程就会死掉(就像没有资源可以运行的任何其他进程一样)。
我可以根据其他指标添加/删除执行程序吗?
是的,但通常是Spark工作(没有双关语)来进行计算并请求新的执行者。
您可以使用SparkContext
来使用killExecutors,requestExecutors和requestTotalExecutors方法管理执行者。
killExecutor(executorId:String):Boolean 请求集群管理器终止指定的执行程序。
requestExecutors(numAdditionalExecutors:Int):Boolean 从集群管理器请求额外数量的执行程序。
requestTotalExecutors(numExecutors:Int,localityAwareTasks:Int,hostToLocalTaskCount:Map [String,Int]):Boolean 根据我们的日程安排需求更新集群管理器。