Введение в Hazelcast Jet

Введение в Hazelcast Jet

1. Вступление

В этом руководстве мы узнаем о Hazelcast Jet. Это механизм распределенной обработки данных, предоставляемый Hazelcast, Inc. и построен поверх Hazelcast IMDG

Если вы хотите узнать о Hazelcast IMDG,here - это статья для начала.

2. Что такое Hazelcast Jet?

Hazelcast Jet - это механизм распределенной обработки данных, который обрабатывает данные как потоки. Он может обрабатывать данные, хранящиеся в базе данных или файлах, а также данные, которые передаются на сервер Kafka.

Он может выполнять агрегатные функции над бесконечными потоками данных, разделяя потоки на подмножества и применяя агрегирование по каждому подмножеству. Эта концепция известна как оконная обработка в терминологии Jet.

Мы можем развернуть Jet в кластере машин и затем отправить на него наши задания по обработке данных. Jet заставит всех участников кластера автоматически обрабатывать данные. Каждый член кластера потребляет часть данных, и это облегчает масштабирование до любого уровня пропускной способности.

Вот типичные варианты использования Hazelcast Jet:

  • Обработка потока в реальном времени

  • Быстрая пакетная обработка

  • Обработка потоков Java 8 распределенным способом

  • Обработка данных в микросервисах

3. Настроить

Чтобы настроить Hazelcast Jet в нашей среде, нам просто нужно добавить одну зависимость Maven к нашемуpom.xml.

Вот как мы это делаем:


    com.hazelcast.jet
    hazelcast-jet
    0.6

С учетом этой зависимости загрузится файл jar 10 Мб, который предоставляет нам всю инфраструктуру, необходимую для построения распределенного конвейера обработки данных.

Последнюю версию для 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 to в распределенный список, чтобы он был доступен для всех экземпляров.

Затем мы отправляем работу, используя построенный выше конвейер. МетодnewJob()  возвращает исполняемое задание, которое запускается Jet асинхронно. Методjoin ожидает завершения задания и выдаетexception, если задание завершено с ошибкой.

Когда задание завершается, результаты извлекаются в распределенномMap, as, который мы определили в нашем конвейере. Итак, мы получаемMap из экземпляра Jet и получаем количество слов против него.

Наконец, мы закрыли экземпляр 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. Заключение

В этой статье мы узнали о Hazelcast Jet. Чтобы узнать больше об этом и его функциях, обратитесь кmanual.

Как обычно, код для примера, использованного в этой статье, можно найтиover on Github.