本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
合併兩個碎片
碎片合併操作需要兩個指定的碎片,並且會將它們合併為單一碎片。合併之後,該單一子碎片會收到兩個父碎片涵蓋的所有雜湊索引鍵值的資料。
碎片相鄰
若要合併兩個碎片,碎片必須相鄰。如果兩個碎片的雜湊索引鍵範圍的聯結形成連續的一組 (無間隙),則將其視為相鄰。舉例來說,假設您有兩個碎片,其中一個的雜湊鍵範圍為 276...381,另一個的雜湊鍵範圍為 382...454。您可以將這兩個碎片合併為一個碎片,就會得到範圍為 276...454 的雜湊鍵。
再舉另一個例子,假設您有兩個碎片,其中一個的雜湊鍵範圍為 276...381,另一個的雜湊鍵範圍為 455...560。您可以合併這兩個碎片,因為這樣在這兩個碎片之間就會有一個或多個碎片,範圍涵蓋 382...454。
串流中所有OPEN
碎片的集合 (以群組形式) 永遠跨越整個雜湊索引鍵值範圍。MD5如需碎片狀態—例如 CLOSED
—的詳細資訊,請參閱 在重新碎片之後考慮資料路由、資料持續性和碎片狀態。
若要識別用於合併之候選項目的碎片,您應該篩選掉處於 CLOSED
狀態的所有碎片。狀態為 OPEN
(即非 CLOSED
) 的碎片,其結束序號為 null
。您可以使用下列方式來測試碎片的結束序號:
if( null == shard.getSequenceNumberRange().getEndingSequenceNumber() ) { // Shard is OPEN, so it is a possible candidate to be merged. }
篩選掉排序關閉碎片後,將剩餘的碎片依每個碎片支援的最高雜湊索引鍵值排序。您可以使用下列方式來擷取此值:
shard.getHashKeyRange().getEndingHashKey();
如果在這個經篩選、排序之清單中的兩個碎片為相鄰,則可以將它們合併。
合併操作的程式碼
以下程式碼會合併兩個碎片。此程式碼假設 myStreamName
擁有串流的名稱,以及物件變數 shard1
和 shard2
則擁有要合併的兩個相鄰碎片。
對於合併操作,從將新的 mergeShardsRequest
物件執行個體化開始。使用 setStreamName
方法指定串流名稱。然後,使用 setShardToMerge
和 setAdjacentShardToMerge
方法指定要合併的兩個碎片。最後,呼叫 Kinesis Data Streams 用戶端上的 mergeShards
方法,以執行操作。
MergeShardsRequest mergeShardsRequest = new MergeShardsRequest(); mergeShardsRequest.setStreamName(myStreamName); mergeShardsRequest.setShardToMerge(shard1.getShardId()); mergeShardsRequest.setAdjacentShardToMerge(shard2.getShardId()); client.mergeShards(mergeShardsRequest);
等待串流再次變為作用中中顯示此程序後的第一個步驟。