我一直在阅读并试图了解星火框架如何在独立模式下使用其核心。根据Spark文档,默认情况下参数"spark.task.cpus"'s值设置为1,这意味着要为每个任务分配的核数。
问题1:当"spark.task.cpus = 4“时,一台多核机器的(例如,4个核心,8个硬件线程),会使用4个核心(每个核心一个线程)还是两个超级线程?
如果我设置"spark.task.cpus = 16",比这台机器上可用的硬件线程数还要多,会发生什么情况?
问题2:是如何实现这种硬件并行的?我试图查看代码,但没有发现任何与硬件或JVM通信的内核级并行性。例如,如果任务是“筛选”函数,那么如何将单个筛选任务分配到多个核心或线程?
也许我遗漏了什么。这与Scala语言有关吗?
发布于 2016-04-17 06:15:59
为了回答你的标题问题,星火本身不会给你任务中的并行性带来好处。spark.task.cpus参数的主要用途是允许具有多线程性质的任务。如果您在每个任务中调用外部多线程例程,或者希望在任务级别上封装最好的并行级别,则可能希望将spark.task.cpus设置为多个。
- 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来实现的。
https://stackoverflow.com/questions/36671644
复制相似问题