一个Spark执行器如何运行多个任务?

10
例如,如果执行器的数量为40,但任务的数量为80,则意味着每个执行器会并行运行两个任务。此外,我的函数(任务执行所用的函数)不是普通函数,而是在其中调用程序。因此,每个任务实际上需要几分钟才能完成。那么,我的问题是,Spark是如何管理这些任务的?这些任务会共享执行器的JVM吗?那么核心数呢,会被分配给这两个任务吗?如果我不想让这两个任务同时运行,而是以循环方式执行它们,即先使用所有执行器的核心来运行第一个任务,只有当其完成后才运行第二个任务,该怎么办?
1个回答

3

这取决于你如何分配资源,例如核心数、每个执行器的核心数以及分配给执行器的内存。同时,这也取决于你如何编写程序以实现最大并行性。

此外,这还取决于你如何编码以实现最大并行性。如果有两个任务且它们彼此独立,则它们将并行运行。如果一个任务依赖于先前任务的结果,则它们将串行执行。

是的,可以通过创建两个执行器并将可用的核心分配给它来将核心数分成两个任务。

要按循环方式执行任务,需要定义分区方案并根据其分配资源。这将确保每个任务在其他任务之后执行。


你可以稍微详细地说明一下分区方案,以轮流执行任务的方式吗? - pythonic
我可以谈谈我遇到的一个用例。我使用数据框架来存储数据。最初,我只有一个分区,所以整个分区在单个执行器中执行,其他执行器未被使用。然后我尝试使用重新分区函数()对数据框架进行分区,现在这些分区在执行器之间并行运行。因此,当我有两个执行器时,每个执行器串行处理大约100个分区,将时间缩短了一半。每个分区在执行时被视为单个任务。因此,对于每个执行器,每个任务都将按顺序运行。 - PradhanKamal
实际上这取决于您指定了多少执行器核心。Spark将运行与您指定的核心数相同数量的并行任务。因此,如果您有4个执行器和4个执行器核心,则总共会有4 x 4 = 16个任务并行运行。所以我发现解决我的问题的一种方法是限制执行器核心的数量。在这种情况下,事情将以更加轮询的方式完成。 - pythonic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接