我正在研究火花一段时间。最近,我遇到了一些奇怪的情况,试图找出根本原因。
我有疑问
与
.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>
答案 0 :(得分:1)
当您使用local [*]时,spark将使用驱动程序上的所有内核。当您指定local [3]时,spark将仅使用3个内核。
答案 1 :(得分:1)
当您设置local [*]时,它将使用计算机中所有可用的内核,即每个内核可以打开一个新线程进行数据处理。 local [3]表示它将仅使用3个内核,一次只能执行3个并行任务。始终建议您不要给*过度订阅该值。如果您的计算机具有octacore,则过量设置为12个或更多。如果您的核心是超线程的,那么它可以使用额外的核心