全部產品
Search
文件中心

E-MapReduce:常見問題

更新時間:Jul 03, 2024

本文匯總了DeltaLake使用時的常見問題。

為什麼建表失敗?

Delta建表需要指定LOCATION,這種表在Spark中為外表。建表時,如果目標目錄不存在,即建立一張全新的表,理論上不會出現這種情況。如果LOCATION已經存在,那麼基於此LOCATION建表應當確保,建表語句的Schema與LOCATION內Delta log中定義的Schema相同。

流式寫入Delta時產生了很多的小檔案怎麼辦?

用Spark Streaming寫資料到Delta,本質上是執行一系列的mini batch,一個batch會產生一個或者多個檔案。由於batch size通常較小,因此Spark Streaming連續運行會產生相當數量的小檔案。解決方案有兩種:

  • 如果即時性要求不高,建議增大mini batch的trigger size。

  • 定期運行Optimize,對錶進行合并小檔案的操作。

Optimize執行時間很長是什麼原因?

如果長時間沒有進行Optimize操作,Delta內可能會累積相當數量的小檔案,此時運行Optimize可能執行時間會比較長。因此建議設定定時任務來定期觸發Optimize動作。

為什麼Optimize失敗了?應該如何處理?

Optimize會有刪除歷史資料和寫新資料的動作。由於Delta採用的樂觀鎖機制,寫事務在提交的時候,其中一個寫事務會失敗。尤其是一個流式作業在不斷地更新Delta內的資料(例如:CDC情境),此時Optimize失敗的機率會更大(注意:如果流式作業僅僅是新增資料而不涉及刪除或者更新,Optimize不會失敗)。建議使用者對錶進行基於時間的分區,每當一個分區完成,對該分區進行 Optimize操作。

執行了Optimize,為什麼還有很多小檔案?

Optimize是合并小檔案,但是被合并的小檔案不會被立即刪除。因為Delta有訪問歷史的功能,因此如果要訪問合并之前的歷史版本,這些小檔案會被用到。如果要刪除這些小檔案,請使用Vacuum命令。

執行了Vacuum,為什麼還有很多小檔案?

Vacuum動作是清理已經合并過的且已經超出了安全期的小檔案。預設安全期為7天。如果小檔案沒有被合并過,或者合并過的小檔案尚在安全期之內,Vacuum不會將之刪除。

如果想刪除最近產生的小檔案(這些小檔案已經被合并),應該如何處理?

不建議刪除時間過近的小檔案,因為Delta的歷史訪問功能可能會用到這些小檔案。如果確實要這麼做,有兩種做法:

  • 關閉安全期檢查:spark.databricks.delta.retentionDurationCheck.enabled=false,這個設定可以在啟動spark任務時作為參數傳入。

  • 修改全域的安全期為一個較小的值:例如在spark-defaults.conf 中設定spark.databricks.delta.properties.defaults.deletedFileRetentionDuration interval 1 hour

執行了Vacuum,為什麼還有很多的Delta log檔案?

Vacuum動作是合并資料檔案,並非合并Delta log檔案。Delta log檔案的合并和清理是Delta自動做的,每經歷10個提交,會自動觸發一次Delta log的合并,合并之後同時檢查超出安全期的log檔案,如果超出,則刪除。預設Delta log的安全期為30天。

有沒有自動觸發Optimize或Vacuum的機制?

Delta僅僅是一個庫,而非運行時,因此尚沒有自動化的機制,但可以設定定時任務定期來觸發Optimize或Vacuum的機制。