工具:带有spark0.9.0的hadoop集群(没有Yarn)。
理想的情况是通过hdfs在namenode上运行spark程序,而不在datanode之间进行通信。程序将执行以下操作:
举个例子:在hdfs上,我有两种类型的数据:a和b,我的集群由3个数据节点组成。
我的目标是运行一个程序,它可以处理a和1/3b的所有数据。datanode1与a和b1(第一个第三个)交互,datanode2与a和b2(第二个第三个)交互,datanode3与a和b3交互。。。因此,为了遵守“直到结束机器之间没有通信”的条件,我必须在datanode1的内存中有a和b1,在datanode1的内存中有a和b2。。。
最后将给出每个数据节点上的程序结果。
有没有办法用spark做到这一点?
1条答案
按热度按时间hrirmatl1#
我理解这个问题,如果你想做分布式矩阵分解,并且你知道spark可以帮助你快速完成。首先,使用spark的目的不是为了避免网络负载,使用spark来完成这类任务的目的是,你可以把东西放到内存中,反复多次,而不必重新读/写磁盘(hadoop就是这样)。因此,与使用hadoop相比,您将获得巨大的加速,因为磁盘io比大多数实际计算要慢得多。
我猜你是这样做的:
http://www.mpi-inf.mpg.de/~rgemulla/publications/gemulla11dsgd.pdf
如果您用scala spark编写代码,我很乐意告诉您需要在什么时候调用.cache()。老实说,我不能通过浏览文章来判断使用spark缓存是否有帮助,但是只需要几分钟就可以将代码重构成最佳的东西,而不了解它到底在做什么。
简言之,答案是no spark不能帮助减少净io,但是yes spark可以帮助减少磁盘io,而且可能是解决问题的合适人选。