Jornada Fantasmagórica de Transformação de Dados

HadoopBeginner
Pratique Agora

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:

  1. 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.java
    
  2. Crie um arquivo JAR contendo as classes compiladas.

    jar -cvf mywordcount.jar *.class
    
  3. Execute a classe WordCountDriver com 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.