首页 > 解决方案 > Spark .setMaster("local[*]") 与 .setMaster("local[3]") 的不同输出

问题描述

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

我有个疑问

不同的输出.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,但据我了解,OS 使用 1 核,其他核只能用于处理。那么,在 local[star] 的情况下,我们如何获得 4 核,最大应该是 3 对?

标签: apache-sparkapache-spark-sqlspark-streaming

解决方案


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


推荐阅读