Hazelcast Jetの紹介

Hazelcast Jetの概要

1. 前書き

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

Hazelcast IMDGについて知りたい場合は、hereを開始するための記事です。

2. Hazelcast Jetとは何ですか?

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

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

Jetをコンピューターのクラスターに展開し、データ処理ジョブをコンピューターに送信できます。 Jetは、クラスターのすべてのメンバーにデータを自動的に処理させます。 クラスターの各メンバーはデータの一部を消費するため、あらゆるレベルのスループットに簡単にスケールアップできます。

Hazelcast Jetの一般的な使用例は次のとおりです。

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

  • 高速バッチ処理

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

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

3. セットアップ

私たちの環境でHazelcastJetをセットアップするには、pom.xmlに単一のMaven依存関係を追加する必要があります。

方法は次のとおりです。


    com.hazelcast.jet
    hazelcast-jet
    0.6

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

Hazelcast Jetの最新バージョンはhereにあります。

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

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

4.1. パイプライン

パイプラインは、Jetアプリケーションの基本的な構成要素を形成します。 Processing within a pipeline follows these steps:

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

  • データを変換する

  • データをシンクに排出します

このアプリケーションの場合、パイプラインは分散されたListから描画され、グループ化と集約の変換を適用し、最後に分散されたMapに排出されます。

パイプラインの作成方法は次のとおりです。

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;
}

ソースから描画したら、データをトラバースし、正規表現を使用して空間全体に分割します。 その後、空白を除外します。

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

4.2. 仕事

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

パラメータを受け入れてカウントを返すcountWord 関数を作成する方法は次のとおりです。

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;
}

ジョブを作成してパイプラインを使用するために、まずJetインスタンスを作成します。 次に、入力List を分散リストにコピーして、すべてのインスタンスで使用できるようにします。

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

ジョブが完了すると、パイプラインで定義した分散Map, sで結果が取得されます。 したがって、JetインスタンスからMapを取得し、それに対する単語のカウントを取得します。

最後に、Jetインスタンスをシャットダウンします。 実行が終了した後、Jet instance starts its own threadsとしてシャットダウンすることが重要です。 そうしないと、メソッドが終了した後でもJavaプロセスは生きたままになります。

次に、Jet用に記述したコードをテストする単体テストを示します。

@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. 結論

この記事では、HazelcastJetについて学習しました。 それとその機能の詳細については、manualを参照してください。

いつものように、この記事で使用されている例のコードはover on Githubにあります。