并行处理spark的哪些操作?

What operations of spark is processed in parallel?

我正在努力思考 spark 的整个概念。我认为我对 spark 平台有一个非常初步的了解。据我了解,Spark 具有 RDD 的概念,它是内存中 "stuff" 的集合,因此处理速度更快。您可以使用 map 和 flatmaps 等方法转换 RDD。由于转换是 惰性 ,在您对最终 RDD 调用操作之前,它们不会被处理。我不清楚的是,当你做一个动作时,转换 运行 是并行的吗?您可以分配工人并行执行 action 吗?

例如,假设我有一个加载到 RDD 中的文本文件,

lines = //loadRDD
lines.map(SomeFunction())
lines.count()

到底发生了什么? SomeFunction() 是否处理 RDD 的一个分区?平行方面是什么?

RDD 是对分布在集群中的数据的抽象。它允许您对其执行操作,而不必考虑每个部分在哪个节点上。

对于任何分布式计算引擎,某些操作将在集群中并行执行,而其他操作则需要以某种方式将数据聚合或减少到一台机器上。你正好提供了两个很好的例子。

map 是一个简单的可分发命令。假设您有一些数据 A1、A2 和 A3,Spark 分别将它们分布在三个节点 N1、N2 和 N3 上。在数据集上调用 map(someFunction()) 将让 N1 将 someFunction 应用于 A1 中的所有元素,而所有其他节点也执行相同的操作。

count,虽然它可以分解 "N1, count up all the data you have",但最终需要 return 单个值到单个节点。在 Spark 术语中,collecting 数据。诚然,count 确实非常快,但您也可以强制 RDD 将所有数据存储在单个节点上(我将其用于输出格式和类似操作)。

所以,可以运行并行的是并行的,不能并行的等待然后以某种方式对数据进行分组。 Spark 在幕后进行了各种优化(我才刚刚开始学习)当然是为了确保它的速度。

最后免责声明,我不是 Spark 核心工程师,这是一个非常高水平的答案。我确信有一些核心贡献者可以更详细地讨论命令如何并行化的细节。

lines is just a name for the RDD data structure resident in the driver which represents a partitioned list of rows. The partitions are being managed at each of your worker nodes when they are needed.

When your action count is called, Spark works backwards through the tasks to perform that action, resulting in a section of the file being read (a partition), SomeFunction being serialised and sent over the network to the workers, and executed on each row. If you have lots of workers then more than one partition can be read at a time and SomeFunction can be mapped over a partition for each worker/core.

Each worker sends the count of items for the partition it has processed back to the driver and the driver can sum up the counts from all the partitions and return the total.

Note: in your example, SomeFunction is redundant with respect to the count of items.