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

Apache spark Spark如何利用每台机器中的多核并行性?,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,我在集群中以独立模式运行Spark(100台机器,每台机器16个CPU核,每台机器32 GB RAM)。 我在运行任何应用程序时指定SPARK_WORKER_内存和SPARK_WORKER_内核 在Spark编程中,我像串行程序一样编程,然后Spark框架自动并行化任务,对吗 当我运行SPARK_WORKER_CORES=16的程序时,遇到了OOM崩溃。我再次尝试使用SPARK_WORKER_CORES=4,程序成功完成 当然,通过数据并行利用多线程需要更大的内存,但我不知道Spark程序中的哪

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

在Spark编程中,我像串行程序一样编程,然后Spark框架自动并行化任务,对吗

当我运行SPARK_WORKER_CORES=16的程序时,遇到了OOM崩溃。我再次尝试使用SPARK_WORKER_CORES=4,程序成功完成

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

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

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

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

哪个函数由多个线程并行化? 我应该特别注意哪些功能,以免占用太多内存?


谢谢

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

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

我相信所有“执行”任何操作的函数都是并行的。在没有更多信息的情况下很难说出“哪个函数”——你在使用scala吗?pythonJAVASpark的计算是惰性的,所以除非您告诉它“做”一些事情,例如count()、collect()等等,否则不会分发任何内容。这有帮助吗?@flyingmeatball该程序使用RDD的foreachPartition操作。Spark如何并行化每个RDD分区的计算?使用foreachPartition而不是更标准的语法(如.map、.flatmap、.reduce等)有什么特殊原因吗?(见此处:)。如果内存不足,这意味着内核*每个内核的内存+其他已用内存>可用内存-似乎您已经找到了解决方案…请减少执行器的数量,或分配给执行器的内存。我相信所有“做”任何事情的功能都是并行的。在没有更多信息的情况下很难说出“哪个函数”——你在使用scala吗?pythonJAVASpark的计算是惰性的,所以除非您告诉它“做”一些事情,例如count()、collect()等等,否则不会分发任何内容。这有帮助吗?@flyingmeatball该程序使用RDD的foreachPartition操作。Spark如何并行化每个RDD分区的计算?使用foreachPartition而不是更标准的语法(如.map、.flatmap、.reduce等)有什么特殊原因吗?(见此处:)。如果您的内存不足,这意味着核心*每个核心的内存+其他已用内存>可用内存-看起来您已经找到了解决方案…拨下执行器的数量,或分配给执行器的内存。