Jac*_*Hoe 5 multithreading scala cpu-cores apache-spark
我想了解 Spark 中的分区。我在 Windows 10 上以本地模式运行 spark。我的笔记本电脑有 2 个物理内核和 4 个逻辑内核。
1/ 术语:对我来说,spark 中的一个核心 = 一个线程。所以 Spark 中的内核不同于物理内核,对吧?Spark 核心与任务相关联,对吗?如果是这样,由于您需要一个线程用于分区,如果我的 sparksql 数据帧有 4 个分区,则它需要 4 个线程,对吗?
2/ 如果我有 4 个逻辑核心,是否意味着我只能在我的笔记本电脑上同时运行 4 个并发线程?所以 4 在 Spark 中?
3/ 设置分区数:如何选择我的数据帧的分区数,以便尽可能快地运行进一步的转换和操作?- 因为我的笔记本电脑有 4 个逻辑核心,所以它应该有 4 个分区吗?- 分区数是与物理核相关还是与逻辑核相关?- 在 spark 文档中,写到每个 CPU 需要 2-3 个任务。既然我有两个物理内核,那么分区的 nb 应该等于 4 或 6 吗?
(我知道分区数对本地模式不会有太大影响,但这只是为了理解)
不存在“火花芯”这样的东西。如果您指的是像这样的选项--executor-cores,那么是的,它指的是每个执行器将同时运行多少个任务。
您可以将并发任务的数量设置为您想要的任何数量,但超过您拥有的逻辑核心的数量可能不会带来任何好处。
使用的分区数量视具体情况而定。如果不知道您正在执行的数据或转换,就很难给出一个数字。典型的建议是使用略低于总核心数的倍数。例如,如果您有 16 个核心,则可能使用 47、79、127 以及略低于 16 倍数的类似数字。这样做的原因是您希望确保所有核心都在工作(尽可能少的时间让资源空闲,等待其他核心完成)。但是你留了一点额外的空间以允许推测执行(如果运行缓慢,spark 可能会决定运行同一个任务两次,看看第二次尝试是否会更快)。
虽然选择数字需要一些尝试和错误,但可以利用 Spark 作业服务器来监视任务的运行情况。每个任务很少且有很多记录意味着您可能应该增加分区数量,另一方面,每个分区只有很少的记录也很糟糕,在这些情况下您应该尝试减少分区。