它会收集并保存或保存每个节点

时间:2017-05-03 19:28:20

标签: apache-spark

我们有一个包含10个节点的火花簇。我有一个连接几个数据帧的进程,然后将结果保存到s3位置。我们正在集群模式下运行。当我在数据帧上调用save时,它是从节点保存还是将所有结果收集到驱动程序并将其从驱动程序写入s3。有没有办法验证这一点。

1 个答案:

答案 0 :(得分:1)

RDD.save()会触发对整个查询的评估。

工作由源数据(即文件)进行分区,可以完成任何拆分,将各个任务推送到可用执行程序,收集结果,最后使用实现中定义的跨节点协议将其写入目标目录FileCommitProtocol的{​​{1}},通常是HadoopMapReduceCommitProtocol,然后与Hadoop的FileOutputCommitter一起编排提交。

基本上:

  1. 任务写入__temporary/$job-attempt/$task-attempt
  2. 下的任务特定子目录
  3. 任务说他们已经准备好写了,火花司机告诉他们提交vs abort
  4. 在推测执行或失败条件下,任务可以中止,在这种情况下,他们会删除他们的临时目录
  5. 在提交时,任务列出其目录中的文件并将其重命名为作业尝试目录,或直接指向目标(v2协议)
  6. 在作业提交中,驱动程序列出并重命名作业尝试目录(v1协议)中的文件,或者是无操作(v2)。
  7. 关于“写入s3”的问题,如果你使用的是Apache Spark(而不是amazon EMR),那么请注意这个列表+重命名提交机制是(a)慢,因为重命名实际上是副本,而且(b) )由于S3的最终一致性,尤其是列表不一致,这意味着任务保存的文件可能未列出,因此未提交

    在撰写本文时(2017年5月),已知使用s3a或s3n客户端安全提交的唯一提交者是the netflix committer

    正在进行pull this into Hadoop and hence spark的工作,但同样,在2017年5月,它仍在进行中:仅限演示状态。我是工程师这样说的。

    要关闭:如果您想要可靠的数据输出写入S3,请咨询在EC2 上托管代码的人。如果您在没有任何供应商特定代码的情况下使用开箱即用的Apache Spark,不要直接写入S3 。它可能在测试中起作用,但是当看到间歇性故障时,您可能会丢失数据而甚至不会注意到。统计数据是你的敌人:你做的工作越多,数据集就越大,执行的任务就越多 - 所以最终会出现问题。