Apache spark spark的哪些操作是并行处理的?

Apache spark spark的哪些操作是并行处理的?,apache-spark,spark-streaming,rdd,Apache Spark,Spark Streaming,Rdd,我正试图对spark的整个概念了如指掌。我想我对spark平台有一个非常初步的了解。据我所知,Spark有RDD的概念,RDD是内存中“东西”的集合,因此处理速度更快。您可以使用map和flatmaps之类的方法来变换RDD。由于转换是惰性的,因此在调用最终RDD上的操作之前不会对其进行处理。我不清楚的是,当你做一个动作时,转换是并行运行的吗?您能否指派工人并行执行操作 例如,假设我有一个加载到RDD中的文本文件 lines = //loadRDD lines.map(SomeFunction(

我正试图对spark的整个概念了如指掌。我想我对spark平台有一个非常初步的了解。据我所知,Spark有RDD的概念,RDD是内存中“东西”的集合,因此处理速度更快。您可以使用map和flatmaps之类的方法来变换RDD。由于转换是惰性的,因此在调用最终RDD上的操作之前不会对其进行处理。我不清楚的是,当你做一个动作时,转换是并行运行的吗?您能否指派工人并行执行
操作

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

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

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

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

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

map
是一个简单的可分发命令。假设您有一些数据A1、A2和A3,它们分别分布在三个节点N1、N2和N3上。在数据集上调用
map(someFunction())
将允许N1将
someFunction
应用于A1中的所有元素,而所有其他节点都会这样做

count
虽然可以将其分解为“N1,计算所有数据”,但最终需要向单个节点返回单个值。在Spark术语中,
收集数据。诚然,count非常非常快,但您也可以强制RDD将所有数据存储在单个节点上(我将其用于输出格式和类似设置)

因此,那些可以并行运行的被并行化,那些不需要等待然后以某种方式分组数据的被并行化。Spark有各种各样的优化(我刚刚开始学习),当然是为了确保它的速度


最后免责声明,我不是Spark core工程师,这是一个非常高级别的答案。我相信有一些核心贡献者可以更详细地讲述命令并行化的细节。

只是驻留在驱动程序中的RDD数据结构的名称,它表示一个分区行列表。
分区
将在需要时在每个工作节点上进行管理

调用动作
count
时,Spark会在任务中反向工作以执行该动作,从而读取文件的一部分(分区
),
SomeFunction
被序列化并通过网络发送给工作人员,并在每一行上执行。如果您有很多辅助进程,那么一次可以读取多个分区,并且可以为每个辅助进程/核心在分区上映射
SomeFunction

每个工作进程将其已处理的分区的项目计数发送回驱动程序,驱动程序可以将所有分区的计数相加并返回总数


注意:在您的示例中,SomeFunction在项目计数方面是多余的

让我看看我是否理解这一点,RDD被划分为多个分区,因此当您调用一些转换时,比如说SomeFunction(),SomeFunction()将并行处理每个RDD分区?转换是
map
。map使用函数
SomeFunction
转换RDD的每一行。使用SomeFunction有效负载运行映射的任务将分配给每个辅助进程,辅助进程在每个本地分区上运行映射(根据SomeFunction转换每一行)。一张照片会让这一切变得非常清楚
是一个返回新RDD的转换。在本例中,它什么也没有实现:(1)您没有使用转换后的RDD。(2) 这意味着映射永远不会执行——正如您所说,转换是懒惰的。(3) 映射无法更改计数的结果。