我试图总结一下火花的整个概念。我想我对Spark平台有一个非常基本的了解。根据我的理解,Spark有RDD的概念,这是一个"东西"的集合。在内存中处理速度更快。您可以使用地图和平面地图等方法转换 RDD。由于转换是 lazy ,因此只有在最终RDD上调用操作后才会处理它们。我不清楚的是,当你做一个动作时,转换并行运行?你能指派工人同时进行action
吗?
例如,假设我有一个加载到RDD的文本文件,
lines = //loadRDD
lines.map(SomeFunction())
lines.count()
究竟发生了什么? SomeFunction()是否处理RDD的分区?什么是平行方面?
答案 0 :(得分:4)
lines
只是驻留在驱动程序中的RDD数据结构的名称,表示分区的行列表。在需要时,每个工作节点都会管理partitions
。
当您的操作count
被调用时,Spark会在任务中向后执行该操作,从而导致文件的一部分被读取(partition
),SomeFunction
被序列化并通过网络发送给工人,并在每一行执行。如果你有很多工作人员,那么一次可以读取多个分区,并且SomeFunction
可以映射到每个工作人员/核心的分区。
每个工作人员将已处理的分区的项目计数发送回驱动程序,驱动程序可以汇总所有分区的计数并返回总计。
注意:在您的示例中,SomeFunction在项目数方面是多余的。
答案 1 :(得分:1)
RDD
是对群集中分布的数据的抽象。它允许您对其执行操作,而不必考虑每个部分所在的节点。
对于任何分布式计算引擎,某些操作将在整个群集中并行化,而其他操作则要求以某种方式将数据聚合或缩减为单个计算机。你碰巧提供了两个很好的例子。
map
是一个简单的可分发命令。假设您有一些数据A1,A2和A3,Spark分别通过三个节点N1,N2和N3进行分配。在数据集上调用map(someFunction())
将允许N1将someFunction
应用于A1中的所有元素,而所有其他节点都执行相同的操作。
count
,虽然它可以被分解为“N1,计算你拥有的所有数据”,但最终需要将单个值返回到单个节点。在Spark术语中,collect
数据。当然,count非常非常快,但您也可以强制RDD将所有数据存储在一个节点上(我已将其用于输出格式化等)。
因此,可以并行运行的那些是并行化的,而那些不等待的那些然后以某种方式对数据进行分组。 Spark有各种各样的优化(我刚刚开始学习)当然要确保它的速度很快。
最后的免责声明,我不是Spark核心工程师,这是一个非常高级的答案。我确信有核心贡献者可以更详细地讲述如何并行化命令的细节。