【问题标题】:Apache Spark RDDApache Spark RDD
【发布时间】:2014-05-13 23:07:08
【问题描述】:

工具:带有 spark 0.9.0 的 hadoop 集群(没有 YARN)。

理想的情况是通过 HDFS 在 namenode 上运行 spark 程序,而不在 datanode 之间进行通信。该程序会这样做:

举个例子:在 HDFS 上,我有 2 种类型的数据:A 和 B,我的集群由 3 个数据节点组成。

我的目标是运行一个可以处理 A 和 1/3B 的所有数据的程序。 Datanode1 与 A 和 B1(前三分之一)交互,Datanode2 与 A 和 B2(第二个三分之一)交互,Datanode3 与 A 和 B3 交互...... 所以为了尊重“机器之间没有通信直到结束”的条件,我必须在datanode1的内存中拥有A和B1,在......的内存中拥有A和B2。

程序在每个datanode上的结果将在最后汇总。

有没有办法用 Spark 做到这一点?

【问题讨论】:

  • 为什么要处理每个节点中的所有A?在我看来,您试图限制您的工作将如何执行,而不是指定您的工作将做什么,然后让 Spark 进行优化。为什么你有这个限制?安全?您能否更具体地说明您尝试执行哪种计算?
  • 是的,我正在研究推荐算法:使用随机梯度作为优化器的矩阵分解。我想并行化我的算法。事实上,是的,如果 spark 会进行优化,那将是完美的。我的目标是优化计算时间。所以我不想通过网络通信来访问数据,这就是为什么我认为限制作业的执行可能是一个想法。最近我听说 spark 可以在实际计算期间加载对下一次计算有用的数据。因此,网络通信将在计算期间“隐藏”。需要一些资源

标签: hadoop cluster-computing hdfs clustered-index apache-spark


【解决方案1】:

据我了解,如果您想进行分布式矩阵分解,并且您知道 Spark 可以帮助加快这一速度。好吧,首先使用 Spark 的重点不是避免网络负载,使用 Spark 完成此类任务的重点是您可以将内容放入内存并迭代多次,而无需重新读取/写入磁盘(即Hadoop 中发生了什么)。因此,与使用 Hadoop 相比,您将获得巨大的加速,因为磁盘 IO 比大多数实际计算要慢得多。

我假设你在做这样的事情:

http://www.mpi-inf.mpg.de/~rgemulla/publications/gemulla11dsgd.pdf

如果您使用 Scala-Spark 编写代码,我很乐意告诉您什么时候需要调用 .cache()。老实说,我无法通过浏览论文来判断使用 Spark 缓存是否有帮助,但只需几分钟就可以将代码重构为最佳状态,而无需了解它到底在做什么。

简而言之,答案是 Spark 不会帮助减少净 IO,但 spark 可以帮助减少磁盘 IO,并且可能是解决您问题的合适人选。

【讨论】:

  • 问题是我找不到这种网络负载优化的证据。如果对于每个计算,数据都不存在于本地,并且 spark 必须等待网络负载来进行计算。由于火花内存(或缓存),我将在计算上赢得一些时间,但在网络负载期间会松动它。无论如何,我将继续阅读我能找到的关于这个主题的内容。感谢您的帮助,我会告诉我将采取哪条路来实施它;)。
猜你喜欢
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2023-03-17
  • 2016-12-06
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多