在Spark的RDD中更新值的有效方法是什么?

bxs*_*shi 10 scala apache-spark

我在写一个图形相关的程序ScalaSpark.数据集有400万个节点和400万个边缘(你可以将它视为一棵树),但是每次(a Iteration),我只编辑它的一部分,即由给定节点生根的子树和节点在给定节点和根之间的路径中.

Iteration有依赖,这意味着i+1 Iteration需求的结果来自何处i.所以我需要将每个结果存储到Iteration下一步.

我试图找到一种有效的更新方法RDD,但到目前为止还没有任何线索.我发现PairRDD有一个lookup函数可以将计算时间减少O(N)到O(M),N表示对象的总数RDDM表示数量每个分区中的元素.

所以我想反正有我可以更新的对象RDDO(M)?或者更理想的是,O(1)?(我在Spark的邮件列表中看到一封电子邮件说lookup可以修改以实现O(1))

另一件事是,如果我可以实现O(M)更新RDD,我可以将分区增加到比我拥有的内核数量更大的数量并获得更好的性能吗?

maa*_*asg 6

作为功​​能数据结构,RDD是不可变的,并且RDD上的操作生成新的RDD.

结构的不变性并不一定意味着完全复制.持久性数据结构是一种常见的功能模式,其中对不可变结构的操作产生新结构,但先前版本被维护并经常被重用.

GraphX(Spark之上的'模块')是一个基于Spark的图形API,它使用了这样的概念:来自docs:

通过生成具有所需更改的新图来完成对图的值或结构的更改.请注意,原始图形的大部分(即,未受影响的结构,属性和指标)在新图形中重复使用,从而降低了此固有功能数据结构的成本.

它可能是解决手头问题的解决方案:http://spark.apache.org/docs/1.0.0/graphx-programming-guide.html


clo*_*oud 5

RDD是分布式数据集,分区是RDD存储的单位,RDD的处理单位是元素。

例如,你从HDFS读取一个大文件作为RDD,那么这个RDD的元素是String(该文件中的行),spark将这个RDD按分区跨集群存储。对于你来说,作为一个spark用户,你只需要关心如何处理该文件的行,就像你在写一个普通的程序一样,从本地文件系统中逐行读取一个文件。这就是火花的力量:)

无论如何,你不知道哪些元素将存储在某个分区中,因此更新某个分区是没有意义的。

  • @bxshi RDD对象很便宜,但它里面的数据很昂贵。例如,您编写一个应用程序:data_source -> rdd1 -> rdd2 -> rdd3 -> get_result。Spark实际上做的是:记住你的转换t1、t2、t3,并将这些转换应用到数据源并得到结果。Spark不会保留RDD的数据,除非你调用`RDD.cache()`。 (4认同)