Einführung in Hazelcast Jet

Einführung in Hazelcast Jet

1. Einführung

In diesem Tutorial lernen wir Hazelcast Jet kennen. Es handelt sich um eine verteilte Datenverarbeitungs-Engine von Hazelcast, Inc. und basiert auf Hazelcast IMDG

Wenn Sie mehr über Hazelcast IMDG erfahren möchten, isthere ein Artikel für den Einstieg.

2. Was ist Hazelcast Jet?

Hazelcast Jet ist eine verteilte Datenverarbeitungs-Engine, die Daten als Streams behandelt. Es kann sowohl Daten verarbeiten, die in einer Datenbank oder in Dateien gespeichert sind, als auch Daten, die von einem Kafka-Server gestreamt werden.

Sie kann Aggregatfunktionen für unendliche Datenströme ausführen, indem sie die Datenströme in Teilmengen aufteilt und die Aggregation für jede Teilmenge anwendet. Dieses Konzept wird in der Jet-Terminologie als Fensterung bezeichnet.

Wir können Jet in einem Cluster von Computern bereitstellen und dann unsere Datenverarbeitungsaufträge an diesen senden. Jet veranlasst alle Mitglieder des Clusters, die Daten automatisch zu verarbeiten. Jedes Mitglied des Clusters verbraucht einen Teil der Daten, wodurch es einfach ist, auf jede Durchsatzstufe zu skalieren.

Hier sind die typischen Anwendungsfälle für Hazelcast Jet:

  • Echtzeit-Stream-Verarbeitung

  • Schnelle Stapelverarbeitung

  • Verteiltes Verarbeiten von Java 8-Streams

  • Datenverarbeitung in Microservices

3. Konfiguration

Um Hazelcast Jet in unserer Umgebung einzurichten, müssen wir unserenpom.xmlnur eine einzige Maven-Abhängigkeit hinzufügen.

So machen wir das:


    com.hazelcast.jet
    hazelcast-jet
    0.6

Durch das Einbeziehen dieser Abhängigkeit wird eine 10-MB-JAR-Datei heruntergeladen, die uns die gesamte Infrastruktur zur Verfügung stellt, die wir zum Aufbau einer Pipeline für die verteilte Datenverarbeitung benötigen.

Die neueste Version für Hazelcast Jet finden Sie unterhere.

4. Beispielanwendung

Um mehr über Hazelcast Jet zu erfahren, erstellen wir eine Beispielanwendung, bei der Sätze und ein Wort in diesen Sätzen eingegeben und die Anzahl der angegebenen Wörter in diesen Sätzen zurückgegeben werden.

4.1. Die Pipeline

Eine Pipeline bildet das Basiskonstrukt für eine Jet-Anwendung. Processing within a pipeline follows these steps:

  • Daten aus einer Quelle ziehen

  • transformiere die Daten

  • Lassen Sie die Daten in eine Spüle ab

Für unsere Anwendung wird die Pipeline aus einem verteiltenList gezogen, die Transformation von Gruppierung und Aggregation angewendet und schließlich auf ein verteiltesMap entleert.

So schreiben wir unsere Pipeline:

private Pipeline createPipeLine() {
    Pipeline p = Pipeline.create();
    p.drawFrom(Sources. list(LIST_NAME))
      .flatMap(
        word -> traverseArray(word.toLowerCase().split("\\W+")))
      .filter(word -> !word.isEmpty())
      .groupingKey(wholeItem())
      .aggregate(counting())
      .drainTo(Sinks.map(MAP_NAME));
    return p;
}

Sobald wir aus der Quelle gezogen haben, durchlaufen wir die Daten und teilen sie mit einem regulären Ausdruck im Raum auf. Danach filtern wir die Lücken heraus.

Zuletzt gruppieren wir die Wörter, aggregieren sie und reduzieren die Ergebnisse aufMap. 

4.2. Die Arbeit

Nachdem unsere Pipeline definiert wurde, erstellen wir einen Job zum Ausführen der Pipeline.

So schreiben wir einecountWord -Funktion, die Parameter akzeptiert und die Anzahl zurückgibt:

public Long countWord(List sentences, String word) {
    long count = 0;
    JetInstance jet = Jet.newJetInstance();
    try {
        List textList = jet.getList(LIST_NAME);
        textList.addAll(sentences);
        Pipeline p = createPipeLine();
        jet.newJob(p)
          .join();
        Map counts = jet.getMap(MAP_NAME);
        count = counts.get(word);
        } finally {
            Jet.shutdownAll();
      }
    return count;
}

Wir erstellen zuerst eine Jet-Instanz, um unseren Job zu erstellen und die Pipeline zu verwenden. Als Nächstes kopieren wir die EingabeList in eine verteilte Liste, sodass sie für alle Instanzen verfügbar ist.

Wir übermitteln dann einen Auftrag unter Verwendung der oben erstellten Pipeline. Die MethodenewJob() gibt einen ausführbaren Job zurück, der von Jet asynchron gestartet wird. Die Methodejoin wartet auf den Abschluss des Jobs und gibtexception aus, wenn der Job mit einem Fehler abgeschlossen wird.

Wenn der Job abgeschlossen ist, werden die Ergebnisse in einem verteiltenMap, as abgerufen, den wir in unserer Pipeline definiert haben. Wir erhalten also dieMap von der Jet-Instanz und die Anzahl der Wörter dagegen.

Zuletzt fahren wir die Jet-Instanz herunter. Es ist wichtig, es nach Beendigung unserer Ausführung alsJet instance starts its own threads herunterzufahren. Andernfalls ist unser Java-Prozess auch nach dem Beenden unserer Methode noch aktiv.

Hier ist ein Unit-Test, der den Code testet, den wir für Jet geschrieben haben:

@Test
public void whenGivenSentencesAndWord_ThenReturnCountOfWord() {
    List sentences = new ArrayList<>();
    sentences.add("The first second was alright, but the second second was tough.");
    WordCounter wordCounter = new WordCounter();
    long countSecond = wordCounter.countWord(sentences, "second");
    assertTrue(countSecond == 3);
}

5. Fazit

In diesem Artikel haben wir etwas über Hazelcast Jet erfahren. Weitere Informationen zu ihm und seinen Funktionen finden Sie untermanual.

Wie üblich ist der Code für das in diesem Artikel verwendete Beispielover on Github.