合併兩個碎片 - Amazon Kinesis Data Streams

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

合併兩個碎片

碎片合併操作需要兩個指定的碎片,並且會將它們合併為單一碎片。合併之後,該單一子碎片會收到兩個父碎片涵蓋的所有雜湊索引鍵值的資料。

碎片相鄰

若要合併兩個碎片,碎片必須相鄰。如果兩個碎片的雜湊索引鍵範圍的聯結形成連續的一組 (無間隙),則將其視為相鄰。舉例來說,假設您有兩個碎片,其中一個的雜湊鍵範圍為 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 擁有串流的名稱,以及物件變數 shard1shard2 則擁有要合併的兩個相鄰碎片。

對於合併操作,從將新的 mergeShardsRequest 物件執行個體化開始。使用 setStreamName 方法指定串流名稱。然後,使用 setShardToMergesetAdjacentShardToMerge 方法指定要合併的兩個碎片。最後,呼叫 Kinesis Data Streams 用戶端上的 mergeShards 方法,以執行操作。

MergeShardsRequest mergeShardsRequest = new MergeShardsRequest(); mergeShardsRequest.setStreamName(myStreamName); mergeShardsRequest.setShardToMerge(shard1.getShardId()); mergeShardsRequest.setAdjacentShardToMerge(shard2.getShardId()); client.mergeShards(mergeShardsRequest);

等待串流再次變為作用中中顯示此程序後的第一個步驟。