Einleitung
In diesem Blogbeitrag wird dargestellt, wie Talend Jobs (Talend Data Integration (DI)) in ein externes Java-Projekt eingebunden werden können. In vielen Projekten gibt es die Anforderung Daten aus verschiedenen Quellen zu laden, miteinander zu kombinieren und zu transformieren. Auch wenn es naheliegt eine Implementierung direkt in der jeweiligen Programmiersprache des Projekts vorzunehmen, bieten graphische ETL-Anwendungen einige Vorteile, welche den Entwicklungs-Prozess deutlich einfacher gestalten und den Aufwand reduzieren können. Von den gängigen ETL-Tools integriert sich Talend DI am besten in Java-Projekte, da sich direkt aus dem Talend Studio Client JAR-Dateien bauen lassen, welche direkt in Talend-fremde Java-Projekte integriert werden können. Ein Grund für die Integration eines Talend-Jobs in ein externes Java-Projekt kann es sein, dass man Ergebnisse als Rest-Service anbieten oder aus dem Java-Projekt direkt ETL-Strecken ausführen möchte.
Auch wenn Talend DI hauptsächlich als stand-alone Datenintegrations-Tool konzipiert ist, welches üblicherweise (vor allem in der Enterprise-Version) seinen Einsatzzweck im Data Warehouse oder Data Lake findet, bietet bereits die Open-Source Version (Talend Open Studio) ein mächtiges Werkzeug zur Entwicklung von Datenverarbeitungsstrecken, die sich in produktiven Java-Umgebungen nutzen lassen.
Auf ein graphisches Werkzeug zur Entwicklung von komplexen ETL-Prozessen zu setzen, kann einige Vorteile bringen. Talend DI bietet viele spezifische Komponenten, die in der Entwicklung genutzt werden können und so viele Anwendungsszenarien abbilden. Dazu kommt eine große Community, die weitere Komponenten für spezifischere Aufgaben bereitstellt. So lassen sich Talend-Jobs überall nutzten, wo man mit Code-basierten Prozessen an Grenzen stößt. Talend DI bietet die Möglichkeit übersichtliche Jobs zu designen, die mit etablierten Prozessen sehr gut wartbar sind und eine einfache Fehleranalyse bieten, welche sich bei in Code geschriebenen ETL-Jobs oftmals schwierig erweist.
Design des Talend-Jobs
Für einen Talend-Job, den man in ein Java-Projekt einbinden möchte, gibt es keine besonderen Voraussetzungen. Es sollten die Richtlinien für gutes Design angewendet werden, die auch für den Einsatz von Talend DI als stand-alone-Anwendung gelten. Ziel sollte es sein, den Job übersichtlich zu halten und so viel Logik wie möglich im Java-Backend abzubilden. Diese kann dann über Ausprägungen von Kontext-Variablen an den Talend-Job übergeben werden. Dafür bietet es sich an eine eigene Java-Klasse zu implementieren, welche diese Logik bereitstellt. Auch sollten alle Konstanten in das externe Java-Projekt ausgelagert werden, um die Wartung und Änderungen an dem Job so einfach wie möglich zu gestalten. Anpassungen im Java-Code können schneller durchgeführt werden als Änderungen an dem Talend-Job.
Als Beispiel dient ein simpler Job (ETL_RUNNER), der zufällig erzeugte Testdaten in eine Datenbank schreibt. Die Anzahl der Kontext-Parameter ist überschaubar:
- numberOfInputRows = Anzahl der Datensätze die erzeugt werden sollen
- targetDBHost = Host der Zieldatenbank
- targetDBPort = Port der Zieldatenbank
- targetDBUser = Benutzer der Zieldatenbank
- targetSchema = Schema der Zieldatenbank
- targetTable = Tabelle der Zieldatenbank
Diese Kontext-Parameter sollen über den Java-Code gesteuert werden, sodass der Talend-Job in unterschiedlichen Ausführungsumgebungen laufen kann.
Baut man den Job nun mit Hilfe von Talend Studio, kann man alle Haken abwählen. Der Aufruf soll direkt aus der generierten JAR-Datei erfolgen und alle Kontext-Parameter werden aus der externen Java-Klasse übergeben.
Das Java-Projekt in diesem Beispiel enthält zwei Pakete:
- saracus.talend.wrapper: Hier liegt der Java-Code
- saracus.talend.repository: Hier wird der entpackte Talend-Code abgelegt
Einbinden des Jobs in das Java-Projekt
Sobald der Talend-Job gebaut worden ist, können die erzeugten JAR-Dateien dem Build-Path des Java-Projekts hinzugefügt werden. Dann können diese bei der Ausführung des Java-Codes berücksichtigt werden. Die Liste der JAR-Dateien für dieses Beispiel sieht folgenermaßen aus:
Hier sind der Talend-Job „ETL_RUNNER“ und alle benötigten Abhängigkeiten enthalten, sodass der Job direkt aus dem externen Code aufgerufen werden kann. In Projekten, in denen die Builds automatisiert gestartet werden, können aus den JAR-Dateien Abhängigkeiten erzeugt werden aus denen sich dann mit Build-Tools wie Apache Maven oder Gradle fertige Anwendungen erzeugen lassen.
Die Kontext Parameter können bei dem Aufruf des Talend-Jobs als String-Array übergeben werden, wobei folgende Form eingehalten werden muss:
–context_param {context_name}={context_ausprägung}
In der folgenden Beispiel-Klasse werden die Ausprägungen der benötigten Kontext-Parameter statisch übergeben:
package saracus.talend.wrapper;
import java.util.ArrayList;
public class TalendContext {
public String[] getContextParameters() {
ArrayList<String> params = new ArrayList<String>();
params.add("--context_param numberOfInputRows=" + noInputRows);
params.add("--context_param targetDBHost=" + "xx.xx.xxx.xxx");
params.add("--context_param targetDBPort=" + port);
params.add("--context_param targetDBUser=" + "dbUser");
params.add("--context_param targetSchema=" + "schemaName");
params.add("--context_param targetTable=" + "tableName");
return params.stream().toArray(String[]::new);
}
}
In produktiven Projekten können die Ausprägungen dynamisch, je nach Umgebung in denen der ETL-Job ausgeführt werden soll, erzeugt werden.
Die Klasse, die den Talend-Job aufruft und ausführt, erzeugt dann ein TalendContext-Objekt und gibt dieses an den Aufruf des Talend-Jobs weiter:
package saracus.talend.wrapper;
import etlrepository.etl_runner_0_1.ETL_RUNNER;
public class TalendWrapper {
public static void main(String[] args) {
ETL_RUNNER etl = new ETL_RUNNER();
TalendContext context = new TalendContext();
etl.runJobInTOS(context.getContextParameters());
}
}
So lässt sich der Talend-Job mit einem Variablen-Kontext aus Java direkt aufrufen.
Hier wird die Methode runJobInTOS zum Ausführen des Talend-Jobs genutzt, welche direkt aus der erzeugten Jar-Datei stammt. Talend bietet zwei Methoden, um Jobs aus generierten JAR-Dateien auszuführen:
- runJobInTOS: Akzeptiert ein String-Array als Kontext-Parameter und führt den Job aus
- runJob: Ist eine Wrapper-Methode für runJobInTOS und gibt einen besser lesbaren Fehlercode zurück
Weitere Methoden des Talend-Jobs geben den Ausführungs-Kontext (getContext()), den Fehlercode (errorCode()), entsprechende Process identifier (pid(), fatherPid(), rootPid()), den Startzeitpunkt (startTime()) oder den aktuellen Status des Jobs (status()) zurück.
Besonderheiten von Talend in Java-Projekten
Aus dem Einbinden eines Talend-Jobs in ein Java-Projekt lassen sich einige Einschränkungen der Open-Source Variante von Talend aufwiegen. Vor allem der große Nachteil, dass die Scheduling-Funktion des Talend-Administration-Center (TAC) nicht zur Verfügung steht fällt nicht ins Gewicht. Denn in einem existierenden Java-Projekt müssen andere Werkzeuge zum Einsatz kommen, um die Ausführungsplanung zu übernehmen.
Für die Fehleranalyse und das Logging des Talend-Jobs muss nach Art des Projektes entschieden werden, ob mit den Standard-Komponenten gearbeitet wird, die Logs und Fehler in Talend DI dokumentieren. Diese Komponenten können ihre Informationen dann entweder in Dateien oder eine Datenbank schreiben. Ein anderer Ansatz, welcher sich am besten in die übliche Infrastruktur von Java-Projekten einfügt, ist es über tJava-Komponenten direkt Log4j-Nachrichten zu erzeugen. Diese integrieren sich erfahrungsgemäß am besten in Log-Management Anwendungen. Da sich Log4j-Nachrichten besser finden lassen als die Logs, die durch die Talend-Komponenten erzeugt werden, da diese über die gleichen Filter wie die Logs der eigentlichen Java-Anwendung gefunden werden können.
Des Weiteren ist die fehlende Integration eines Versionsverwaltungstools nicht weiter dramatisch, da sich die Talend-Repositories im Ganzen mit allen möglichen Versionsverwaltungs-Werkzeugen versionieren lassen. Dazu muss allerdings für jeden ETL-Prozess ein eigenes Repository in das Java-Projekt integriert werden, um eine parallele Bearbeitung zu ermöglichen, da Merge-Konflikte nicht innerhalb des Studios gelöst werden können.
Nachteile des Einsatzes eines externen ETL-Werkzeuges
Die Funktionsweise der ETL-Strecken lässt sich mit Integrations-Test bzw. End-to-End-Tests, bei denen alle relevanten Inputs gemockt werden und ein vorher definiertes Ergebnis geprüft wird, testen. Der Einsatz von Unit-Test, um kleinere Einheiten innerhalb der Jobs zu testen, ist allerdings nicht möglich und kann bei komplexen Prozessen ein Problem darstellen, da nicht alle einzelnen Komponenten getestet werden können. Hier muss individuell entschieden werden, ob der Vorteil ein graphisches Entwicklungs-Werkzeug nutzen zu können durch den Nachteil keine vollständige Testabdeckung zu erreichen aufgehoben wird.
Weiterhin werden durch den Einsatz von Talend neue Fähigkeiten im Team benötigt. Diese müssen entweder neu aufgebaut oder durch neue Entwickler erbracht werden. Hier kann nicht pauschal beurteilt werden, ob diese zusätzlichen Kosten durch die entstehenden Vorteile aufgewogen werden.
Fazit
Wenn das notwendige Knowhow bereitgestellt werden kann und der Verzicht auf Unit-Tests möglich ist, bietet Talend DI ein mächtiges graphisches Werkzeug komplexe ETL-Prozesse in einem externen Java-Projekt umzusetzen. Es gibt eine große Community, die viele frei konfigurierbare Komponenten bereitstellt. Diese vereinfachen den Entwicklungs-Prozess deutlich und unterstützen alle gängigen Technologien und erfüllen alle Anforderungen an ETL-Prozesse. Dabei integriert sich Talend DI sehr gut in vorhandene Java-Infrastruktur und bietet (fast) alle Freiheiten, die man auch mit einer Code basierten Implementierung von ETL-Strecken erreichen kann.
Erfahren Sie hier mehr über Lösungen im Bereich Data Management oder besuchen Sie eines unserer kostenlosen Webinare.