Fehlerprotokollierung in Snowpipe Streaming mit High-Performance-Architektur

Die Fehlerprotokollierung für Snowpipe Streaming baut auf dem DML-Fehlerprotokollierungs-Feature von Snowflake auf und bietet eine robuste Möglichkeit, Datenaufnahmefehler zu verwalten und zu beheben. Dieses Feature verhindert den stillschweigenden Datenverlust und erhöht die Sichtbarkeit von fehlerhaften Datenzeilen. Wenn die Fehlerprotokollierung aktiviert ist, werden fehlerlose Daten weiterhin in Ihre Zieltabelle geladen, während Zeilen, deren Verarbeitung fehlschlägt, automatisch zur Überprüfung und Wiederherstellung an eine spezielle Fehlertabelle weitergeleitet werden.

Wichtig

Die in den Fehler-Tabellen gespeicherten Daten entsprechen der ursprünglichen Nutzlast, die an die API oder das SDK gesendet wurde, bevor Pipe-Transformationen angewendet werden. Auch wenn Ihre Pipe Felder löscht oder umwandelt, bleibt die volle ursprüngliche Nutzlast in der Fehlertabelle erhalten.

Übersicht

Wenn Sie die leistungsstarke Snowpipe Streaming-Architektur verwenden, erfolgt die Datenverarbeitung serverseitig in Snowflake. Die High-Performance-Architektur arbeitet implizit im ON_ERROR = CONTINUE-Modus, d. h., gültige Zeilen werden aufgenommen, während problematische Zeilen übersprungen werden.

Optionen zur Fehlerbehandlung

Sie können Datenaufnahmefehler auf folgende Weise überwachen und behandeln:

Ohne Fehlertabellen:

Diese Methoden zeigen Ihnen, dass Fehler aufgetreten sind und wie viele, jedoch nicht, welche Zeilen fehlgeschlagen sind oder welche Nutzdaten sie enthalten.

Mit Fehlertabellen:

  • Zeilen, deren Verarbeitung fehlschlägt, werden automatisch in einer speziellen Fehlertabelle erfasst.

  • Jede Fehlerzeile enthält die vollständige ursprüngliche Nutzlast und detaillierte Fehlermetadaten.

  • Sie können fehlgeschlagene Zeilen mit Standard-SQL abfragen, analysieren und erneut verarbeiten.

Fehlertabellen vervollständigen das Bild, indem sie Ihnen genau anzeigen, welche Zeilen fehlgeschlagen sind und warum, und ermöglichen so ein vollständiges Debugging und Wiederherstellung.

Aktivieren Sie die Fehlerprotokollierung

Um die Fehlerprotokollierung für Snowpipe Streaming zu aktivieren, setzen Sie die ERROR_LOGGING-Eigenschaft in der Zieltabelle fest. Vollständige Informationen zum Aktivieren und Konfigurieren der Fehlerprotokollierung finden Sie unter DML-Fehlerprotokollierung für eine Tabelle konfigurieren.

-- For a new table:
CREATE TABLE my_streaming_table (...) ERROR_LOGGING = TRUE;

-- For an existing table:
ALTER TABLE my_streaming_table SET ERROR_LOGGING = TRUE;

Wenn die Fehlerprotokollierung aktiviert ist, erfasst dieselbe Fehler-Tabelle Fehler sowohl aus DML-Statements als auch aus Snowpipe Streaming-Datenaufnahme-Workloads.

Fehlertabellen abfragen

Um die Fehlertabelle für eine Basistabelle abzufragen, verwenden Sie die``ERROR_TABLE``-Tabellenfunktion. Vollständige Informationen zum Schema der Fehler-Tabellen, zu Zugriffskontrollen und unterstützten Operationen finden Sie unter Fehlerprotokollierung und Fehlertabellen.

SELECT * FROM ERROR_TABLE(my_streaming_table) ORDER BY timestamp;

Das Ergebnis enthält eine Zeile für jede fehlerhafte Zeile im Erfassungsstream.

Snowpipe Streaming-Fehlerfelder

Snowpipe Streaming-Fehler werden in denselben Fehlertabellenspalten wie DML-Fehler (timestamp, query_id, error_code, error_metadata, error_data) gespeichert. Die error_metadata- und``error_data``-Objekte enthalten zusätzliche Felder für Snowpipe Streaming, die in den folgenden Abschnitten beschrieben werden.

