Spark:扩展内核数量的性能数字不一致
Spark: Inconsistent performance number in scaling number of cores
我正在使用排序基准对 Spark 进行简单的扩展测试——从 1 个核心到 8 个核心。我注意到 8 核比 1 核慢。
//run spark using 1 core
spark-submit --master local[1] --class john.sort sort.jar data_800MB.txt data_800MB_output
//run spark using 8 cores
spark-submit --master local[8] --class john.sort sort.jar data_800MB.txt data_800MB_output
每种情况下的输入和输出目录都在 HDFS 中。
1 core: 80 secs
8 cores: 160 secs
我希望 8 核性能有 x 倍的加速。
理论限制
我假设您很熟悉 Amdahl's law 但这里有一个快速提醒。理论上的 speedup 定义如下:
其中:
- s - 是并行部分的加速。
- p - 是可以并行化的程序部分。
在实践中,理论加速总是受到无法并行化的部分的限制,即使 p 相对较高 (0.95),理论限制也很低:
(此文件已根据 Creative Commons Attribution-Share Alike 3.0 Unported 许可证获得许可。
归因于:Daniels220 at English Wikipedia)
这有效地设定了您可以达到多快的理论界限。你可以预期 p 在 embarrassingly parallel jobs 的情况下会相对较高,但我不会梦想任何接近 0.95 或更高的东西。这是因为
Spark 是一个高成本的抽象
Spark 设计用于数据中心规模的商用硬件。它的核心设计专注于使整个系统健壮且不受硬件故障的影响。当您使用数百个节点时,这是一个很棒的功能
并执行长 运行 的作业,但它并不能很好地缩小规模。
Spark 并不专注于并行计算
在实践中,Spark 和类似系统主要关注两个问题:
- 通过在多个节点之间分配 IO 操作来减少整体 IO 延迟。
- 在不增加单位成本的情况下增加可用内存量。
这是大规模数据密集型系统的基本问题。
并行处理与其说是主要目标,不如说是特定解决方案的副作用。 Spark首先是分布式的,其次是并行的。要点是通过向外扩展来保持处理时间随着数据量的增加而保持不变,而不是加速现有的计算。
使用现代协处理器和 GPGPU,与典型的 Spark 集群相比,您可以在单台机器上实现更高的并行度,但由于 IO 和内存限制,它不一定有助于数据密集型作业。问题是如何足够快地加载数据而不是如何处理它。
实际意义
- Spark 不能替代单机上的多处理或多线程。
- 增加单台机器上的并行度不太可能带来任何改进,而且通常会由于组件的开销而降低性能。
在此上下文中:
假设 class 和 jar 是有意义的,并且它确实是一种排序,读取数据(单个分区输入,单个分区输出)并在单个分区上的内存中排序比执行一个更便宜具有随机文件和数据交换的整个 Spark 排序机器。
我正在使用排序基准对 Spark 进行简单的扩展测试——从 1 个核心到 8 个核心。我注意到 8 核比 1 核慢。
//run spark using 1 core
spark-submit --master local[1] --class john.sort sort.jar data_800MB.txt data_800MB_output
//run spark using 8 cores
spark-submit --master local[8] --class john.sort sort.jar data_800MB.txt data_800MB_output
每种情况下的输入和输出目录都在 HDFS 中。
1 core: 80 secs
8 cores: 160 secs
我希望 8 核性能有 x 倍的加速。
理论限制
我假设您很熟悉 Amdahl's law 但这里有一个快速提醒。理论上的 speedup 定义如下:
其中:
- s - 是并行部分的加速。
- p - 是可以并行化的程序部分。
在实践中,理论加速总是受到无法并行化的部分的限制,即使 p 相对较高 (0.95),理论限制也很低:
(此文件已根据 Creative Commons Attribution-Share Alike 3.0 Unported 许可证获得许可。
归因于:Daniels220 at English Wikipedia)
这有效地设定了您可以达到多快的理论界限。你可以预期 p 在 embarrassingly parallel jobs 的情况下会相对较高,但我不会梦想任何接近 0.95 或更高的东西。这是因为
Spark 是一个高成本的抽象
Spark 设计用于数据中心规模的商用硬件。它的核心设计专注于使整个系统健壮且不受硬件故障的影响。当您使用数百个节点时,这是一个很棒的功能 并执行长 运行 的作业,但它并不能很好地缩小规模。
Spark 并不专注于并行计算
在实践中,Spark 和类似系统主要关注两个问题:
- 通过在多个节点之间分配 IO 操作来减少整体 IO 延迟。
- 在不增加单位成本的情况下增加可用内存量。
这是大规模数据密集型系统的基本问题。
并行处理与其说是主要目标,不如说是特定解决方案的副作用。 Spark首先是分布式的,其次是并行的。要点是通过向外扩展来保持处理时间随着数据量的增加而保持不变,而不是加速现有的计算。
使用现代协处理器和 GPGPU,与典型的 Spark 集群相比,您可以在单台机器上实现更高的并行度,但由于 IO 和内存限制,它不一定有助于数据密集型作业。问题是如何足够快地加载数据而不是如何处理它。
实际意义
- Spark 不能替代单机上的多处理或多线程。
- 增加单台机器上的并行度不太可能带来任何改进,而且通常会由于组件的开销而降低性能。
在此上下文中:
假设 class 和 jar 是有意义的,并且它确实是一种排序,读取数据(单个分区输入,单个分区输出)并在单个分区上的内存中排序比执行一个更便宜具有随机文件和数据交换的整个 Spark 排序机器。