列層級並行

列層級並行處理透過偵測列層級的變更,並自動解決並行寫入更新或刪除同一資料檔中不同列時產生的衝突,從而減少並行寫入操作間的衝突。

列層級並發要求

當符合以下所有需求時,列層級並行會自動啟用:

  • 使用 Databricks Runtime 14.3 LTS 及以上版本。
  • 來源資料表沒有使用分割區。
  • 來源表啟用了刪除向量。 請參見 Databricks 中的刪除向量。

分區資料表不支援資料列層級的並行存取。 然而,啟用刪除向量後,分割資料表仍能避免與寫入操作之間的 OPTIMIZE 衝突。 請參閱 數據列層級並行的限制。

對於 14.3 LTS 之前的 Databricks 執行時版本,請參見 列級並行遺留行為。

具有行層級並行的衝突矩陣

對於具有列層級並行的來源資料表,下表展示了每對並行寫入操作在各隔離層的行為。

同時進行的元資料變更是表格中所有結果的例外。 中繼資料的變更,例如 ALTER TABLE 指令或寫入以更新資料表結構,可能導致所有並行寫入操作失敗,包括 INSERT。 參見 元資料變更衝突。

運算對 WriteSerializable(預設) 可序列化
INSERT (1) + INSERT 不可衝突 不可衝突
INSERT + UPDATE,刪除, MERGE INTO 不可衝突 修改相同數據列時可能會發生衝突。 UPDATE該 、 DELETE或MERGE操作失敗,而非 INSERT。
INSERT + OPTIMIZE 不可衝突 不可衝突
UPDATE,刪除, MERGE INTO + UPDATE,刪除, MERGE INTO 修改同一列時可能會發生衝突 修改同一列時可能會發生衝突
UPDATE, 刪除, MERGE INTO + OPTIMIZE 在使用ZORDER BY時可能會發生衝突。 否則無法衝突。 在使用ZORDER BY時可能會發生衝突。 否則無法衝突。
OPTIMIZE + OPTIMIZE 在使用ZORDER BY時可能會發生衝突。 否則無法衝突。 在使用ZORDER BY時可能會發生衝突。 否則無法衝突。

(1) 此表中的所有 INSERT 操作描述的附加操作,這些操作不包含讀取同一資料表資料的子查詢。 INSERT 包含從相同資料表讀取資料之子查詢的作業,支援與 MERGE 相同的並行程度。

備註

  • 當一對資料發生衝突時,只有讀取受影響資料的操作會失敗。 INSERT一個在未讀取表格的情況下附加資料的操作不會失敗,因此重試邏輯應該放在並行UPDATE的 、 DELETE或 MERGE。
  • 帶有身份欄位的資料表不支援並行交易。 請參見 身份欄位。
  • REORG 操作的隔離語意與重寫資料檔案時相同 OPTIMIZE 。 當您使用 REORG 來套用升級時,數據表通訊協議會變更,這與所有進行中的作業衝突。

撰寫不需列層級並行的衝突

對於沒有列層級並行的來源資料表,下表展示了每對並行寫入操作在各隔離層的行為。

同時進行的元資料變更是表格中所有結果的例外。 中繼資料的變更,例如 ALTER TABLE 指令或寫入以更新資料表結構,可能導致所有並行寫入操作失敗,包括 INSERT。 參見 元資料變更衝突。

運算對 WriteSerializable(預設) 可序列化
INSERT (1) + INSERT 不可衝突 不可衝突
INSERT + UPDATE,刪除, MERGE INTO 不可衝突 可能會有衝突。 UPDATE該 、 DELETE或MERGE操作失敗,而非 INSERT。 請參見 「使用分割法避免衝突」。
INSERT + OPTIMIZE 不可衝突 不可衝突
UPDATE,刪除, MERGE INTO + UPDATE,刪除, MERGE INTO 可能會有衝突。 請參見 「使用分割法避免衝突」。 可能會有衝突。 請參見 「使用分割法避免衝突」。
UPDATE, 刪除, MERGE INTO + OPTIMIZE 在啟用刪除向量的表格中無法發生衝突,除非使用了 ZORDER BY。 否則可能會發生衝突。 在啟用刪除向量的表格中無法發生衝突,除非使用了 ZORDER BY。 否則可能會發生衝突。
OPTIMIZE + OPTIMIZE 在啟用刪除向量的表格中無法發生衝突,除非使用了 ZORDER BY。 否則可能會發生衝突。 在啟用刪除向量的表格中無法發生衝突,除非使用了 ZORDER BY。 否則可能會發生衝突。

(1) 此表中的所有 INSERT 操作描述的附加操作,這些操作不包含讀取同一資料表資料的子查詢。 INSERT 包含從相同資料表讀取資料之子查詢的作業,支援與 MERGE 相同的並行程度。