Identifizieren von Snowpipe Streaming-Fehlern

Das error_metadata:service-Feld wird für Fehler aus Snowpipe Streaming mit snowpipe_streaming befüllt. Verwenden Sie dieses Feld, um Fehler nach Quelle zu filtern:

SELECT * FROM ERROR_TABLE(my_streaming_table)
WHERE error_metadata:service = 'snowpipe_streaming';

Details zu Fehlermetadaten

Bei Fehlern aus Snowpipe Streaming enthält das error_metadata:details-Objekt die folgenden zusätzlichen Felder:

Feld

Beschreibung

pipe_name

Name der Pipe, die zum Erfassen der fehlerhaften Zeile verwendet wird.

channel_name

Name des Kanals, der zum Erfassen der fehlerhaften Zeile verwendet wird.

offset_token_upper_bound

Oberes Begrenzungs-Offset-Token, das die fehlerhafte Zeile enthält. Die Zeile wird in der Nutzlast mit diesem Offset-Token oder früher angezeigt.

error_data_truncated

Gibt an, ob die Rohnutzlast abgeschnitten wurde, um in die Fehlertabelle zu passen (maximal 128 MB).

error_data_content_type

Gibt den Typ des in der:code:error_data-Spalte gespeicherten Inhalts an. Siehe Inhaltstypen der Fehlerdaten.

Fehlerdatenformat

Bei Fehlern aus Snowpipe Streaming enthält das error_data:$1-Feld die rohe Nutzlast, die die fehlerhafte Zeile repräsentiert.

Wenn die Nutzlast ungültige UTF-8-Zeichen enthält wird die Rohnutzlast als base64-codierte binäre Zeichenfolge gespeichert.

Inhaltstypen der Fehlerdaten

Das error_data_content_type-Feld gibt den Typ des aufgetretenen Fehlers an und schlägt Schritte zur Behebung vor.

json

Die fehlerhafte Zeile ist ein syntaktisch gültiger JSON-String, jedoch ist beim Laden der Daten in die Zieltabelle ein logischer Fehler aufgetreten.

Zu den häufigsten logischen Fehlern gehören:

  • Fehlgeschlagene nicht nullwertfähige Spalten: Eine erforderliche Spalte mit einer NOT NULL-Einschränkung wurde in der Nutzlast nicht angegeben.

  • Typkonvertierungsfehler: Der JSON-Datentyp kann nicht in den Zielspaltentyp umgewandelt werden. Zum Beispiel kann ein String-Wert "abc" nicht in eine NUMBER-Spalte konvertiert werden.

  • Transformationsfehler: Bei der Auswertung eines Pipe-Transformationsausdrucks, z. B. Division durch Null, ist ein Fehler aufgetreten.

Um das Problem zu beheben, überprüfen Sie die Fehlermeldung in:code:error_metadata:error_message und den Spaltennamen in:code:error_metadata:error_source, die den Datenaufnahmefehler verursacht haben. Parsen Sie die Nutzlast mit PARSE_JSON(error_data:$1), korrigieren Sie die Daten und fügen Sie sie anschließend erneut in die Zieltabelle ein.

json-invalid

Ein syntaktisch ungültiges JSON-Objekt wurde aufgenommen.

Um das Problem zu beheben, überprüfen Sie die Fehlermeldung in:code:error_metadata:error_message, die Details zum Syntaxfehler enthält. Korrigieren Sie die in error_data:$1 gespeicherte Nutzlast, und fügen Sie sie erneut in die Zieltabelle ein.

binary-base64

Ungültige UTF-8-Daten wurden aufgenommen. Die Fehlernutzlast wird in der Fehlertabelle als base64-codierte binäre Zeichenfolge gespeichert.

Dieser Fehlertyp weist typischerweise auf einen Formatkonflikt oder einen Codierungsfehler in der vorgelagerten Datenquelle hin.

Um das Problem zu lösen, untersuchen Sie die Datenquelle und die von ihr erzeugten Datenformate und Codierungen. Dekodieren Sie die in error_data:$1 gespeicherte Nutzlast mit der Funktion BASE64_DECODE_STRING, um die Rohbytes zu untersuchen und fehlerhafte UTF-8-Sequenzen zu identifizieren.

