重要的是要记住 Spark Streaming 应用程序需要分配足够的内核来处理接收到的数据,以及运行接收器
接着:
如果分配给应用程序的核数小于或等于输入 DStreams/接收器的数量,则系统将接收数据,但无法处理它们
这似乎令人惊讶,因为操作系统会调度 CPU 以使应用程序继续运行,无论那里有多少 CPU 内核,除非它以某种方式阻止这样做。我的问题是:
- Spark 会做一些特殊的事情来阻止正常的 CPU 调度吗?
- 如果是这样,其背后的理性是什么?
重要的是要记住 Spark Streaming 应用程序需要分配足够的内核来处理接收到的数据,以及运行接收器
接着:
如果分配给应用程序的核数小于或等于输入 DStreams/接收器的数量,则系统将接收数据,但无法处理它们
这似乎令人惊讶,因为操作系统会调度 CPU 以使应用程序继续运行,无论那里有多少 CPU 内核,除非它以某种方式阻止这样做。我的问题是:
我刚刚意识到他们必须通过“核心”来表示“线程”。如果没有足够的线程,肯定会导致线程饥饿。与此一致,我可以创建一个具有比可用物理内核更多“内核”的本地集群(例如"local[10]"
,在只有 4 个 CPU 内核的机器上)。
不,看起来文档是正确的,并且是指物理 CPU 内核,而不是线程。在 4 核机器上启动 6 个读取器将导致整个 Spark Streaming 应用程序停止,即使使用 --local[10] 也是如此。同时,同样的应用程序在 8 核机器上完美运行。