Hazelcast Jetの紹介

1.はじめに

このチュートリアルでは、Hazelcast Jetについて学びます。これはHazelcast、Inc.が提供する分散データ処理エンジンで、Hazelcast IMDGの上に構築されています

Hazelcast IMDGについて学びたい場合は、https://www.baeldung.com/java-hazelcast[ここ]を始めるための記事です。

2. Hazelcast Jetとは何ですか?

Hazelcast Jetは、データをストリームとして扱う分散データ処理エンジンです。データベースまたはファイルに格納されているデータとKafkaサーバーによってストリーミングされているデータを処理できます。

ストリームをサブセットに分割し、各サブセットに集計を適用することで、無限のデータストリームに対して集計機能を実行できます。この概念は、Jet用語ではウィンドウとして知られています。

Jetをマシンのクラスタに配置してから、データ処理ジョブを送信することができます。 Jetはクラスタのすべてのメンバに自動的にデータを処理させます。クラスタの各メンバーはデータの一部を消費するため、あらゆるレベルのスループットに容易にスケールアップできます。

これがHazelcast Jetの典型的なユースケースです。

  • リアルタイムストリーム処理

  • 高速バッチ処理

  • 分散方式でのJava 8ストリームの処理

  • マイクロサービスでのデータ処理

3.セットアップ

Hazelcast Jetを私たちの環境にセットアップするには、 pom.xml にMavenの依存関係を1つ追加するだけです。

その方法は次のとおりです。

<dependency>
    <groupId>com.hazelcast.jet</groupId>
    <artifactId>hazelcast-jet</artifactId>
    <version>0.6</version>
</dependency>

この依存関係を含めると、10 Mbのjarファイルがダウンロードされ、分散データ処理パイプラインを構築するために必要なすべてのインフラストラクチャが提供されます。

Hazelcast Jetの最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Chazelcast%20jet[ここ]にあります。

4.サンプルアプリケーション

Hazelcast Jetについてさらに学ぶために、文章とそれらの文章で見つかる単語の入力を受け取り、それらの文章で指定された単語の数を返すサンプルアプリケーションを作成します。

4.1. パイプライン

PipelineはJetアプリケーションの基本構造を形成します。パイプライン内の処理は以下のステップに従います。

  • ソースからデータを引き出す

  • データを変換する

  • シンクにデータを流し込む

我々のアプリケーションでは、パイプラインは分散型のListから取り出し、グループ化と集約の変換を適用し、最後に分散型のMapにドレインします。

これがパイプラインの書き方です。

private Pipeline createPipeLine() {
    Pipeline p = Pipeline.create();
    p.drawFrom(Sources.<String> 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;
}

ソースから取得したら、データを調べて、正規表現を使用してスペースの周りに分割します。その後、空白を取り除きます。

最後に、単語をグループ化し、それらを集約し、結果を Mapに出力します。

4.2. 仕事

パイプラインが定義されたので、パイプラインを実行するためのジョブを作成します。

パラメータを受け取り、カウントを返す __countWord __関数を作成する方法は次のとおりです。

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

私たちは自分の仕事を作りパイプラインを使うために最初にJetインスタンスを作ります。次に、入力 __List __を分散リストにコピーして、すべてのインスタンスで使用できるようにします。

次に、上で構築したパイプラインを使用してジョブを送信します。メソッド __newJob() は、Jetによって非同期に起動された実行可能ジョブを返します。 join メソッドは、ジョブが完了するのを待ち、ジョブがエラーで完了した場合は exception__をスローします。

ジョブが完了すると、パイプラインで定義したとおりに、結果が分散 __Mapに取得されます。そのため、Jetインスタンスから Map__を取得し、それに対する単語の数を取得します。

最後に、Jetインスタンスをシャットダウンしました。 ** Jetインスタンスは独自のスレッドを開始するので、実行が終了したらシャットダウンすることが重要です。

そうでなければ、私たちのJavaプロセスは私たちのメソッドが終了した後でもまだ生きています。

これがJet用に書いたコードをテストする単体テストです。

@Test
public void whenGivenSentencesAndWord__ThenReturnCountOfWord() {
    List<String> 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.まとめ

この記事では、Hazelcast Jetについて学びました。その機能とその機能についての詳細は、http://docs.hazelcast.org/docs/jet/latest/manuals/[manual]を参照してください。

いつものように、この記事で使われている例のコードはhttps://github.com/eugenp/tutorials/tree/master/hazelcast[over Github]です。