Escrever o Mapper
Nesta etapa, você escreverá a classe Mapper para processar os dados de entrada e emitir pares chave-valor intermediários.
Abra o terminal e siga as etapas abaixo para começar.
Mude o usuário para hadoop e, em seguida, mude para o diretório home do usuário hadoop:
su - hadoop
Crie um arquivo Java para a classe Mapper:
nano /home/hadoop/SpaceBattleMapper.java
Em seguida, adicione o seguinte código ao arquivo SpaceBattleMapper.java:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import java.io.IOException;
public class SpaceBattleMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Split the input line into words
String[] words = value.toString().split("\\s+");
// Emit a key-value pair for each word
for (String w : words) {
word.set(w);
context.write(word, one);
}
}
}
Dicas: Você pode copiar o código da caixa de prompt à direita e colá-lo com Ctrl + Shift + V no editor nano aberto. Pressione Ctrl + O para salvar o arquivo e Enter para confirmar quando solicitado pelo editor nano. Finalmente, use Ctrl + X para sair do editor.
A classe SpaceBattleMapper estende a classe Mapper do framework Hadoop. Ela é usada para processar dados de entrada na forma de pares chave-valor, onde a chave é um LongWritable representando o deslocamento em bytes da linha no arquivo de entrada, e o valor é um objeto Text representando a linha de texto.
A classe define dois campos privados:
one: Um objeto IntWritable com um valor constante de 1. Este é usado como o valor nos pares chave-valor emitidos.
word: Um objeto Text usado para armazenar cada palavra extraída da linha de entrada.
O método map é substituído para fornecer a lógica de mapeamento específica:
- O valor
Text de entrada é convertido em uma string e dividido em palavras com base em espaços em branco.
- Para cada palavra no array, o objeto
word é definido para essa palavra, e um par chave-valor é emitido com a palavra como a chave e one como o valor. Isso é feito usando o método context.write.
Esta classe Mapper foi projetada para emitir um par chave-valor para cada palavra nos dados de entrada, com a palavra como a chave e o inteiro 1 como o valor. Esta configuração é comumente usada em aplicações de contagem de palavras, onde o objetivo é contar as ocorrências de cada palavra em um conjunto de dados.