apache-spark - 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 对?
解决方案
当您设置 local[*] 时,它将使用您机器中所有可用的内核,即每个内核都可以打开一个新线程进行数据处理。local[3] 意味着它将只使用 3 个核心,并且一次只能执行 3 个并行任务。始终建议不要给 * 超额订阅值。如果您的机器有 octacore overaubscribe 到 12 或更多。如果您的核心是超线程的,那么它可以使用额外的核心
推荐阅读
- php - Symfony Doctrine DQL 在实体管理器中找不到 createQuery
- python - 正则表达式只匹配一个单词
- c++ - SFML 像素完美碰撞仅限于视图?
- android - 为动态类型实现自定义 GsonCoverterFactory/Deserializer
- php - 将自定义链接添加到 WordPress 主题网站
- android - 制作 android 电视遥控器按钮,如 netflix 按钮
- python - 在 ubuntu linux 上安装 tensorflow,protobuf 版本问题
- swift - 快速实现泛型方法
- c# - .net 核心应用程序在 linux docker 容器中解析小数
- java - 如何使用改造android解析json数组