寫入

本頁面列出 Bigtable 可以支援哪些類型的寫入要求,並說明相關的適用情況和不適用的情況。如要瞭解如何在寫入時匯總儲存格中的資料,請參閱「在寫入時匯總值」。

Bigtable Data API 和用戶端程式庫可讓您透過程式輔助的方式將資料寫入資料表。Bigtable 會為每次寫入作業回傳回應或確認。

每個用戶端程式庫都可以傳送下列類型的寫入要求:

  • 簡易寫入
  • 增量與附加
  • 條件式寫入
  • 批次寫入

Bigtable 用戶端程式庫內建了智慧重試功能,適用於簡易和批次寫入作業,這表示程式庫可以平穩順暢地因應暫時無法寫入的情形。例如,如果您的應用程式嘗試寫入資料並遇到服務臨時中斷或網路問題,則會自動重試,直到已提交寫入要求或已達到要求期限為止。這種彈性適用於採用單叢集轉送或多叢集轉送的單叢集和複製執行個體。

如要進行批次和串流寫入作業,可以使用 Bigtable Beam 連接器。詳情請參閱「批次寫入」。

如要瞭解寫入要求適用的限制,請參閱「配額與限制」。

如需本頁面所述寫入要求的 Cloud Bigtable 用戶端程式庫範例,請參閱「寫入範例」。

寫入類型和使用時機

所有寫入要求都包含下列基本元素:

  • 要寫入的資料表名稱。
  • 應用程式設定檔 ID,指示 Bigtable 如何轉送流量。
  • 一或多個變異。變異由下列元素組成:
    • 資料欄系列名稱
    • 資料欄限定詞
    • 時間戳記
    • 您要寫入資料表的值

變異的時間戳記預設為目前的日期和時間,以自 Unix 紀元 (世界標準時間 1970 年 1 月 1 日 00:00:00) 起經過的時間表示。

傳送至 Bigtable 的時間戳記必須是微秒值,精確的位數只到毫秒。精確度達微秒的時間戳記 (例如 3023483279876543) 會遭到拒絕。在本範例中,可接受的時間戳記值為 3023483279876000

除非您加以覆寫,否則單一寫入要求中的所有變異都具有相同的時間戳記。您可以將寫入要求中所有變異的時間戳記設定為彼此相同或彼此不同。

簡易寫入

您可以使用 MutateRow 要求將單一資料列寫入 Bigtable,該要求含有資料表名稱、應使用的應用程式設定檔 ID、資料列索引鍵,以及該資料列最多 10 萬個變異。單一資料列寫入是不可分割的作業。當您對單一資料列進行多次異動時,請使用此類型的寫入作業。

如需示範如何傳送簡易寫入要求的程式碼範例,請參閱「執行簡易寫入作業」。

不應使用簡易寫入的情況

對下列應用實例來說,簡易寫入並不是寫入資料的最佳方式:

  • 您正在寫入一批具有連續資料列索引鍵的資料。在這種情況下,您應該使用批次寫入,而不是連續的簡單寫入,因為可以在單一後端呼叫中套用連續批次作業。

  • 您需要高總處理量 (每秒資料列數或每秒位元組數),並且不需要低延遲。在這種情況下,批次寫入作業的速度會更快。

分批更新

Bigtable 可讓您建立資料類型為「匯總」的儲存格。如果您想變更現有表格儲存格中的值,並在寫入資料時匯總儲存格值,則匯總儲存格是最佳選擇。可用的匯總類型如下:

  • 加總:遞增計數器或保留累計加總。
  • 最小值:將整數傳送至儲存格,Bigtable 會保留兩個值中較小的值。
  • 最大值:將整數傳送至儲存格,Bigtable 會保留兩個值中較大的值。
  • HyperLogLog (HLL):傳送新增至儲存格的所有值,並將該值新增至機率集。

如要更新匯總儲存格,請傳送 MutateRow 要求,並將變動類型設為 AddToCellMergeToCell 或其中一種刪除變動類型。

附加

如要將資料附加到現有值,可以使用 ReadModifyWriteRow 要求。此要求內含資料表名稱、應使用的應用程式設定檔 ID、資料列索引鍵,以及寫入資料時要使用的一組規則。每項規則都包括資料欄系列名稱、資料欄限定詞,以及附加值或增量。

系統會依序套用規則。舉例來說,如果您的要求包含將資料欄的值 (內含 some) 附加字串 thing 的要求,而同一個要求中的後續規則會將同一資料欄的值附加 body,則該值會在不可分割的單一寫入作業中修改兩次,最後的值為 somethingbody。後面的規則不會覆寫先前的規則。

您也可以使用 ReadModifyWriteRow 呼叫遞增整數,但建議改用匯總儲存格和 AddToCellMergeToCell。只有當值編碼成 64 位元大端序的帶正負號整數時,才能使用 ReadModifyWrite 遞增值。Bigtable 對空值或不存在的值的增量,採用和值為零一樣的處理方式。

