[英]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.