Introdução
Neste laboratório, você aprenderá como personalizar os formatos de saída e entrada no Hadoop MapReduce para processar dados de forma eficaz. Com a orientação do Ghost Tutor, você adquirirá as habilidades necessárias para trabalhar com diferentes tipos de dados e desbloquear todo o potencial do ecossistema Hadoop. Prepare-se para embarcar em uma jornada emocionante para dominar a arte da computação no reino sobrenatural!
Escrevendo o Mapper e o Reducer
Nesta etapa, mergulharemos no coração do Hadoop MapReduce e criaremos nossas próprias classes Mapper e Reducer.
Explorando o Arquivo de Dados
Primeiramente, use o comando su - hadoop para mudar de identidade. O arquivo de dados data.txt está armazenado no diretório /user/hadoop/input do HDFS, que armazena o conteúdo das conversas de algumas pessoas. Use o seguinte comando para visualizar o conteúdo:
hdfs dfs -cat /user/hadoop/input/data.txt
Mapper Personalizado
Em seguida, criaremos uma classe Mapper personalizada chamada WordCountMapper que estende Mapper. Este Mapper processará os dados de entrada e emitirá pares chave-valor, observando que os dados processados são o conteúdo de cada linha da conversa, e não os nomes das pessoas. Consulte o exemplo a seguir para complementar o método map em WordCountMapper.java em /home/hadoop/.
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Convert the Text object to a String
String line = value.toString();
// Tokenize the string using StringTokenizer
StringTokenizer tokenizer = new StringTokenizer(line);
// Iterate through each token and write it to the context
while (tokenizer.hasMoreTokens()) {
// Set the current word
word.set(tokenizer.nextToken().trim());
// Write the word and its count to the context
context.write(word, one);
}
}
Em seguida, use o seguinte comando para compilar o código na versão Java 8:
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountMapper.java
Reducer Personalizado
Finalmente, criaremos uma classe Reducer personalizada chamada WordCountReducer que estende Reducer. Este Reducer agregará os valores para cada chave e emitirá o resultado final. Complemente o método reduce em WordCountReducer.java em /home/hadoop/ com o seguinte exemplo.
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
// Initialize a variable to store the sum of counts for each word
int sum = 0;
// Iterate through all counts for the current word and calculate the total sum
for (IntWritable value : values) {
sum += value.get();
}
// Set the final count for the current word
result.set(sum);
// Write the word and its final count to the context
context.write(key, result);
}
Em seguida, use o seguinte comando para compilar o código na versão Java 8:
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountReducer.java
Escrevendo Formatos de Entrada e Saída Personalizados
Nesta etapa, especificaremos os formatos de entrada e saída para o trabalho MapReduce.
Formato de Entrada Personalizado
Primeiramente, vamos criar um formato de entrada personalizado para ler dados de uma fonte específica. Definiremos uma classe chamada PersonInputFormat que estende TextInputFormat e substitui o método getCurrentValue para lidar com o formato de entrada. Complemente o método getCurrentValue em PersonInputFormat.java em /home/hadoop/ com o seguinte exemplo.
@Override
public synchronized Text getCurrentValue() {
// Return the value of the current record, split it according to ":", remove the first and last blanks and set it to the Text object.
Text value = new Text();
Text line = super.getCurrentValue();
String[] parts = line.toString().split(":");
if (parts.length == 2) {
value.set(parts[1].trim());
}
return value;
}
Em seguida, use o seguinte comando para compilar o código na versão Java 8:
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. PersonInputFormat.java
Formato de Saída Personalizado
Em seguida, vamos criar um formato de saída personalizado. Definiremos uma classe chamada CSVOutputFormat que estende TextOutputFormat. Complemente o método write em CSVOutputFormat.java em /home/hadoop/ com o seguinte exemplo.
// Write the key-value pair to the output stream in CSV format
@Override
public void write(Text key, IntWritable value) throws IOException, InterruptedException {
out.writeBytes(key.toString() + "," + value.toString() + "\n");
}
Em seguida, use o seguinte comando para compilar o código na versão Java 8:
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. CSVOutputFormat.java
Integrando com o Driver
Nesta etapa final, modificaremos a classe WordCountDriver para utilizar os formatos de entrada e saída personalizados que criamos anteriormente.
Driver Personalizado
Complemente a função main de WordCountDriver.java em /home/hadoop/ com o seguinte exemplo.
// Set Mapper and Reducer classes
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
// Set input format class to custom input format PersonInputFormat
job.setInputFormatClass(PersonInputFormat.class);
// Set output format class to custom output format CSVOutputFormat
job.setOutputFormatClass(CSVOutputFormat.class);
Executando o Trabalho
Para executar o trabalho Hadoop MapReduce com os formatos de entrada e saída personalizados, siga estas etapas:
Compile o WordCountDriver.java usando as dependências Hadoop apropriadas.
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountDriver.javaCrie um arquivo JAR contendo as classes compiladas.
jar -cvf mywordcount.jar *.classExecute a classe
WordCountDrivercom os caminhos de entrada e saída apropriados. Certifique-se de que o caminho de saída não exista previamente.hadoop jar ./mywordcount.jar WordCountDriver /user/hadoop/input /output
Este comando executará o trabalho Hadoop MapReduce usando os formatos de entrada e saída personalizados que definimos.
Visualizando os Resultados da Saída
Use o seguinte comando para verificar se o arquivo de resultado foi gerado com sucesso:
hdfs dfs -ls /output
hdfs dfs -cat /output/part.csv
Resumo
Parabéns! Neste laboratório, você explorou com sucesso as complexidades do Hadoop MapReduce e dominou a personalização de formatos de saída e entrada sob a orientação do Ghost Tutor. Desde a criação de classes mapper e reducer até a superação de desafios como o tratamento de arquivos de entrada não divisíveis (unsplittable), você adquiriu informações valiosas. Através de exercícios práticos, você aprofundou sua compreensão das capacidades do Hadoop MapReduce e agora está equipado para enfrentar desafios de dados com confiança. Esta jornada não apenas aprimorou suas habilidades técnicas, mas também ampliou sua perspectiva sobre o potencial do Hadoop MapReduce para o processamento de big data.



