【问题标题】:How Spark and S3 interactSpark 和 S3 如何交互
【发布时间】:2021-02-16 09:42:27
【问题描述】:

我想知道在以下场景中如何将数据加载到 spark 中:

有 10 GB 的交易数据以 parquet 格式存储在 S3 中,我将运行一个 Spark 程序来对该 10 GB Parquet 文件中的每条记录进行分类(例如收入、购物、餐饮)。

我有以下问题:

  1. 如何将这 10 GB 分配给 Spark 集群中的不同工作程序?将 10 GB 文件加载到 Spark Master 然后 Master 中是否拆分数据并发送给执行程序?
  2. 如果所有这些都发生在内存中?如果其中一个 executor 在作业运行期间崩溃了,master 是否会再次从 S3 加载 10 GB 文件并提取应该由崩溃的 executor 处理的数据子集并发送给另一个 executor?

【问题讨论】:

    标签: apache-spark amazon-s3


    【解决方案1】:
    1. 如何将这 10 GB 分配给 Spark 集群中的不同工作程序?将 10 GB 文件加载到 Spark Master 然后 Master 中是否拆分数据并发送给执行程序?

    答案: Spark 遵循主从架构。我们有一个主节点(Driver/Co-Ordinator)和多个分布式工作节点。驱动进程运行在主节点上,程序的main方法运行在驱动进程中。驱动进程创建 SparkSession 或 SparkContext。驱动进程根据沿袭图代码中的转换和动作操作将用户代码转换为任务。驱动程序创建逻辑和物理计划,一旦物理计划准备好,它就会与集群管理器协调以让执行者完成任务。 Driver 只是跟踪每个 executor 的数据(元数据)的状态。

    因此,10 GB 文件不会加载到主节点。 S3 是一个分布式存储,Spark 以拆分方式从中读取。驱动程序进程只是决定数据将如何拆分以及每个执行程序需要处理什么。即使您缓存数据,它也仅根据执行程序正在处理的分区/数据缓存在执行程序节点上。除非您调用计数、收集等操作操作,否则不会触发任何操作。它会创建一个沿袭图和 DAG 来跟踪此信息。


    1. 如果所有这些都发生在内存中?如果其中一个 executor 在作业运行期间崩溃了,master 是否会再次从 S3 加载 10 GB 文件并提取应该由崩溃的 executor 处理的数据子集并发送给另一个 executor?

    答案: 正如第一个问题所回答的那样,只有在执行任何操作时才会将任何内容加载到内存中。加载到内存中并不意味着它会被加载到驱动程序内存中。根据动作数据被加载到驱动程序或执行程序的内存中。如果您使用了collect 操作,则所有内容都会加载到驱动程序内存中,但对于其他一些操作,例如count,如果您有缓存数据帧,那么数据将被加载到每个执行程序节点上的内存中。

    现在,如果其中一个执行器在作业运行期间崩溃,驱动程序拥有崩溃执行器拥有的沿袭图信息和数据(元数据),因此它在其他执行器上运行相同的沿袭图并执行任务。这就是使 Spark 具有弹性和容错能力的原因。

    【讨论】:

    • 因此它在其他执行器上运行相同的谱系图并执行任务 - 也可以在同一执行器上重新计算。
    • 感谢您的解释。您能否详细说明一下:S3 是一个分布式存储,并且 spark 以拆分方式从中读取数据 executor 如何从 parquet 中读取数据子集?
    【解决方案2】:

    每个工作人员将在其已提供的 parquet 文件范围内发出 1+ GET 请求;更多,因为它在文件周围寻找。整个 10GB 文件永远不会加载到任何地方。

    每个工作人员都会对自己的拆分进行自己的读取;这会影响存储/分片的整体 IO 容量。

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 2017-10-14
      • 2014-02-26
      • 1970-01-01
      • 2021-04-04
      • 2021-03-31
      相关资源
      最近更新 更多