Workflow zur Fehlerbehebung

Das folgende Beispiel zeigt, wie Sie Fehler abfragen, analysieren und korrigierte Daten wieder einfügen können.

Letzte Fehler abfragen

SELECT
    timestamp,
    error_code,
    error_metadata:error_message::STRING AS error_message,
    error_metadata:details:channel_name::STRING AS channel,
    error_metadata:details:pipe_name::STRING AS pipe,
    error_metadata:details:error_data_content_type::STRING AS content_type,
    error_data:"$1"::STRING AS raw_payload
FROM ERROR_TABLE(my_streaming_table)
WHERE error_metadata:service = 'snowpipe_streaming'
  AND timestamp >= DATEADD(hour, -1, CURRENT_TIMESTAMP())
ORDER BY timestamp DESC;

Analysieren der Fehlerverteilung

SELECT
    error_code,
    error_metadata:error_message::STRING AS error_message,
    COUNT(*) AS error_count
FROM ERROR_TABLE(my_streaming_table)
WHERE error_metadata:service = 'snowpipe_streaming'
  AND timestamp >= DATEADD(hour, -24, CURRENT_TIMESTAMP())
GROUP BY 1, 2
ORDER BY error_count DESC;

Korrigieren und erneutes einfügen behebbarer Fehler

Bei Fehlern mit gültigen JSON-Nutzlasten können Sie die Daten analysieren, korrigieren und erneut einfügen:

INSERT INTO my_streaming_table (col1, col2, col3)
SELECT
    TRY_CAST(PARSE_JSON(error_data:"$1"):col1 AS NUMBER),
    PARSE_JSON(error_data:"$1"):col2::STRING,
    TRY_CAST(PARSE_JSON(error_data:"$1"):col3 AS TIMESTAMP)
FROM ERROR_TABLE(my_streaming_table)
WHERE error_metadata:service = 'snowpipe_streaming'
  AND error_metadata:details:error_data_content_type = 'json'
  AND timestamp >= DATEADD(hour, -24, CURRENT_TIMESTAMP());

Nachdem Sie die Fehler erfolgreich erneut verarbeitet haben, können Sie die Fehlertabelle kürzen:

TRUNCATE ERROR_TABLE(my_streaming_table);

Rechnungsstellung

Die Snowpipe Streaming-Datenaufnahme wird zum Standardtarif für Snowpipe Streaming abgerechnet. Das Aktivieren der Fehlerprotokollierung ändert nicht Ihre Kosten für die Datenaufnahme. Es fallen keine zusätzlichen Gebühren für das Routing von fehlgeschlagenen Zeilen an die Fehlertabelle an.

Snowflake berechnet für Daten, die in der Fehlertabelle gespeichert sind, die Standardspeichergebühr, wie für jede andere Tabelle auch. Die Fehlertabelle speichert die rohen Nutzdaten und Fehlermetadaten für jede fehlgeschlagene Zeile.

Weitere Informationen zu den Kosten von Snowpipe Streaming finden Sie unter:doc:/user-guide/snowpipe-streaming/snowpipe-streaming-high-performance-cost.

Einschränkungen

  • Fehlertabellen erfassen Fehler, die bei der serverseitigen Datenverarbeitung (Parsen und Transformieren) auftreten. Fehler von anderen Stagingbereichen (SDK-Validierung, API-Fehler und andere serverseitige asynchrone Fehler) werden nicht in Fehlertabellen erfasst. Überwachen Sie serverseitige asynchrone Fehler mit getChannelStatus ().

  • Eine hohe Fehlerrate bei eingehenden Zeilen kann die Verarbeitungslatenz aufgrund des Aufwands für das Speichern von Fehlerinformationen erhöhen.

  • Nutzlasten größer als 128 MB werden abgeschnitten. Das error_data_truncated-Feld zeigt an, wann eine Kürzung vorgenommen wurde.

  • Fehlertabellen sind nur für die leistungsstarke Snowpipe Streaming-Architektur verfügbar. Bei der klassischen Architektur wird die Fehlerbehandlung clientseitig über das SDK verwaltet.