与Spark .setMaster(“ local [*]”)和.setMaster(“ local [3]”)的不同输出

时间:2018-09-10 07:03:29

标签: apache-spark apache-spark-sql spark-streaming

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

我有疑问

  

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

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

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

I am running application on 4 core CPU.

由于人们将其标记为重复,因此我将尝试更深入地解释。 我有一个id和timestamp的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进行了检查,在local [*]的情况下得到了4个分区。我有4核CPU,但是据我了解,操作系统使用1核,而其他核只能用于处理。因此,在local [star]的情况下,如何获得4核,最大应该是3核? / p>

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

当您设置local [*]时,它将使用计算机中所有可用的内核,即每个内核可以打开一个新线程进行数据处理。 local [3]表示它将仅使用3个内核,一次只能执行3个并行任务。始终建议您不要给*过度订阅该值。如果您的计算机具有octacore,则过量设置为12个或更多。如果您的核心是超线程的,那么它可以使用额外的核心