当前位置: 首页 > 知识库问答 >
问题:

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

刘向阳
2023-03-14

我在集群中以独立模式运行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分区都能容纳在内存中。

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

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

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

谢谢

共有1个答案

农建弼
2023-03-14

Spark在每个分区上运行您的逻辑(RDD被分割并分布在您的集群中)。每个执行器都有预定义的专用内核数和内存。依靠资源执行器提供任务槽,用于运行驱动程序发送给它们的任务。在最好的情况下,如果执行器上的任务槽可用于处理分区,它会保留该槽,如果不可用,它会使用同一节点上其他执行器的任务槽,最坏的情况是,如果没有可用的任务槽,它会尝试通过网络在集群(机架)级传输运行它。OOM通常发生在你把所有数据聚集到一个地方的时候,比如调用toArray(),collect()的驱动程序,它把你的RDD的所有分区合并到一个节点。另一方面,如果在分区的处理阶段,执行器内存和执行器内存开销超过了容器的总内存,则会在执行器上发生这种情况。

 类似资料:
  • 一个spark有一个oracle查询。所以我必须并行运行多个作业,以便所有查询都将同时激发。 如何并行运行多个作业?

  • 根据我的研究,每当我们运行spark作业时,我们不应该运行超过5个核的执行器,如果我们增加超过限制的核,作业将会因为糟糕的I/O吞吐量而受损。 我的疑问是,如果我们增加了执行器的数量,减少了内核,即使这些执行器最终会出现在同一个物理机器中,这些执行器会从同一个磁盘读取和写入同一个磁盘,为什么这不会引起I/O吞吐量问题。 我可以考虑Apache Spark:内核数量与执行程序数量的关系 用例以供参考

  • 我有一个Spark2.1工作,在这里我维护多个数据集对象/RDD,它们代表我们底层Hive/HDFS数据存储上的不同查询。我注意到,如果我简单地迭代数据集列表,它们一次执行一个。每个单独的查询都是并行操作的,但是我觉得我们没有通过并行运行不同的数据集来最大化我们的资源。

  • Apache Spark:核心数与执行器数 由于每个案例都不一样,我又问了一个类似的问题。 我正在运行一个cpu密集型的应用程序,具有相同数量的核心和不同的执行器。以下是观察结果。 更新 案例3:执行器-12个,每个执行器的核心数-1个,执行器内存-3个,数据处理量-10 GB,分区-36个,作业持续时间:81分钟

  • 试图获得AWS Lambda函数以在.NET内核上运行Selenium。下面是代码: OpenQa.Selenium.WebDriverException:无法在http://localhost:41663/at OpenQa.Selenium.DriverService.start()at OpenQa.Selenium.Remote.DriverServiceCommandToExecute(

  • 我正在测试每个执行器的不同内核数(executor cores)对Spark上SVD的运行时的影响。随着执行器内核的固定,主数据RDD的分区数量也会发生变化。然而,对于给定数量的RDD分区,不同的执行器内核的SVD计算时间似乎没有显著变化。这有点令人困惑。 我的环境是: Spark Cluster具有3个节点(每个节点32个内核和32GB内存)。每个节点运行1个Worker。 spark.max.