什么样的火花操作并行处理?

时间:2015-06-29 02:34:21

标签: apache-spark spark-streaming rdd

我试图总结一下火花的整个概念。我想我对Spark平台有一个非常基本的了解。根据我的理解,Spark有RDD的概念,这是一个"东西"的集合。在内存中处理速度更快。您可以使用地图和平面地图等方法转换 RDD。由于转换是 lazy ,因此只有在最终RDD上调用操作后才会处理它们。我不清楚的是,当你做一个动作时,转换并行运行?你能指派工人同时进行action吗?

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

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

究竟发生了什么? SomeFunction()是否处理​​RDD的分区?什么是平行方面?

2 个答案:

答案 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核心工程师,这是一个非常高级的答案。我确信有核心贡献者可以更详细地讲述如何并行化命令的细节。