使用Spark .setMaster(“local [*]”)与.setMaster(“local [3]”)[复制]的不同输出

问题描述 投票:2回答:2

这个问题在这里已有答案:

我正在研究火花一段时间。最近我遇到了一些奇怪的情况,我试图找出根本原因。

我有个疑问

.setMaster("local[*]").setMaster("local[3]")不同的输出?

根据我目前的理解*从本地系统动态分配核心,在以后的情况下,我们手动为执行程序提供核心。

我的问题是每当我给*时,我会得到一些不良结果。当我通过手动提供核心来运行相同的代码时,它会给出完美的结果。

I am running application on 4 core CPU.

由于人们将其标记为重复,我将尝试更深入地解释。我有一个id和时间戳的RDD所以,我想要实现的是找到两个连续行之间间隔超过15分钟的间隔。使用,代码如下: -

 val lists = rdd.zipWithIndex().map(p => {

 if (p._2 == 0) {
      moveLastGpsdt = p._1.gpsdt
      imei = p._1.imei
 } else if (p._2 > 0) {
      val timeDiffs = p._1.gpsdt.getTime() - moveLastGpsdt.getTime()
      if (p._1.imei.equals(imei) && timeDiffs > 900000L) {
        println("Unreachable " + moveLastGpsdt + " " + p._1.gpsdt)
      Arrayimeistoppage = events(p._1.imei, "Unreachable", moveLastGpsdt,p._1.gpsdt)
      }
Arrayimeistoppage
})

现在,我有一套记录。当我使用“local [star]”运行时,它会跳过一些数据但是如果我使用local [1] / local [2] / local [3],它会为所有行提供正确的结果。我用rdd.partition检查过,在本地[*]的情况下得到4个分区。我有4个核心CPU,但根据我的理解,操作系统使用1个核心,其他核心只能用于处理。那么,如果本地[星号],我们如何获得4个核心,最大值应该是3个?

apache-spark apache-spark-sql spark-streaming
2个回答
1
投票

当您使用local [*]时,spark将使用驱动程序上的所有核心。当你指定local [3]时,spark只使用3个核心。


1
投票

当你设置本地[*]时,它将使用你机器中的所有可用内核。每个内核都可以打开一个新线程进行数据处理。 local [3]意味着它只使用3个内核,并且每次只能执行3个并行任务。它始终是可取的,而不是给*超额认购价值。如果您的机器有octacore超额订购12或更多。如果您的核心是超线程,那么它可以使用额外的核心

© www.soinside.com 2019 - 2024. All rights reserved.