这个问题在这里已有答案:
我正在研究火花一段时间。最近我遇到了一些奇怪的情况,我试图找出根本原因。
我有个疑问
与
.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个?
当您使用local [*]时,spark将使用驱动程序上的所有核心。当你指定local [3]时,spark只使用3个核心。
当你设置本地[*]时,它将使用你机器中的所有可用内核。每个内核都可以打开一个新线程进行数据处理。 local [3]意味着它只使用3个内核,并且每次只能执行3个并行任务。它始终是可取的,而不是给*超额认购价值。如果您的机器有octacore超额订购12或更多。如果您的核心是超线程,那么它可以使用额外的核心