簡體   English   中英

火花數據幀緩存/持久性未按預期工作

[英]spark dataframe cache/persist not working as expected

我有一個執行典型ETL工作的spark 1.3應用程序:它從幾個不同的配置單元表中讀取數據,對數據幀執行聯接和其他操作,最后將輸出作為文本文件保存到HDFS位置。

該應用程序運行良好,除了其第6階段經常遇到失敗,並顯示錯誤消息,例如“未得到確認而失敗”。 Spark將重試並最終成功完成所有階段。

為了加快重試過程,我想緩存第6階段的父數據幀。我為第6階段使用的數據幀添加了.persist(StorageLevel.MEMORY_AND_DISK_SER) 。但是,當作業運行時,火花用戶界面,我什么也看不到被緩存/持久化。 當第6階段失敗時,將再次重新計算所有需要的數據。

這對於兩個集群是相同的,一個獨立,一個在Yarn下。 我也嘗試了.cache().persist(StorageLevel.MEMORY_ONLY)等,但結果相同。 我不確定是什么原因造成的。 與可用內存相比,我要緩存的數據並不大(〜50G與〜500G)。 唯一值得一提的是,我要緩存的數據從未被使用過一次以上-從理論上講,如果第6階段不會常規失敗,則根本不需要緩存。

任何人都對為什么持久性/緩存行為如此有更多見解?

您可能已經在階段邊界緩存了RDD,以便實際緩存和錯誤發生在同一階段。 嘗試通過在每個RDD上運行操作來強制實現RDD,例如,在緩存它們后立即執行.count()

還要注意,當執行者去世時,它緩存的數據也隨之消失。 如果您的錯誤屬於此類,使用.checkpoint()而不是緩存會更好。

最后,我建議您花些時間了解導致錯誤的真正原因(聽起來像是超時太低),否則您將繼續浪費時間重新計算數據並最終再次進入類似條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM