Batch-Import

Ein Batch-Import verarbeitet eine Serie von Import-Aufrufen als "Batch" (engl. "Stapel") in einem einzigen "Job". Jeder einzelne Import-Aufruf im "Batch" entspricht dabei funktional einem Single-Import mit der entsprechenden Struktur und Logik.

Die Seite Import bietet einen Überblick zum Zusammenspiel zwischen Lobster Data Platform / Orchestration und Lobster_data und beschreibt den allgemeinen Aufbau eines Importprofils.

Die für den Single-Import verwendete Struktur entspricht exakt dem Inhalt eines einzelnen batch-Knotens beim Batch-Import.

Nachfolgend stehen deshalb vor allem die Details der Batch-Verarbeitung im Fokus, während die für den Single-Import dokumentierten Details zur eigentlichen Import-Struktur vorausgesetzt werden.

In der Praxis kann man auch für den Import einzelner Objekte die Batch-Import-Struktur zu verwenden. Dann stehen bei Bedarf auf die für den Batch-Import zusätzlich verfügbaren Funktionalitäten zur Verfügung.

Elemente der Zielstruktur für einen Batch-Import

Beim Anlegen eines Importprofils für einen Batch-Import wird die Zielstruktur idealerweise ausgehend von der Lobster Data Platform / Orchestration-Vorlage für das core:BatchImport -Objekt erstellt (Details s. Lobster_pro Vorlagen).

Der folgende Screenshot zeigt eine aus der core:BatchImport-Vorlage generierte Zielstruktur, für die hier informativ die Spalte "Datentyp" eingeblendet ist:

images/download/attachments/78252345/image2020-8-11_16-5-57-version-1-modificationdate-1627373575005-api-v2.png

  • Der durch Auswahl hervorgehobene "Wurzelknoten" (BatchImport) enthält eine Reihe von Feldern für Parameter, die den Batch-Import betreffen. Diese werden in den folgenden Unterabschnitten vorgestellt.

  • Unterhalb (im Screenshot durch den blauen Rahmen hervorgehoben) stellt die Vorlage einen einzigen batch-Knoten bereit, der bei Bedarf entweder zur Laufzeit iteriert oder schon in der Definition der Zielstruktur explizit mehrfach enthalten sein kann. Jeder einzelne batch-Knoten wird parametriert und interpretiert wie der core:Import -Knoten bei einem Single-Import. Der Screenshot zeigt nur die von der Vorlage bereitgestellten Elemente. Innerhalb eines batch-Knotens ist dabei in der Regel noch die Objektstruktur zu ergänzen, die durch genau einen (oder mehrere strikt alternativ angesteuerte) Unterknoten definiert werden kann (Details siehe Single-Import und Lobster_pro Vorlagen).

Transaktionskontrolle (trxControl-Atttribut)

Über das Attribut trxControl kann einer der folgenden Modi für die Transaktionskontrolle für den Batch-Import ausgewählt werden:

Transaktionskontrollmodus

Beschreibung

SINGLE

Jeder batch-Knoten wird als eigenständige Transaktion verarbeitet.
Schlägt ein einzelner Import fehl, werden nachfolgende Importe trotzdem ausgeführt.

BATCH

Alle batch-Knoten werden in einer gemeinsamen Transaktion verarbeitet.
Schlägt ein einzelner Import fehl, wird der "Batch" insgesamt abgebrochen und bereits durchgeführte Importe werden rückgängig gemacht .

BATCH_OR_EXISTING

Für jedes zu importierende Objekt wird geprüft, ob im Aufrufkontext bereits eine gültige Transaktion besteht.

  • Existiert eine gültige Transaktion, wird diese für den Import genutzt. Es erfolgt dann weder ein Commit, noch wird die Transaktion beendet.

  • Existiert keine gültige Transaktion, wird der Import-Modus BATCH angewendet.

HINWEIS◄ Dieser Modus macht dann Sinn, wenn mehrere Profile oder Ereignisse in einer Transaktion miteinander verknüpft werden sollen.

Antwortverhalten (responsive-Attribut)

Dem Attribut responsive kann ein boolescher Wert zugewiesen werden, um im Kontext eines Funktionsaufrufs (s. Lobster_pro: Import (_data-Funktion)) zu entscheiden, ob die per Batch-Import verarbeiteten Objekte als Rückgabewert der Funktion ausgegeben werden sollen (true) oder nicht (false).

HINWEIS◄ Falls der Batch-Import als Zielstruktur eines Profils definiert wird, ist dieses Attribut irrelevant.

Attribute für die Fehlerbehandlung

Attribut

Datentyp

Standardwert

Beschreibung

optimisticRetries

Integer

0

Ein Wert >0 definiert die maximale Anzahl der Wiederholungsversuche bei einem Schreibkonflikt (Optimistic-Lock-Exception).

Mit dem Wert 0 (bzw. wenn das Attribut nicht verwendet wird) erfolgt keine Wiederholung.

optimisticRetryDelay

BigInteger

0

Ein Wert > 0 definiert die Wartezeit in Sekunden vor einem Wiederholungsversuch bei einem Schreibkonflikt (Optimistic-Lock-Exception).

stopOnFirstError

Boolean

false

Mit dem Wert true erfolgt im Transaktionskontrollmodus SINGLE ein Abbruch sobald ein Fehler auftritt.

Mit dem Wert false (bzw. wenn das Attribut nicht verwendet wird) werden nachfolgende batch-Knoten auch nach einem Fehler verarbeitet.

failAfterErrors

Boolean

true

Mit dem Wert true (bzw. wenn das Attribut nicht verwendet wird) gilt der Batch-Import sobald ein Fehler auftritt als Fehlschlag:

  • Die "Übersicht" im Lobster_data-Control Center zeigt für das Profil den Typ "Fehlerhafte Jobs". Es erscheint außerdem in der Liste "Fehler".

Mit dem Wert false gilt der Batch-Import nicht als fehlgeschlagen, wenn ein Fehler auftritt (s. a. singleErrorHandlerProfile):

  • Die "Übersicht" im Lobster_data-Control Center zeigt für das Profil den Typ "Erfolgreiche Jobs". Es erscheint nicht in der Liste "Fehler". Fehlermeldungen sind aber als "Log-Meldungen" für den Job nachvollziehbar.

singleErrorHandlerProfile

String

(leer)

Der Eintrag benennt ein Profil, das im Transaktionskontrollmodus SINGLE als Fehlerbehandlung aufgerufen wird;

Das angegebene Profil erhält als Eingangsdaten eine core:Import-Struktur (s. Single-Import), die den batch-Knoten widerspiegelt, der den Fehler verursacht hat.

  • In Verbindung mit dem Transaktionskontrollmodus BATCH ist dieses Attribut wirkungslos.

  • Falls der Batch-Import in Verbindung mit einer Fehlerbehandlung durch ein singleErrorHandlerProfile im Fehlerfall nicht insgesamt als fehlgeschlagen gewertet werden soll, muss dem Attribut failAfterErrors der Wert false zugewiesen werden.

  • Falls der angegebene Profilname nicht existiert, ist das Attribut wirkungslos. Eine Fehlermeldung tritt dabei nicht auf.

Beispiel

Das folgende Beispiel demonstriert den Einsatz eines Batch-Imports zum Importieren von Stammdaten für Orte, die in Lobster Data Platform / Orchestration zum automatischen Vervollständigen von Adressdaten herangezogen werden.

Eingangsagent (Phase 1)

Geeignete Quelldaten können zum Beispiel von www.geonames.org per Download bezogen werden. Die dort bereitgestellte Archivdatei beinhaltet Quelldaten im Textformat (Tab-getrennt, UTF-8), die gut zur Datenstruktur des City-Objekts von Lobster Data Platform / Orchestration passen, wie das im folgenden Abschnitt beschriebene Mapping verdeutlicht. Prinzipiell könnte die Quelldatei durch "Manuelles Hochladen" einem Importprofil zugeführt werden. Alternativ kann auch ein direkter Abruf per HTTP-CronJob eingerichtet werden, wie im folgenden Screenshot zu sehen:

images/download/attachments/78252345/image2020-9-7_15-30-9-version-1-modificationdate-1627373575011-api-v2.png

  • Im Format der hier angegebenen Datei "allCountries.zip" sind am angegebenen Ort auch spezifische Datenquellen für einzelne Länder erhältlich.

  • Beim Download der Zip-Datei muss im Reiter "Basis-Daten" unbedingt die Option "Daten kommen komprimiert an" gesetzt sein:

    images/download/attachments/78252345/image2020-9-7_15-31-46-version-1-modificationdate-1627373575013-api-v2.png
  • Da die Datei allCountries.zip umfangreiche Daten (siebenstellige Anzahl Zeilen) enthält, sollten diese abschnittweise (z. B. in Gruppen von 5000 Zeilen je Datenblatt) verarbeitet werden, um Speicherplatzproblem zu vermeiden. Zu diesem Zweck kann im Profil-Reiter "Basis-Daten" eine Vorverarbeitung der Daten durch einen speziellen "Preparser", den TokenFileSplitter, eingerichtet werden.

    images/download/attachments/78252345/image2020-9-15_13-1-7-version-1-modificationdate-1627373575018-api-v2.png



    Der Preparser wird über eine Konfigurationsdatei parametriert. Ausgehend von einer Vorlage sind hier nur die Parameter in den letzten beiden Zeilen anzupassen. Neben der Anzahl der Zeilen pro Datenblatt (rows) muss eine frei wählbare Markierungszeichenfolge (header) angegeben werden. Der header wird zwischen den echten Quelldatenzeilen an allen Stellen eingestreut, an denen ein neues Datenblatt starten soll.

    images/download/attachments/78252345/image2020-9-15_13-5-43-version-1-modificationdate-1627373575023-api-v2.png



    Das Mapping (s. u.) muss einen "passenden" Knoten (hier: newPage) verwenden, der die als header definierte Zeichenfolge per Satzarterkennung aufgreift und ein neues Datenblatt beginnt. Im Beispiel:

    images/download/attachments/78252345/image2020-9-15_13-15-30-version-1-modificationdate-1627373575026-api-v2.png

Parser (Phase 2)

Damit das Splitten der Eingangsdaten in handliche Datenmengen je Datenblatt auch auf die effektive Ausführung des Imports wirkt, müssen in Phase 2 des Profils die Optionen Pro Datenblatt Antwortwege ausführen und IU miteinbeziehen gesetzt sein:

images/download/attachments/78252345/image2020-9-16_9-35-38-version-1-modificationdate-1627373575033-api-v2.png

Mit diesen Einstellungen erzeugt das Profil zur Laufzeit für jedes Datenblatt einen eigenständigen Batch-Import-Job, der maximal so viele batch-Knoten beinhaltet, wie per Parameter rows im tokenFileSplitter-Preparser spezifiziert.

Mapping (Phase 3)

Die Quellstruktur (1) muss ausgehend vom importierten Dateiformat aufgebaut werden. Der folgende Screenshot zeigt abwärts von einem city benannten Knoten die anzulegenden Felder mit Datentyp (inkl. Test-Daten). Jede Zeile liefert die Daten für genau ein zu erstellendes Orte-Datenobjekt.

Oberhalb des city-Knotens wurde hier der newPage-Knoten eingehängt, der zum Aufteilen der Quelldaten in Datenblätter dient (s. o.).

►HINWEIS◄ Für die Felder latitude und longitude wurde der Datentyp BigDecimal gewählt, für den in der Felddefinition außerdem eine passende Vorlage für die Umwandlung des Texts in Zahlenwerte gewählt werden muss.

images/download/attachments/78252345/image2020-9-15_12-42-53-version-1-modificationdate-1627373575016-api-v2.png

