我有一个小的Scala程序,可以在单节点上正常运行。但是,我正在扩展它,使其可以在多个节点上运行。这是我的第一次尝试。我只是想了解RDD在Spark中的工作方式,因此该问题基于理论,可能不是100%正确。

假设我创建一个RDD:val rdd = sc.textFile(file)
现在,一旦完成,这是否意味着file上的文件现在已在节点之间分区(假设所有节点都可以访问文件路径)?

其次,我想计算RDD中的对象数量(足够简单),但是,我需要在计算中使用该数量,该计算需要应用于RDD中的对象-伪代码示例:

rdd.map(x => x / rdd.size)

假设rdd中有100个对象,并说有10个节点,因此每个节点计数10个对象(假设这是RDD概念的工作原理),现在当我调用该方法时,每个节点将使用rdd.size10还是100?因为总体而言,RDD的大小为100,但是在本地每个节点上它仅为10。在执行计算之前,我需要做一个广播变量吗?该问题与以下问题相关。

最后,如果我对RDD进行了转换,例如rdd.map(_.split("-")),然后我想要RDD的新size,是否需要在RDD上执行操作,例如count(),以便将所有信息发送回驱动程序节点?

最佳答案

通常,文件(或文件的一部分,如果太大)将被复制到群集中的N个节点(HDFS上默认为N = 3)。并不是要在所有可用节点之间分割每个文件。

但是,对于您(即客户端)使用Spark处理文件应该是透明的-不论拆分和/或复制了多少个节点,您都不会在rdd.size中看到任何区别。有一些方法(至少在Hadoop中),可以确定当前文件可以位于哪些节点(部分)上。但是,在简单的情况下,您很可能不需要使用此功能。

更新:描述RDD内部的文章:https://cs.stanford.edu/~matei/papers/2012/nsdi_spark.pdf

10-01 03:19
查看更多