我有一个小的Scala程序,在单节点上运行良好。但是,我正在将它扩展到多个节点上运行。这是我的第一次尝试。我只是想了解RDD在Spark中的工作原理,因此这个问题基于理论,可能不是100%正确。
假设我创建了一个RDD:
val rdd = sc.textFile(file)
现在,一旦我这样做了,这是否意味着在文件路径file
处的文件现在已经分区到所有节点上(假设所有节点都可以访问文件路径)?
其次,我想计算RDD中对象的数量(很简单),但是我需要在需要应用于RDD中对象的计算中使用该数字 - 以下是伪代码示例:
rdd.map(x => x / rdd.size)
假设有100个对象在`rdd`中,有10个节点,每个节点处理10个对象(这是假设RDD概念的工作方式),那么当我调用方法时,每个节点会使用`rdd.size`作为`10`还是`100`进行计算?因为总体上,RDD的大小为`100`,但在每个节点上它只有`10`。我需要在进行计算之前制作一个广播变量吗?最后,如果我对RDD进行转换,例如`rdd.map(_.split("-"))`,然后我想要新的RDD`size`,我是否需要对RDD执行一个操作,如`count()`,以便将所有信息发送回驱动程序节点?
rdd.flatMap(_.split("-"))
。 - lovasoa