並發控製
三角洲湖提供了讀取和寫入之間的酸性交易。這意味著:
多個群集的多個作家可以同時修改表分區,並看到表的一致快照視圖,並且這些寫入將有一個串行順序。
即使在作業過程中修改了表格,讀者仍將看到數據映紙開始的表格的一致快照視圖。
樂觀的並發控製
三角洲湖使用樂觀的並發控製在寫作之間提供交易保證。在這種機製下,寫道分為三個階段:
讀:reads(如果需要)該表的最新可用版本,以確定需要修改哪些文件(即重寫)。
寫:通過編寫新數據文件來劃分所有更改。
驗證和提交:在進行更改之前,請檢查提議的更改是否與自從讀取的快照以來可能同時進行的任何其他更改的衝突。如果沒有衝突,所有階段的更改均以新版本的快照進行,並且寫操作成功。但是,如果存在衝突,寫操作將失敗,並同時修改異常,而不是像parquet表上的寫操作那樣損壞表。
表的隔離水平定義了必須從並發操作進行的修改中隔離交易的程度。有關DELTA LAKE在Databricks支持的隔離水平的信息,請參見隔離水平。
寫衝突
下表描述了哪種寫操作可能在每個方麵發生衝突隔離水平。
插入 |
更新,刪除,合並到 |
優化 |
|
---|---|---|---|
插入 |
不能衝突 |
||
更新,刪除,合並到 |
可以在可序列化中發生衝突,如果不先閱讀在桌子上寫入桌子,則不能在寫作中發生衝突 |
可以在可序列化和可序列化的情況下發生衝突 |
|
優化 |
不能衝突 |
可以在可序列化和可序列化的情況下發生衝突 |
可以在可序列化和可序列化的情況下發生衝突 |
避免使用分區和不連接命令條件發生衝突
在所有情況下,標有“可以衝突”的所有情況,這兩個操作是否會衝突取決於它們是否在同一組文件上運行。您可以通過與操作條件相同的列對表進行分區列來使兩組文件分開。例如,這兩個命令更新桌子在哪裏日期>'2010-01-01'...
和刪除桌子在哪裏日期<'2010-01-01'
如果表不按日期劃分,則會發生衝突,因為兩者都可以嚐試修改相同的文件集。通過分區日期
將避免衝突。因此,根據命令上常用的條件對表進行分區可以大大減少衝突。但是,通過大量的子目錄,通過具有較高基數的列對表進行劃分,可能會導致其他性能問題。
衝突例外
當交易衝突發生時,您將觀察到以下例外之一:
concurrentAppendException
當並發操作在同一分區(或未分十個表中的任何位置)中添加文件時,就會發生這種例外。文件添加可能是由插入
,,,,刪除
,,,,更新
, 或者合並
操作。
使用默認值隔離水平的寫入
,添加的文件瞎的插入
操作(即,即使在不讀取任何數據的情況下盲目地附加數據的操作)也不會與任何操作發生衝突,即使它們觸摸了相同的分區(或在未分區的表中的任何地方)。如果將隔離級設置為可序列化
,然後盲目的附加量可能發生衝突。
在並發期間通常會拋出此例外刪除
,,,,更新
, 或者合並
操作。盡管並發操作可能正在物理更新不同的分區目錄,但其中一個可能會讀取另一個分區,該分區同時更新,從而導致衝突。您可以通過在操作條件下顯式分離來避免這種情況。考慮以下示例。
//目標“ Deltotable”按日期和國家/地區分配可達。作為((“ T”)。合並((資源。作為((“ S”),“ s.user_id = t.user_id and s.date = t.date and s.country = t.country”)。匹配時()。全部更新()。當不匹配時()。插入()。執行()
假設您同時為不同的日期或國家 /地區同時運行上述代碼。由於每個工作都在目標三角洲表上進行獨立分區,因此您不會期望任何衝突。但是,該條件不夠明確,可以掃描整個表格,並可能與更新任何其他分區的並發操作發生衝突。相反,您可以重寫您的語句以將特定的日期和國家添加到合並條件中,如下示例所示。
//目標“ Deltotable”按日期和國家/地區分配可達。作為((“ T”)。合並((資源。作為((“ S”),”+<日期>+“'和t.country ='”+<國家>+“'”)。匹配時()。全部更新()。當不匹配時()。插入()。執行()
現在,此操作可以安全地在不同的日期和國家 /地區同時運行。
contrentDeleDeledeadException
當並發操作刪除您的操作讀取的文件時,會發生此例外。常見原因是刪除
,,,,更新
, 或者合並
重寫文件的操作。
並發骨骼骨骼感受
當並發操作刪除您的操作還刪除的文件時,會發生此例外。這可能是由兩個並發壓實操作重寫相同文件引起的。
metadatachangedException
當並發交易更新Delta表的元數據時,會發生此例外。常見原因是改變桌子
操作或寫入更新表格架構的三角洲表。
contrentTransActionException
如果使用相同檢查點位置的流媒體查詢多次同時啟動,並嚐試同時寫入三角洲表。您絕對不要使用兩個流媒體查詢使用相同的檢查點位置並同時運行。
協議ChangedException
在以下情況下可能發生此例外:
當您的三角洲表升級到新版本時。為了使未來的操作取得成功,您可能需要升級三角洲湖版。
當多個作家同時創建或替換表時。
當多個作家同時寫入空道時。
看表協議版本更多細節。