ReadModifyWriteRow 要求是不可分割的。如果因任何原因失敗,不會重試要求。

不適用的情況 ReadModifyWriteRow

在下列情況下,請勿傳送 ReadModifyWriteRow 要求:

  • 如要處理您的用途,請傳送含有 AddToCell 突變的 MutateRow 要求。詳情請參閱「在寫入時匯總值」。

  • 您正在使用具有多叢集轉送作業的應用程式設定檔。

  • 您正在使用多個單一叢集應用程式設定檔,且傳送的寫入要求可能與寫入執行個體其他叢集裡同一資料列和資料欄的資料相衝突。單一叢集轉送作業會將寫入要求傳送到單一叢集,然後予以複製。

  • 您必須使用用戶端程式庫提供的智慧重試功能。無法再次嘗試 ReadModifyWriteRow 要求。

  • 您正在寫入大量資料,需要快速完成寫入作業。讀取然後修改資料列的要求比簡易寫入要求慢,因此這種類型的寫入通常不是大規模作業的最佳方法。

    舉例來說,如果您想計算數百萬的數字,如網頁瀏覽量,就應使用 AddToCell MutateRow 突變,在寫入時更新計數。

條件式寫入

如要針對特定條件檢查資料列,然後根據結果將資料寫入該資料列,請提交 CheckAndMutateRow 要求。這類要求內含資料列索引鍵和資料列篩選器。資料列篩選器是一組用來檢查現有資料值的規則。只有在符合篩選器檢查的特定條件時,才會將變異提交到資料列的特定資料欄。檢查後寫入的這個程序是以單一不可分割的動作完成。

篩選要求必須包含下列一或兩種變異類型:

  • 真變異,如果篩選傳回值時套用的變異。
  • 偽變異,如果篩選未產生任何結果時套用的變異。

您在單一寫入要求中最多可以提供 10 萬個變異 (真或偽),且至少必須傳送一個。Bigtable 會在所有變異完成時傳送回應。

如需示範如何傳送條件式寫入的程式碼範例,請參閱「條件式寫入值」。

不應使用條件式寫入的情況

您不能對下列應用實例使用條件式寫入:

  • 您正在使用具有多叢集轉送作業的應用程式設定檔。

  • 您正在使用多個單一叢集應用程式設定檔,且傳送的寫入要求可能與寫入執行個體其他叢集裡同一資料列和資料欄的資料相衝突。單一叢集轉送作業會將寫入要求傳送到單一叢集,然後予以複製。

  • 您正在寫入大量資料,需要快速完成寫入作業。與 ReadModifyWriteRow 類似,條件式寫入要求也需要先讀取資料列,才能修改資料列,因此 CheckAndModifyRow 要求比簡單的寫入要求慢。因此這種類型的寫入通常不是大規模作業的最佳方法。

批次寫入

您可以使用 MutateRows 要求,在一次呼叫中寫入多個資料列。MutateRows 要求含有最多 10 萬個項目的組合,每個項目都會以不可分割的方式套用。每個項目由一個資料列索引鍵和至少一個套用於資料列的變異組成。一項批次寫入要求的所有項目最多可包含 10 萬個變異。舉例來說,批次寫入可能包含下列任一排列組合:

  • 10 萬個項目,每個項目有 1 個變異。
  • 1 個項目,其中有 10 萬個變異。
  • 1,000 個項目,每個項目有 100 個變異

MutateRows 要求中的每個項目都是不可分割的,但整個要求不是。如有必要,Bigtable 會重試批次中所有未成功的項目,直到所有寫入作業都成功,或達到要求截止時間為止。然後傳回回應,識別批次中的每個寫入作業,以及寫入作業是否成功。

如需示範如何傳送批次寫入作業的程式碼範例,請參閱「執行批次寫入作業」。

不應使用批次寫入的情況

  • 您要將大量資料寫入彼此不相近的資料列。Bigtable 依資料列索引鍵按字典順序儲存資料 (相當於字母順序的二進位排序)。因此,當要求中的資料列索引鍵彼此不相似時,Bigtable 會依序處理,而非平行處理。總處理量會很高,但延遲時間也會很長。為避免這種高度延遲狀況,在資料列索引鍵相似時使用 MutateRows,Bigtable 將寫入彼此相近的資料列。針對彼此不相近的資料列,請使用 MutateRow 或簡易寫入。

  • 您要求對相同資料列執行多個變異。在這種情況下,如果您在單一簡易寫入要求中執行所有變異,就會達到提升效能。這是因為在簡易寫入中,所有變更都會在單一不可分割的動作中提交,但批次寫入會強制將變異以序列化方式寫入同一資料列,這會造成延遲。

批次寫入流量控制

