我们有一个带有10个节点的火花群集。我有一个加入几个数据范围的过程,然后将结果保存到S3位置。我们以集群模式运行。当我调用保存数据框时,它是从节点保存的还是将所有结果收集给驱动程序并将其从驱动程序写入S3。有没有办法验证这一点。
RDD.save()
触发整个查询的评估。
工作是由源数据(即文件(和任何可以完成的分组的分区的,将单个任务推向可用执行者,收集结果并最终使用实现中定义的跨节点协议将其写入目标目录FileCommitProtocol
,通常是HadoopMapReduceCommitProtocol
,然后与Hadoop的FileOutputCommitter
一起编排提交。
本质上:
- 任务写入
__temporary/$job-attempt/$task-attempt
下的特定任务细胞 - 任务说他们已经准备好编写,火花驱动程序告诉他们提交vs流产
- 在投机执行或失败条件下,任务可以中止,在这种情况下,他们删除了自己的临时
- 在提交中,任务列出了其DIR中的文件,并将其重命名为DIR,或直接转到目标(V2协议(
- 在作业提交上,驱动程序要么列出和重命名在作业尝试dir(v1协议(中,要么是no-op(v2(。
在"写入S3"的问题上,如果您使用的是Apache Spark(而不是Amazon EMR(,请注意此列表 重命名的提交机制是(a(慢速,因为重命名确实是副本,并且(b(危险是因为S3的最终一致性,尤其是列表不一致,这意味着可能未列出任务保存的文件,因此未提交
在撰写本文时(2017年5月(,已知使用S3A或S3N客户端安全提交的唯一参数是Netflix参数。
正在进行的工作将其纳入Hadoop并因此,因此,在2017年5月,这仍然是一项正在进行的工作:仅演示状态。我说这样的工程师。
关闭然后:如果您想将可靠的数据输出写入S3,请咨询谁在EC2 上托管您的代码。如果您在没有任何供应商特定代码的情况下使用现有的Apache Spark,则请勿直接写入S3 。它可能在测试中起作用,但是看到间歇性故障,您可能会丢失数据,甚至没有注意到。统计数据是您的敌人:您所做的工作越多,数据集越大,执行的任务越多,因此最终会出现问题。