備註

  • 當一對資料發生衝突時,只有讀取受影響資料的操作會失敗。 INSERT一個在未讀取表格的情況下附加資料的操作不會失敗,因此重試邏輯應該放在並行UPDATE的 、 DELETE或 MERGE。
  • 帶有身份欄位的資料表不支援並行交易。 請參見 身份欄位。
  • REORG 操作的隔離語意與重寫資料檔案時相同 OPTIMIZE 。 當你使用 REORG 套用升級時,資料表通訊協定會變更,並與所有正在進行中的作業衝突。

資料列層級並行性的限制

對於列級並行有限制。 以下操作的衝突解決遵循寫入衝突的正常並發性。 請參閱 在沒有行級並行情況下的寫入衝突。

限度 說明
複數條件子句 複雜資料型態(結構體、陣列、映射)、非確定性表達式、子查詢及相關子查詢的條件
MERGE 條件需求 在 Databricks Runtime 14.2 中, MERGE 指令必須使用目標資料表上的明確謂詞來過濾與來源資料表相符的資料列
性能的取捨 列層級衝突偵測可以增加總執行時間。 在大量同時交易的情況下,寫入系統會優先考慮降低延遲,而非糾正衝突。

刪除向量的所有限制也都適用。 請參閱限制。

使用分割方式來避免衝突

對於所有在矩陣中標示為「可能衝突」的情況,衝突僅在兩個操作影響同一組檔案時發生。 要使兩組檔案不相交,請依操作條件中使用的相同欄位分割資料表。

範例:

如果資料表沒有依日期分割,指令 UPDATE table WHERE date > '2010-01-01' ... 和 DELETE table WHERE date < '2010-01-01' 會衝突,因為兩者都可能嘗試修改相同的檔案。 通過 date 將表格分割可以避免衝突。

備註

以高基數欄位分割資料表,可能因子目錄數量龐大而產生效能問題。

避免與明確分割區過濾器發生衝突

此例外通常會在並行執行 DELETE、UPDATE 或 MERGE 作業時引發,因為這些作業即使更新的是不同分割區,也可能讀取相同的分割區。 在操作條件中明確說明分離:

// Problem: Condition can scan the entire table
deltaTable.as("t").merge(
    source.as("s"),
    "s.user_id = t.user_id AND s.date = t.date AND s.country = t.country")
  .whenMatched().updateAll()
  .whenNotMatched().insertAll()
  .execute()

// Solution: Add explicit partition filters
deltaTable.as("t").merge(
    source.as("s"),
    "s.user_id = t.user_id AND s.date = t.date AND s.country = t.country AND t.date = '" + date + "' AND t.country = '" + country + "'")
  .whenMatched().updateAll()
  .whenNotMatched().insertAll()
  .execute()

衝突例外狀況

當交易發生衝突時,你會觀察到以下其中一個例外情況:

並發附加例外 (ConcurrentAppendException)

當並行作業將檔案新增至與您的作業讀取相同的分割區 (或未分割資料表中的任何位置) 時,就會發生此例外狀況。 檔案新增可能是由 INSERT、 DELETE、 UPDATE或 MERGE 作業所造成。

在預設的 WriteSerializable 隔離層下,透過 INSERT 未讀取資料而附加資料的操作所新增的檔案不會與任何操作衝突。 若隔離層級為可序列化,任何附加函數可能會衝突。

這很重要

如果多個並行 DELETE、、 UPDATE、 MERGE 操作可能參考某操作附加的值 INSERT ,則在可寫序列化模式下仍可能發生衝突。 失敗的 DELETE, UPDATE或 MERGE 操作是因為它讀取了附加的資料。 為避免此情況:

  • 確保同時進行 DELETE的 、 UPDATE或 MERGE 操作不會讀取附加的資料
  • 最多只能有一個 DELETE、UPDATE或 MERGE 操作可以讀取附加資料。

ConcurrentDeleteReadException

此例外發生在並行操作刪除你已讀取的檔案時。 常見的原因是重寫檔案的 DELETE、UPDATE 或 MERGE 操作。

ConcurrentDeleteDelete例外狀況

此例外發生在同時進行的操作刪除了你的操作也刪除的檔案時。 這可能是由兩個並行壓縮作業重寫相同的檔案所造成。

MetadataChangedException

此例外發生在並行交易更新 Delta Lake 資料表的元資料時。 常見的原因是 ALTER TABLE 更新資料表架構的操作或寫入。

並發交易異常

此例外發生在使用同一檢查點位置的串流查詢同時多次啟動,並嘗試同時寫入 Delta Lake 資料表時。 切勿同時執行兩個具有相同檢查點位置的串流查詢。

協定更改例外 (ProtocolChangedException)

此例外可能發生於:

  • 你的 Delta Lake 資料表已升級到新的協定版本(你可能需要升級 Databricks 執行環境)
  • 多位撰寫者同時建立或替換資料表
  • 多個寫入者同時寫入一個空的檔案路徑

請參閱 Delta Lake 功能相容性和通訊協定。

列層級並行遺留行為

在 Databricks Runtime 13.3 LTS 中,資料列層級並行處理使用舊版行為:

其他資源