【问题标题】:Apache Spark architectureApache Spark 架构
【发布时间】:2015-08-26 22:11:48
【问题描述】:

试图找到有关 Apache Spark 内部架构的完整文档,但那里没有结果。

例如,我试图理解下一件事: 假设我们在 HDFS 上有 1Tb 的文本文件(集群中有 3 个节点,复制因子为 1)。该文件将被分成 128Mb 的块,每个块将仅存储在一个节点上。我们在这些节点上运行 Spark Workers。我知道 Spark 正在尝试处理存储在同一节点上 HDFS 中的数据(以避免网络 I/O)。例如,我正在尝试在这个 1Tb 文本文件中进行字数统计。

我有下一个问题:

  1. Spark 是否会将chuck (128Mb) 加载到RAM 中,计算字数,然后从内存中删除并按顺序执行?如果没有可用的 RAM 怎么办?
  2. Spark 什么时候不使用 HDFS 上的本地数据?
  3. 如果我需要执行更复杂的任务,当每个 Worker 的每次迭代结果需要传输到所有其他 Worker(洗牌?)时,我是否需要自己将它们写入 HDFS 然后读取他们?例如,我不明白 K-means 聚类或梯度下降如何在 Spark 上工作。

我将感谢任何指向 Apache Spark 架构指南的链接。

【问题讨论】:

标签: apache-spark hdfs bigdata


【解决方案1】:

这里是您问题的答案

  1. Spark 将尝试将 128Mb 块加载到内存中并在 RAM 中进行处理。请记住,由于 Java 开销(Java 标头等),内存中的大小可能比原始文件的原始大小大几倍。根据我的经验,它可以大 2-4 倍。 如果没有足够的内存 (RAM),Spark 会将数据溢出到本地磁盘。您可能需要调整这两个参数以尽量减少溢出:spark.shuffle.memoryFractionspark.storage.memoryFraction

  2. Spark 将始终尝试使用 HDFS 中的本地数据。如果该块在本地不可用,它将从集群中的另一个节点检索它。 more info

  3. 在随机播放时,您无需手动将中间结果保存到 HDFS。 Spark 会将结果写入本地存储并仅对需要的数据进行混洗,从而最大限度地重复使用下一阶段的本地存储。

这是很好的video,它更详细地介绍了 Spark 架构、shuffle 期间发生的事情以及优化性能的技巧。

【讨论】:

    【解决方案2】:

    添加到其他答案,在这里我想包括问题中提到的 Spark 核心架构图。

    大师是这里的入口。

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 1970-01-01
      • 2016-01-14
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      相关资源
      最近更新 更多