我有一个小的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
as来执行计算10
还是100
?因为总体而言,RDD是大小,100
但在每个节点上本地是10
。在进行计算之前,我需要做一个广播变量吗?该问题与以下问题相关。
最后,如果我对RDD进行了转换(例如)rdd.map(_.split("-"))
,然后想要size
RDD的新版本,是否需要对RDD执行操作(例如)count()
,以便将所有信息发送回驱动程序节点?
通常,文件(或文件的一部分,如果太大)将被复制到群集中的N个节点(HDFS上默认为N = 3)。并不是要在所有可用节点之间分割每个文件。
但是,对于您(即客户端)使用Spark使用文件应该是透明的-rdd.size
无论拆分和/或复制了多少个节点,您都不会看到的差异。有一些方法(至少在Hadoop中),可以确定当前文件可以位于哪些节点(部分)上。但是,在简单的情况下,您很可能不需要使用此功能。
更新:描述RDD内部的文章:https : //cs.stanford.edu/~matei/papers/2012/nsdi_spark.pdf
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句