[英]Spark i/o with S3
阅读以下内容 https://blog.duyet.net/2021/04/spark-kube.netes-performance-tuning.html
使用 S3 的 I/O
append 数据到现有数据集的时间更长,特别是,所有 Spark 作业都已完成,但您的命令尚未完成,这是因为驱动程序节点正在将任务的 output 文件从作业临时目录移动到最终目标目录-by-one ,这在云存储(例如 S3)中很慢。
启用此优化:spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2
我想检查大胆的说法是否属实。 我从来没有听说过 Spark Driver 用 S3 写文件/控制写。 当然,不是 HDFS 集群,而且 Spark Driver 确实需要从 S3 读取数据。 我的知识是执行器将数据写入 rest 或 KAFKA 的数据,即使在 AWS 上运行 Spark 也是如此。 但是,大概我错了,或者不是?
如果为真,ADLS2 也一样吗?
评论“我遇到了同样的问题,我发现将内容写入临时 HDFS 目录并使用诸如 s3-dist-cp 之类的命令将内容移动到 S3 更快”不是我要问的.
写那篇文章的人并没有完全理解整个工作提交问题,并且具有危险的误导性。
v1 提交算法包括
v2 提交算法是
博客作者指出 v1 的作业提交速度很慢是正确的。 真正的问题不是性能,而是正确性,因为任务提交在 s3 上不是原子的。
但是,v2到处都是不正确的,即使在 hdfs 上也是如此,因为 v2 任务提交是非原子的。 这就是为什么即使速度更快,您也不应该使用它。 任何地方。 真的。
那么对于 s3,如果你想将数据写入经典的“目录树”布局
这两者都通过将文件作为 S3 分段上传写入最终目的地来避免重命名,但直到作业提交才完成上传。 这使得作业提交更快,因为它只不过是列出/加载由每个任务尝试创建的单个清单文件(其中列出了其未完成的上传),然后发布完成。 没有重命名,并要求任务提交是一个 JSON 文件的 PUT,快速且原子。
如果为真,ADLS2 也一样吗?
v1 在那里工作,虽然列表很慢并且重命名不是很好,它比 HDFS 慢一点。它可以在作业提交的负载下进行限制,并出现奇怪的“古怪”失败,其中重命名被报告为 503/throttle 但实际上采取地方...这使 revoer 变得复杂。
Hadoop 3.3.5+ 添加了一个 Intermediate Manifest committer 以提高 Azure 和 Google GCS 的性能。 这些还通过在任务提交中编写清单来提交工作。 作业提交是这些的并行化列表/加载,然后并行化重命名。 将其视为 v3 提交算法。
最后,还有云优先格式:Iceberg、delta lake、Hudi,这些通过在某处编写单个清单文件以原子方式提交作业; 查询计划成为列出/加载清单文件链的工作,从而识别要处理的数据文件。 这些被所有从事spark/hive云性能问题工作的人广泛认可为未来。 如果你能使用这些,你的生活会更好。
延伸阅读:
在出现故障时将工作提交到持久存储的整个机制是分布式计算的一个迷人部分。 如果您阅读了零重命名提交者论文,最后一章实际上讨论了生产中仍然出错的地方。 事后看来,这是比当时更好的读物。 每个人都应该记录他们的生产问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.