Für den Aufbau der Zielstruktur bietet Lobster_data spezifische Vorlagen (s. Lobster_pro Vorlagen) für die Datenstrukturen von Lobster Data Platform / Orchestration an.

  • Zunächst wurde die core:BatchImport-Vorlage (2) mit der Basisstruktur für einen Batch-Import geladen. Im Bild ist für die Transaktionskontrolle bereits der Typ BATCH als Fixwert eingetragen, da die eingelesenen Orte per Batch und nicht einzeln importiert werden sollen.

  • Innerhalb des batch-Knotens (3) ist die Aktion CREATE als Fixwert eingetragen, da je eingelesene Zeile beim Import ein neues Orte-Datenobjekt erstellt werden soll. Der batch-Knoten ist mit dem city-Knoten der Quellstruktur per Pfad verbunden, damit er für jede eingelesene "City" wiederholt wird.

  • Die Knoten eventStorge und search werden hier nicht benötigt und sind inaktiv gesetzt. Sie könnten auch gelöscht werden.

  • Für den City-Knoten (4) wurde wiederum eine der Lobster_pro Vorlagen (base:City) verwendet, die mit der Option Keine Entity Attribute als Unterknoten zum batch-Knoten eingehängt wurde:

    images/download/attachments/78252345/image2020-9-15_13-27-31-version-1-modificationdate-1627373575028-api-v2.png


    Die Zuordnung der Quelldatenfelder zu den Zielfeldern im City-Knoten ergibt sich selbsterklärend aus den Beschriftungen.

  • Die Feldeinstellungen für die "dezimalen" Zielfelder latitude und longitude sollten passend zum Dateninhalt so gewählt werden, dass nicht unbeabsichtigt Nachkommastellen abgeschnitten werden.

►HINWEIS◄ Die Konfiguration für Phase 4 entfällt. Die Phasen 5 und 6 werden wie unter Import nachzulesen eingerichtet. Hier sind keine spezifischen Einstellungen für den Batch-Import erforderlich.

Ergebnisse

Um die Wirkung des hier als Besonderheit eingesetzten tokenFileSplitter-Preparsers zu veranschaulichen, wurde der rows-Wert vorübergehend auf 5 eingestellt und ein Mapping-Test mit einem kleineren Datensatz (nur die "Orte" in Chile) ausgeführt:

images/download/attachments/78252345/image2020-9-15_13-55-14-version-1-modificationdate-1627373575031-api-v2.png

  • Die Quellstruktur (links) zeigt, dass Datenblätter mit jeweils (maximal) 5 City-Knoten erstellt werden.

  • Der erste City-Knoten in der Quellstruktur entspricht dem ersten batch-Knoten in der Zielstruktur (rechts) expandiert und zeigt identische Daten.

Der Batch-Import-Job für das ersten Datenblatt (Record 1 in der Zielstruktur beim Mapping-Test) wäre wie folgt aufgebaut:

<?xml version="1.0" encoding="UTF-8"?>
<core:BatchImport ... trxControl="BATCH">
<batch action="CREATE">
<base:City country="CL" postalCode="2340000" placeName="Valparaíso" state="Región de Valparaíso" stateCode="01" countyCode="51" county="Provincia de Valparaíso" community="Valparaíso" communityCode="05101" latitude="-33.1298" longitude="-71.5735" accuracy="4"></base:City>
</batch>
<batch action="CREATE">
<base:City country="CL" postalCode="2480000" placeName="Casablanca" state="Región de Valparaíso" stateCode="01" countyCode="51" county="Provincia de Valparaíso" community="Casablanca" communityCode="05102" latitude="-33.3158" longitude="-71.4353" accuracy="4"></base:City>
</batch>
<batch action="CREATE">
<base:City country="CL" postalCode="2490000" placeName="Quintero" state="Región de Valparaíso" stateCode="01" countyCode="51" county="Provincia de Valparaíso" community="Quintero" communityCode="05107" latitude="-32.843" longitude="-71.4738" accuracy="4"></base:City>
</batch>
<batch action="CREATE">
<base:City country="CL" postalCode="2500000" placeName="Puchuncaví" state="Región de Valparaíso" stateCode="01" countyCode="51" county="Provincia de Valparaíso" community="Puchuncaví" communityCode="05105" latitude="-32.7176" longitude="-71.4111" accuracy="4"></base:City>
</batch>
<batch action="CREATE">
<base:City country="CL" postalCode="2510000" placeName="Concón" state="Región de Valparaíso" stateCode="01" countyCode="51" county="Provincia de Valparaíso" community="Concón" communityCode="05103" latitude="-32.9534" longitude="-71.4678" accuracy="4"></base:City>
</batch>
</core:BatchImport>