2016-07-23 64 views
6

AWS KCL庫中的檢查點和修剪如何相關?Amazon KCL檢查點和修剪Horizo​​n

文檔頁面處理啓動,關機和節流說:

默認情況下,KCL開始從 流,其是最近添加的記錄尖閱讀記錄。在此 配置中,如果數據生成應用程序在任何接收記錄處理器正在運行之前向 流添加記錄,則記錄處理器在啓動後不會讀取記錄 。

要改變記錄處理器的行爲,以便它總是 從流的開始讀取數據,設置以下值 在屬性文件中爲你的亞馬遜的Kinesis流的應用:

initialPositionInStream = TRIM_HORIZON

文檔頁面在Java中開發亞馬遜的Kinesis客戶端庫消費者說:

流需要記錄處理器跟蹤已在碎片中處理過的記錄 。 KCL通過將檢查指針 (IRecordProcessorCheckpointer)傳遞給processRecords來爲您處理 此跟蹤。記錄處理器 調用此接口上的檢查點方法,以通知KCL在處理碎片中的記錄時已經取得的進展。在工作人員失敗的 事件中,KCL使用此信息重新啓動 處理最後一次已知處理記錄中的分片。

第一頁似乎說,KCL恢復在流的末端,在最後一個已知處理的記錄的第二頁(這是在checkpointer標記爲通過使用RecordProcessor處理)。就我而言,我絕對需要在最後一次已知處理記錄中重新啓動。我是否需要將initialPositionInStream設置爲TRIM_HORIZON?

回答

7

隨着kinesis流你有兩個選擇,你可以閱讀最新的記錄,或從最早的(TRIM_HORIZON)開始。

但是,一旦你開始你的應用程序,它只是從它停止使用它的檢查點的位置讀取。 您可以在dynamodb中看到這些檢查點(通常,表名稱是應用程序名稱)。 所以,如果你重新啓動你的應用程序,它通常會從停止的地方繼續。

答案是否定的,您不需要將initialPositionInStream設置爲TRIM_HORIZON。

+2

謝謝,所以在現實中,initialPositiionInStream適用於確定如果沒有chekpoint可用時開始的值? – Edmondo1984

+2

是的,當您的KCL沒有保存檢查點時使用它。 –

1

當你正在閱讀從室壁運動流事件,您有4個選項:

TRIM_HORIZON - 仍處於流碎片,它們會自動修剪(默認前1天,最早的事件,但可以延長到7天)。如果您想啓動一個新的應用程序來處理流中可用的所有記錄,那麼您將使用此選項,但是需要一段時間才能趕上並開始實時處理事件。

LATEST - 流中的最新事件,並忽略所有過去的事件。如果您立即開始一個新的應用程序,並且要立即處理這個新應用程序,那麼您將使用此選項。

AT/AFTER_SEQUENCE_NUMBER - 序列號通常是您在處理事件時保留的檢查點。這些檢查點允許您可靠地處理事件,即使在讀取器發生故障或想要更新其版本並繼續處理所有事件但不會丟失任何事件的情況下。 AT/AFTER之間的區別取決於檢查點的時間,在成功處理事件之前或之後。

請注意,這是唯一的分片專用選項,因爲所有其他選項都是全局的流。當您使用KCL時,它正在爲該應用程序管理DynamoDB表,併爲每個分片記錄該分片的「當前」序列號。

AT_TIMESTAMP - 事件放入流中的估計時間。如果您想根據時間戳查找要處理的特定事件,則將使用此選項。例如,當您知道在特定時間您的服務中存在真實生活事件時,即使您沒有序列號,也可以開發處理這些特定事件的應用程序。

看到這裏的Kinesis文檔中更多的細節:https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html

+0

我有點困惑這是否適用於本機api訪問而不是Kcl用法? – Edmondo1984

+0

KCL是一個正在實現API的庫,它不會比直接通過API獲得對流的更多控制。 KCL添加了應用程序管理端以及DynamoDB中的檢查點功能,該功能使用序列號。 – Guy

0

你應該使用 「TRIM_HORIZON」。它只會影響第一個時間,您的應用程序開始從流中讀取記錄。之後,它將從最後的已知位置繼續。