如果您使用下列其中一種方式傳送批次寫入 (包括刪除) 作業,可以在程式碼中啟用批次寫入流程控制

為 Dataflow 工作啟用批次寫入流量控制後,Bigtable 會自動執行下列操作:

  • 限制流量速率,避免 Bigtable 叢集過度負載
  • 確保叢集處於足夠的負載下,可觸發 Bigtable 自動調度資源 (如已啟用),以便在需要時自動為叢集新增節點

這些動作可防止叢集過載和工作失敗,您也不必預期執行批次寫入作業而手動調整叢集大小。啟用流量控制後,叢集調度作業會在 Dataflow 工作期間進行,而非工作開始前,因此工作完成時間可能會比手動調度叢集時長。

您必須使用針對單叢集轉送設定的應用程式設定檔。您不一定要為目的地叢集啟用 Bigtable 自動調度資源功能,但啟用這項功能後,就能充分運用批次寫入流程控制功能。您可以像使用任何其他工作一樣,使用 Dataflow 自動調度資源功能。

如要進一步瞭解 Bigtable 自動調度資源功能,請參閱「自動調度資源」。如要瞭解應用程式設定檔的轉送政策,請參閱應用程式設定檔總覽

如需程式碼範例,請參閱「啟用批次寫入流程控制項」。

將資料寫入授權檢視表

如要將資料寫入授權檢視區,請使用下列其中一種方式:

  • gcloud CLI
  • Java 適用的 Bigtable 用戶端

其他 Bigtable 用戶端程式庫目前尚未支援授權檢視存取權。

將資料寫入授權 view 時,除了資料表 ID,您還需要提供授權 view ID。

所有對授權檢視區塊的寫入作業,都會直接套用至基礎資料表。

授權檢視定義限制

在授權檢視表中,可寫入資料的列或欄會受到授權檢視表定義的限制。換句話說,您只能寫入符合授權檢視畫面指定條件的資料列和資料欄。

舉例來說,如果授權檢視區是依據資料列索引鍵前置字元 examplepetstore1 定義,您就無法使用 examplepetstore2 的資料列索引鍵寫入資料;資料列索引鍵值開頭必須包含整個字串 examplepetstore1

同樣地,如果授權檢視表是由資料欄限定詞前置字串 order-phone 所定義,您可以使用資料欄限定詞 order-phone123 寫入資料,但無法使用資料欄限定詞 order-tablet

寫入要求也不得參照授權檢視區塊以外的資料,例如在條件式寫入要求中檢查值時。

如果任何要求寫入或參照授權檢視區塊外的資料,系統會傳回 PERMISSION_DENIED 錯誤訊息。

複製

當複製執行個體中的某個叢集收到寫入作業時,該作業會立即複製到執行個體中的其他叢集。

完整性

您傳送至複製執行個體的每個 MutateRows 要求,都會在要求轉送的叢集上,以單一不可分割的動作提交。當寫入作業複製到執行個體中的其他叢集時,這些叢集也會以不可分割的作業形式接收寫入作業。叢集不會接收部分異動;異動作業會針對修改的所有儲存格,以不可分割的形式成功或失敗。

一致性

您寫入的資料可用於讀取所需的時間取決於多種因素,包括執行個體中的叢集數量,以及應用程式設定檔使用的轉送類型。

如果使用單一叢集執行個體,系統可以立即讀取資料;但如果執行個體的叢集不只一個,這表示系統使用複製程序,則 Bigtable 具有最終一致性。您可以透過將要求轉送到同一叢集來實現讀寫一致性。

傳送寫入要求後,您就可以建立及使用一致性權杖,並在 StandardReadRemoteWrites 模式下呼叫 CheckConsistency。憑證會檢查複製的一致性。一般而言,您必須在傳送批次寫入要求後或特定時間間隔 (例如一小時) 後建立一致性憑證。然後,您可以將憑證移交給另一個程序使用,例如提出讀取要求的模組,這個模組使用憑證進行檢查,以確保在嘗試讀取之前已複製所有資料。

如果您在建立憑證後要使用憑證,則在第一次使用時可能需要幾分鐘時間來檢查是否一致。此延遲是因為每個叢集都會檢查其他叢集,以確保不會再有資料傳來。初次使用後,或第一次使用憑證等候幾分鐘後,憑證會在每次使用時立即生效。

解決衝突

Bigtable 資料表中的每個儲存格值,都會以四元組 (資料列鍵、資料欄系列、資料欄限定詞、時間戳記) 進行唯一識別。如要進一步瞭解這些 ID,請參閱 Bigtable 儲存模型。如果兩個寫入作業的四元組完全相同,但傳送至兩個不同的叢集,Bigtable 會根據伺服器端時間,使用內部「最後寫入者勝出」演算法自動解決衝突。Bigtable 的「最後寫入者勝出」實作方式是決定性的,當複寫趕上進度時,所有叢集都會有四元組的相同值。

後續步驟