我在群集中以独立模式运行Spark(100台计算机,每台计算机16个CPU核心,每台计算机32 GB RAM)。 我在运行任何应用程序时都指定了SPARK_WORKER_MEMORY和SPARK_WORKER_CORES。
在Spark编程中,我编程好像是一个串行程序,然后Spark框架自动并行化任务,对吗?
当我使用SPARK_WORKER_CORES = 16运行程序时遇到OOM崩溃。我再次尝试使用SPARK_WORKER_CORES = 4,程序成功完成。
当然,通过数据并行来利用多个线程需要更大的内存,但我不知道我的Spark程序中的哪个函数是由多个线程并行化的。所以我不知道哪个函数负责OOM。
我通过考虑机器总数和每个工作者(每台机器)的内存量来控制RDD分区的数量(并行度),以便数据的每个RDD分区都可以适合内存。 / p>
对RDD进行分区后,计算机中的工作程序会调用每个RDD分区上的用户定义函数来处理它。
我在这里有一个问题,Spark如何利用每台机器中的多核并行性?
哪个函数由多个线程并行化? 我应该特别注意哪些功能不要在内部使用太多内存?
由于
答案 0 :(得分:0)
Spark在每个分区上运行您的逻辑(RDD在您的集群中进行分散和分布)。每个执行程序都有预定义的专用核心数和内存数。资源执行器的中继提供了任务槽,用于运行驱动程序发送的任务。在最佳条件下,如果执行程序上的任务槽可用于处理分区,则保留该槽,如果不是它使用同一节点上其他执行程序的任务槽,则更糟糕的情况是如果没有可用的任务槽并且它尝试在群集(机架)上运行它通过网络传输级别。 OOM通常发生在您将所有日期聚集到一个地方时,例如驱动程序调用toArray(),collect()将RDD的所有分区组合到一个节点中。另一方面,如果执行程序内存和执行程序内存开销超过分区处理阶段的容器总内存,它可能会在执行程序上发生。