【问题标题】:How does Apache Spark know about HDFS data nodes?Apache Spark 如何了解 HDFS 数据节点?
【发布时间】: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


【解决方案1】:

Spark 重用 Hadoop 类:当您调用 textFile 时,它会创建一个 TextInputFormat,其中有一个 getSplits 方法(拆分大致是一个分区或块),然后每个 InputSplitgetLocationsgetLocationInfo 方法。

【讨论】:

  • 让我澄清一下:当我的文件位于 HDFS 中的某个位置时,Spark 可以确定它在哪个节点上,对吧?在我的所有 HDFS 数据节点上设置 Spark 工作程序是否足够 - 并且 Spark 会自动将数据路由到正确的节点?还是我总是需要资源管理器(如 Mesos 或 YARN)?
  • 是的。使用InputFormat 意味着它正在重用可以确定输入拆分位置的逻辑。这用于调度。
  • 不需要使用 YARN,每个 Spark 工作人员都知道它在哪个节点上运行。然后,Spark master 可以根据数据位置(和可用资源)选择工作节点。然而,如果您已经有一个 Hadoop YARN 集群,那么重用它可能是个好主意。
  • 有趣。所以我可以独立安装 HDFS 和 Spark(首先安装我的 HDFS 数据节点,然后安装我的 Spark 工作程序)?并且因为“位置信息”在两个框架之间是兼容的,Spark 会自动选择正确的 worker/data 节点——我可以这样说吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2023-03-07
  • 2012-03-17
  • 1970-01-01
相关资源
最近更新 更多