處理資料交付失敗 - Amazon Data Firehose

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

處理資料交付失敗

每個 Amazon Data Firehose 目的地都有自己的資料交付失敗處理。

當您設定 Firehose 串流時,對於許多目的地 OpenSearch,例如 Splunk 和HTTP端點,您也可以設定 S3 儲存貯體,其中可以備份無法交付的資料。如需 Firehose 如何在交付失敗時備份資料的詳細資訊,請參閱此頁面的相關目的地區段。如需如何授予對 S3 儲存貯體的存取權,以備份無法交付的資料,請參閱授予 Firehose 對 Amazon S3 目的地的存取權。當 Firehose (a) 無法將資料交付至串流目的地,且 (b) 無法將資料寫入備份 S3 儲存貯體以取得失敗交付時,它會有效地暫停串流交付,直到資料可以交付至目的地或寫入備份 S3 位置為止。

Amazon S3

資料交付至 S3 儲存貯體時,可能會因各種問題導致失敗。例如,儲存貯體可能不再存在,Amazon Data Firehose 擔任IAM的角色可能無法存取儲存貯體、網路失敗或類似事件。在這些情況下,Amazon Data Firehose 會持續重試長達 24 小時,直到交付成功為止。Amazon Data Firehose 的資料儲存時間上限為 24 小時。如果超過 24 小時仍無法交付,資料將會遺失。

資料交付至 S3 儲存貯體可能會失敗,原因如下:

  • 儲存貯體不再存在。

  • Amazon Data Firehose 擔任IAM的角色無法存取 儲存貯體。

  • 網路問題。

  • S3 錯誤,例如 HTTP 500 秒或其他API失敗。

在這些情況下,Amazon Data Firehose 會重試交付:

  • DirectPut 來源:重試會持續最多 24 小時。

  • Kinesis Data Streams 或 Amazon MSK來源:重試會無限期繼續,最高可達串流上定義的保留政策。

只有在 Lambda 處理或parquet 轉換失敗時,Amazon Data Firehose 才會將失敗的記錄交付至 S3 錯誤儲存貯體。其他失敗案例將導致 S3 持續重試,直到達到保留期為止。當 Firehose 成功將記錄交付至 S3 時,它會建立 S3 物件檔案,如果部分記錄失敗,會自動重試交付,並使用成功處理的記錄更新相同的 S3 物件檔案。

Amazon Redshift

對於 Amazon Redshift 目的地,您可以在建立 Firehose 串流時指定重試持續時間 (0–7200 秒)。

將資料交付到您的 Amazon Redshift 佈建的叢集或 Amazon Redshift Serverless 工作群組可能會因多種原因而失敗。例如,您的 Firehose 串流的叢集組態可能不正確、叢集或工作群組正在進行維護,或是網路故障。在這些情況下,Amazon Data Firehose 會在指定的持續時間內重試,並略過該特定批次的 Amazon S3 物件。略過物件的資訊會傳送至 S3 儲存貯體,成為 errors/資料夾中的資訊清單檔案,以供手動回填使用。如需有關如何使用資訊清單檔案手動COPY資料的資訊,請參閱使用資訊清單來指定資料檔案

Amazon OpenSearch Service 和 OpenSearch Serverless

對於 OpenSearch 服務和無 OpenSearch 伺服器目的地,您可以在 Firehose 串流建立期間指定重試持續時間 (0–7200 秒)。

資料交付至您的 OpenSearch Service 叢集或 OpenSearch Serverless 集合可能會失敗,原因有幾個。例如,您的 Firehose 串流、 OpenSearch 服務 OpenSearch 叢集或維護中的無 OpenSearch 伺服器集合、網路故障或類似事件,可能有不正確的服務叢集或無 OpenSearch 伺服器集合組態。在這些情況下,Amazon Data Firehose 會在指定的持續時間內重試,然後略過該特定索引請求。略過的文件會傳輸至 S3 儲存貯體的 AmazonOpenSearchService_failed/資料夾,以供手動回填使用。

對於 OpenSearch Service,每個文件的JSON格式如下:

{ "attemptsMade": "(number of index requests attempted)", "arrivalTimestamp": "(the time when the document was received by Firehose)", "errorCode": "(http error code returned by OpenSearch Service)", "errorMessage": "(error message returned by OpenSearch Service)", "attemptEndingTimestamp": "(the time when Firehose stopped attempting index request)", "esDocumentId": "(intended OpenSearch Service document ID)", "esIndexName": "(intended OpenSearch Service index name)", "esTypeName": "(intended OpenSearch Service type name)", "rawData": "(base64-encoded document data)" }

對於 OpenSearch Serverless,每個文件的JSON格式如下:

{ "attemptsMade": "(number of index requests attempted)", "arrivalTimestamp": "(the time when the document was received by Firehose)", "errorCode": "(http error code returned by OpenSearch Serverless)", "errorMessage": "(error message returned by OpenSearch Serverless)", "attemptEndingTimestamp": "(the time when Firehose stopped attempting index request)", "osDocumentId": "(intended OpenSearch Serverless document ID)", "osIndexName": "(intended OpenSearch Serverless index name)", "rawData": "(base64-encoded document data)" }

Splunk

