Introdução ao Hazelcast Jet
1. Introdução
Neste tutorial, aprenderemos sobre Hazelcast Jet. É um mecanismo de processamento de dados distribuído fornecido pela Hazelcast, Inc. e é construído sobre o IMDG Hazelcast
Se você quiser saber mais sobre Hazelcast IMDG,here é um artigo para começar.
2. O que é o Hazelcast Jet?
O Hazelcast Jet é um mecanismo de processamento de dados distribuído que trata os dados como fluxos. Ele pode processar dados armazenados em um banco de dados ou arquivos, bem como os dados transmitidos por um servidor Kafka.
Ele pode executar funções agregadas em fluxos de dados infinitos, dividindo os fluxos em subconjuntos e aplicando agregação em cada subconjunto. Esse conceito é conhecido como janela na terminologia Jet.
Podemos implantar o Jet em um cluster de máquinas e, em seguida, enviar nossos trabalhos de processamento de dados para ele. O Jet fará com que todos os membros do cluster processem automaticamente os dados. Cada membro do cluster consome uma parte dos dados e isso facilita o dimensionamento para qualquer nível de taxa de transferência.
Aqui estão os casos de uso típicos do Hazelcast Jet:
-
Processamento de fluxo em tempo real
-
Processamento em lote rápido
-
Processando o Java 8 Streams de maneira distribuída
-
Processamento de dados em microsserviços
3. Configuração
Para configurar o Hazelcast Jet em nosso ambiente, só precisamos adicionar uma única dependência Maven ao nossopom.xml.
É assim que fazemos:
com.hazelcast.jet
hazelcast-jet
0.6
A inclusão dessa dependência fará o download de um arquivo jar de 10 Mb que nos fornece toda a infraestrutura necessária para criar um pipeline de processamento de dados distribuídos.
A versão mais recente do Hazelcast Jet pode ser encontradahere.
4. Aplicação de amostra
Para saber mais sobre o Hazelcast Jet, criaremos um aplicativo de amostra que recebe uma entrada de frases e uma palavra para encontrar nessas frases e retorna a contagem da palavra especificada nessas frases.
4.1. O Pipeline
Um pipeline forma a construção básica de um aplicativo Jet. Processing within a pipeline follows these steps:
-
desenhar dados de uma fonte
-
transformar os dados
-
drenar os dados em uma pia
Para a nossa aplicação, o pipeline tirará de umList distribuído, aplicará a transformação de agrupamento e agregação e finalmente drenará para umMap distribuído.
Aqui está como escrevemos nosso 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;
}
Depois de extrair da fonte, percorremos os dados e os dividimos no espaço usando uma expressão regular. Depois disso, filtramos os espaços em branco.
Por fim, agrupamos as palavras, agregamos e drenamos os resultados para umMap.
4.2. O emprego
Agora que nosso pipeline está definido, criamos um trabalho para executar o pipeline.
Aqui está como escrevemos uma funçãocountWord que aceita parâmetros e retorna a contagem:
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;
}
Primeiro criamos uma instância do Jet para criar nosso trabalho e usar o pipeline. Em seguida, copiamos a entradaList para uma lista distribuída de modo que esteja disponível em todas as instâncias.
Em seguida, enviamos um trabalho usando o pipeline que criamos acima. O métodonewJob() retorna um trabalho executável que é iniciado pelo Jet de forma assíncrona. O métodojoin aguarda a conclusão do trabalho e lança umexception se o trabalho for concluído com um erro.
Quando o trabalho é concluído, os resultados são recuperados em umMap, distribuído que definimos em nosso pipeline. Então, obtemosMap da instância Jet e obtemos as contagens da palavra contra ela.
Por fim, encerramos a instância do Jet. É importante desligá-lo após o término de nossa execução, comoJet instance starts its own threads. Caso contrário, nosso processo Java ainda estará ativo, mesmo após a saída do nosso método.
Aqui está um teste de unidade que testa o código que escrevemos para o 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. Conclusão
Neste artigo, aprendemos sobre Hazelcast Jet. Para saber mais sobre ele e seus recursos, consultemanual.
Como de costume, o código para o exemplo usado neste artigo pode ser encontradoover on Github.