首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >星火如何在多核或超线程机器上实现一项任务内的并行性?

问星火如何在多核或超线程机器上实现一项任务内的并行性?
EN

Stack Overflow用户
提问于 2016-04-17 01:14:57
回答 1查看 11.9K关注 0票数 12

我一直在阅读并试图了解星火框架如何在独立模式下使用其核心。根据Spark文档,默认情况下参数"spark.task.cpus"'s值设置为1,这意味着要为每个任务分配的核数。

问题1:当"spark.task.cpus = 4“时,一台多核机器的(例如,4个核心,8个硬件线程),会使用4个核心(每个核心一个线程)还是两个超级线程?

如果我设置"spark.task.cpus = 16",比这台机器上可用的硬件线程数还要多,会发生什么情况?

问题2:是如何实现这种硬件并行的?我试图查看代码,但没有发现任何与硬件或JVM通信的内核级并行性。例如,如果任务是“筛选”函数,那么如何将单个筛选任务分配到多个核心或线程?

也许我遗漏了什么。这与Scala语言有关吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-17 06:15:59

为了回答你的标题问题,星火本身不会给你任务中的并行性带来好处。spark.task.cpus参数的主要用途是允许具有多线程性质的任务。如果您在每个任务中调用外部多线程例程,或者希望在任务级别上封装最好的并行级别,则可能希望将spark.task.cpus设置为多个。

  • 不过,将此参数设置为超过1并不是您经常做的事情。
代码语言:javascript
复制
- The scheduler will not launch a task if the number of available cores is less than the cores required by the task, so if your executor has 8 cores, and you've set `spark.task.cpus` to 3, only 2 tasks will get launched.
- If your task does not consume the full capacity of the cores all the time, you may find that using `spark.task.cpus=1` and experiencing some contention within the task still gives you more performance.
- Overhead from things like GC or I/O probably shouldn't be included in the `spark.task.cpus` setting, because it'd probably be a much more static cost, that doesn't scale linearly with your task count.

​

问题1:对于一台多核机器(例如,4个核,8个硬件线程),当"spark.task.cpus = 4“时,火花是否会使用4个核心(每个核心一个线程),还是使用两个超级线程?

JVM几乎总是依赖于操作系统来为它提供信息和与CPU工作的机制,而AFAIK在这里并没有做什么特别的事情。如果Runtime.getRuntime().availableProcessors()或ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors()为启用HT的双核英特尔处理器返回4,那么Spark也会看到4个内核。

问题2:这种硬件并行是如何实现的?我试图查看代码,但没有发现任何与硬件或JVM通信的内核级并行性。例如,如果任务是“筛选”函数,那么如何将单个筛选任务分配到多个核心或线程?

正如上面提到的,Spark不会根据spark.task.cpus参数自动并行任务。Spark主要是一个数据并行引擎,它的并行性主要是通过将数据表示为RDD来实现的。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36671644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档