【发布时间】:2015-04-13 10:30:42
【问题描述】:
假设我对托管在 HDFS 中的文件执行一些 Spark 操作。像这样的:
var file = sc.textFile("hdfs://...")
val items = file.map(_.split('\t'))
...
因为在 Hadoop 世界中,代码应该放在数据所在的位置,对吗?
所以我的问题是:Spark 工作人员如何知道 HDFS 数据节点? Spark 如何知道在哪些数据节点上执行代码?
【问题讨论】:
-
查看文档:spark.apache.org/docs/latest/cluster-overview.html 取决于集群管理器。
-
我不认为 Spark 关心数据在哪里,我认为你也不应该关心。吞吐量受磁盘限制,而不是网络。我不同意“代码应该去数据所在的地方”。
-
当您使用
hdfs作为协议时,文件系统api 会泄露物理位置。 spark 是否使用它,就像 Daniel 已经说过的那样并不重要。 -
为了利用数据局部性,Hadoop Map/Reduce 将代码传输到具有所需数据的节点,然后节点并行处理这些数据。 Spark必须做同样的恕我直言。我可以想象,在 ResourceManager(如 YARN)的帮助下,Spark 能够做到这一点。这意味着我总是必须设置一个 RM 才能“正确”运行 Spark(除了简单的字数演示)。没有?
-
Spark 确实使用了局部性。看看
HadoopRDD。您当然最希望避免通过网络移动数据。
标签: hadoop apache-spark hdfs