當 Amazon Data Firehose 傳送資料至 Splunk 時,會等待 Splunk 的確認。如果發生錯誤,或確認未在確認逾時期間內送達,Amazon Data Firehose 會啟動重試持續時間計數器。直到重試持續時間過期之前,該服務都不會中斷重試作業。之後,Amazon Data Firehose 會將其視為資料交付失敗,並將資料備份到您的 Amazon S3 儲存貯體。

每當 Amazon Data Firehose 傳送資料至 Splunk 時,無論是初次嘗試還是重試,都會重新啟動確認逾時計數器。並等待 Splunk 傳回確認訊息。即使重試持續時間過期,Amazon Data Firehose 仍會等待確認,直到收到確認或達到確認逾時為止。如果確認逾時,Amazon Data Firehose 會檢查以確定重試計數器中是否剩餘時間。如果還有時間,將再次重試並重複執行邏輯,直到收到確認或判斷已無重試時間為止。

未收到確認訊息,並非唯一的資料交付錯誤類型。如需其他資料交付錯誤類型的相關資訊,請參閱 Splunk 資料交付錯誤。如果您的重試期間大於 0,則任何資料交付錯誤都會觸發重試邏輯。

錯誤記錄例示如下。

{ "attemptsMade": 0, "arrivalTimestamp": 1506035354675, "errorCode": "Splunk.AckTimeout", "errorMessage": "Did not receive an acknowledgement from HEC before the HEC acknowledgement timeout expired. Despite the acknowledgement timeout, it's possible the data was indexed successfully in Splunk. Amazon Data Firehose backs up in Amazon S3 data for which the acknowledgement timeout expired.", "attemptEndingTimestamp": 13626284715507, "rawData": "MiAyNTE2MjAyNzIyMDkgZW5pLTA1ZjMyMmQ1IDIxOC45Mi4xODguMjE0IDE3Mi4xNi4xLjE2NyAyNTIzMyAxNDMzIDYgMSA0MCAxNTA2MDM0NzM0IDE1MDYwMzQ3OTQgUkVKRUNUIE9LCg==", "EventId": "49577193928114147339600778471082492393164139877200035842.0" }

HTTP 端點目的地

當 Amazon Data Firehose 將資料傳送至HTTP端點目的地時,它會等待來自此目的地的回應。如果發生錯誤,或回應未在回應逾時期間內到達,Amazon Data Firehose 會啟動重試持續時間計數器。直到重試持續時間過期之前,該服務都不會中斷重試作業。之後,Amazon Data Firehose 會將其視為資料交付失敗,並將資料備份到您的 Amazon S3 儲存貯體。

每次 Amazon Data Firehose 傳送資料到HTTP端點目的地時,無論是初始嘗試還是重試,都會重新啟動回應逾時計數器。然後,它會等待回應從HTTP端點目的地到達。即使重試持續時間過期,Amazon Data Firehose 仍會等待回應,直到收到回應或達到回應逾時為止。如果回應逾時,Amazon Data Firehose 會檢查以確定重試計數器中是否剩餘時間。如果還有時間,將再次重試並重複執行邏輯,直到收到回應或判斷已無重試時間為止。

未收到回應,並非唯一的資料交付錯誤類型。如需其他類型資料交付錯誤的資訊,請參閱HTTP端點資料交付錯誤

錯誤記錄例示如下。

{ "attemptsMade":5, "arrivalTimestamp":1594265943615, "errorCode":"HttpEndpoint.DestinationException", "errorMessage":"Received the following response from the endpoint destination. {"requestId": "109777ac-8f9b-4082-8e8d-b4f12b5fc17b", "timestamp": 1594266081268, "errorMessage": "Unauthorized"}", "attemptEndingTimestamp":1594266081318, "rawData":"c2FtcGxlIHJhdyBkYXRh", "subsequenceNumber":0, "dataId":"49607357361271740811418664280693044274821622880012337186.0" }

Snowflake

對於 Snowflake 目的地,當您建立 Firehose 串流時,您可以指定選用的重試持續時間 (0-7200 秒)。重試持續時間的預設值為 60 秒。

資料交付至 Snowflake 資料表可能會失敗,原因包括 Snowflake 目的地組態不正確、Snowflake 中斷、網路故障等。重試政策不適用於無法重試的錯誤。例如,如果 Snowflake 拒絕您的JSON承載,因為資料表中缺少額外的資料欄,Firehose 不會嘗試再次交付。相反地,它會建立因 S3 錯誤儲存貯體JSON承載問題而導致的所有插入失敗的備份。

同樣地,如果由於不正確的角色、資料表或資料庫而導致交付失敗,Firehose 不會重試並將資料寫入您的 S3 儲存貯體。重試持續時間僅適用於由於 Snowflake 服務問題、暫時性網路故障等造成的失敗。在這些情況下,Firehose 會在指定的時間內重試,然後再將其交付至 S3。失敗的記錄會在 snowflake-failed/ 資料夾中交付,您可以用於手動回填。

以下是您交付給 S3 JSON 的每個記錄的範例。

{ "attemptsMade": 3, "arrivalTimestamp": 1594265943615, "errorCode": "Snowflake.InvalidColumns", "errorMessage": "Snowpipe Streaming does not support columns of type AUTOINCREMENT, IDENTITY, GEO, or columns with a default value or collation", "attemptEndingTimestamp": 1712937865543, "rawData": "c2FtcGxlIHJhdyBkYXRh" }