Cloud Bigtable 寫入

總覽

本頁面列出 Cloud Bigtable 可以支援哪些類型的寫入要求,並說明相關的適用情況和不適用的情況。

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

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

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

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

您可以使用 Cloud Bigtable 適用的 Cloud Dataflow 連接器進行批次和串流寫入作業。

寫入類型和使用時機

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

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

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

簡易寫入

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

不應使用簡易寫入的情況

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

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

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

增量與附加

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

系統會依序套用規則。舉例來說,如果您的要求包含將資料欄的值遞增 2 的要求,而同一個要求中的後續規則會將同一資料欄的值遞增 1,則該資料欄的值會在這個不可分割的單一寫入作業中遞增 3。後面的規則不會覆寫先前的規則。

只有當值編碼成 64 位元大端序的帶正負號整數時,才能遞增值。Cloud Bigtable 對空值或不存在的值的增量,採用和值為零一樣的處理方式。ReadModifyWriteRow 要求是不可分割的。如果因任何原因失敗,不會重試要求。

不應使用增量與附加的情況

在下列情況下,您不應傳送 ReadModifyWriteRow 要求:

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

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

  • 您必須使用用戶端程式庫提供的智慧重試功能。增量與附加不可重試。

  • 您正在寫入大量資料,需要快速完成寫入作業。讀取然後修改資料列的要求比簡易寫入要求慢,因此這種類型的寫入通常不是大規模作業的最佳方法。舉例來說,如果您想計算數百萬的數字,如網頁瀏覽量,就應考慮將每次檢視記錄為簡易寫入,而不是遞增值。接著,您可以使用 Cloud Dataflow 工作來匯總資料。

條件式寫入

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

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

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

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

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

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

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

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

批次寫入

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

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

MutateRows 要求中的每個項目都是不可分割的,但整個要求不是。當所有項目都已寫入時,Cloud Bigtable 會傳送回應。

不應使用批次寫入的情況

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

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

使用複製程序時的一致性

您寫入的資料可用於讀取所需的時間取決於多種因素,包括執行個體中的叢集數量,以及應用程式設定檔使用的轉送類型。如果使用單一叢集執行個體,系統可以立即讀取資料;但如果執行個體的叢集不只一個,這表示系統使用複製程序,則 Cloud Bigtable 具有最終一致性。您可以透過將要求轉送到同一叢集來實現讀寫一致性。

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

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

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Bigtable 說明文件