Spark如何利用每台机器中的多核并行性



我在集群中以独立模式运行Spark(100台机器,每台机器16个CPU内核,每台计算机32 GB RAM)。运行任何应用程序时,我都会指定SPARK_WORKER_MEMORY和SPARK_WORKER_CORES。

在Spark编程中,我把它当作一个串行程序来编程,然后Spark框架会自动并行化任务,对吧?

我在运行SPARK_WORKER_CORE=16的程序时遇到OOM崩溃。我用SPARK_WORKER_CORE=4重试,程序成功完成。

当然,通过数据并行来利用多个线程需要更大的内存,但我不知道Spark程序中的哪个函数是由多个线程并行的。所以我不知道OOM由哪个函数负责。

我通过考虑机器的总数和每个工作者(每台机器)的内存量来控制RDD分区的数量(并行度),这样数据的每个RDD分区都可以容纳在内存中。

在对RDD进行分区后,机器中的工作人员调用每个RDD分区上的用户定义函数来处理它

这里我有一个问题,Spark如何在每台机器中利用多核并行性?

哪个函数由多个线程并行处理?我应该特别注意哪个函数,不要在其中使用太多内存

感谢

Spark在每个分区上运行您的逻辑(RDD是在集群中吐出并分布的)。每个执行器都有专用数量的内核和预定义的内存。中继资源执行器提供任务槽,用于运行驱动程序发送给它们的任务。在最佳情况下,如果执行器上的任务插槽可用于处理分区,则它会保留该插槽,否则它会使用同一节点上其他执行器的任务插槽,如果没有可用的任务插槽并尝试在集群(机架)级通过网络传输,则情况会更糟。OOM通常发生在您将所有日期收集到一个地方时,比如into驱动程序调用toArray()、collect(),它将RDD的所有分区组合到一个节点中。另一方面,若执行器内存和执行器内存开销在分区的处理阶段超过容器的总内存,则可能会在执行器上发生这种情况。

相关内容

  • 没有找到相关文章

最新更新