Feitiçaria de Dados em Xara

HadoopBeginner
Pratique Agora

Introdução

No mágico reino desértico de Xara, o sábio e benevolente Rei Amir procurou aproveitar o poder dos vastos recursos de dados espalhados por todo o seu reino. Ele convocou seus magos de dados mais habilidosos para conceber um sistema que pudesse coletar, processar e analisar os dados do reino, desvendando insights para auxiliar na tomada de decisões e na prosperidade de todos.

O objetivo era criar uma plataforma de dados robusta e escalável que pudesse se integrar ao Hadoop Distributed File System (HDFS) e aproveitar o poder do MapReduce para um processamento de dados eficiente. Essa plataforma permitiria ao reino analisar dados de várias fontes, como registros comerciais, rendimentos agrícolas e informações de recenseamento, capacitando o Rei Amir a tomar decisões informadas para o bem-estar de seus súditos.

Explorando o Ecossistema Hadoop

Nesta etapa, você se familiarizará com o ecossistema Hadoop e seus componentes principais: HDFS e MapReduce.

Hadoop é um framework de código aberto para armazenamento e processamento distribuído de grandes conjuntos de dados em clusters de hardware commodity. Ele consiste em dois componentes principais:

  1. Hadoop Distributed File System (HDFS): Um sistema de arquivos distribuído projetado para armazenar arquivos grandes em várias máquinas, fornecendo tolerância a falhas e acesso de alta taxa de transferência aos dados.

  2. MapReduce: Um modelo de programação e framework de software para escrever aplicações que processam grandes quantidades de dados em paralelo em um cluster de máquinas.

Para explorar o ecossistema Hadoop, você pode usar os seguintes comandos em seu terminal:

Primeiro, certifique-se de estar logado como o usuário hadoop executando o seguinte comando no terminal:

su - hadoop

Liste os diretórios e arquivos no HDFS:

hdfs dfs -ls /

Crie um novo diretório no HDFS:

hdfs dfs -mkdir -p /home/hadoop/input

Copie um arquivo local para o HDFS:

hdfs dfs -put /home/hadoop/local/file.txt /home/hadoop/input

Esses comandos demonstram como interagir com o HDFS, listando seu conteúdo, criando diretórios e copiando arquivos do seu sistema de arquivos local.

O comando hdfs dfs é usado para interagir com o Hadoop Distributed File System (HDFS). A opção -ls lista o conteúdo de um diretório no HDFS, enquanto -mkdir cria um novo diretório. A opção -put copia um arquivo local para o HDFS.

Executando um Job MapReduce

Nesta etapa, você aprenderá como executar um job MapReduce nos dados armazenados no HDFS, aproveitando o poder do processamento paralelo para analisar grandes conjuntos de dados de forma eficiente.

MapReduce é um modelo de programação para processar grandes conjuntos de dados em paralelo em um cluster de máquinas. Ele consiste em duas fases principais:

  1. Map: Os dados de entrada são divididos em pedaços menores, e cada pedaço é processado por uma tarefa separada chamada "mapper". O mapper processa os dados e emite pares chave-valor.

  2. Reduce: A saída dos mappers é classificada e agrupada por chave, e cada grupo é processado por uma tarefa separada chamada "reducer". O reducer combina os valores associados a cada chave e produz o resultado final.

Vamos executar um simples job MapReduce que conta as ocorrências de palavras em um arquivo de texto. Primeiro, crie um arquivo Java chamado WordCount.java com o seguinte conteúdo:

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

    public static class TokenizerMapper
            extends Mapper<Object, Text, Text, IntWritable>{

        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context
        ) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer
            extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values,
                           Context context
        ) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

Em seguida, compile o arquivo Java:

mkdir ~/wordcount
javac -source 8 -target 8 -classpath $(hadoop classpath) -d ~/wordcount WordCount.java
jar -cvf ~/wordcount.jar -C ~/wordcount .

Finalmente, execute o job MapReduce:

hadoop jar ~/wordcount.jar WordCount /home/hadoop/input/file.txt /home/hadoop/output

A classe WordCount define um job MapReduce que conta as ocorrências de palavras em um arquivo de texto. A classe TokenizerMapper tokeniza cada linha de texto de entrada e emite pares chave-valor (palavra, 1). A classe IntSumReducer soma os valores (contagens) para cada palavra e emite os pares finais (palavra, contagem).

O arquivo Java é compilado e empacotado em um arquivo JAR, que é então executado usando o comando hadoop jar. O caminho do arquivo de entrada (/home/hadoop/input/file.txt) e o caminho do diretório de saída (/home/hadoop/output) são fornecidos como argumentos.

Resumo

Neste laboratório, você embarcou em uma jornada ao mágico reino desértico de Xara, onde ajudou o Rei Amir a aproveitar o poder do ecossistema Hadoop para processar e analisar os dados do reino. Você explorou os componentes principais do Hadoop, incluindo o HDFS para armazenamento distribuído e o MapReduce para processamento de dados paralelo.

Através de etapas práticas, você aprendeu a interagir com o HDFS, criar diretórios e fazer upload de arquivos. Você também adquiriu experiência na execução de um job MapReduce, especificamente uma aplicação de contagem de palavras, que demonstrou as capacidades de processamento paralelo do Hadoop.

Ao concluir este laboratório, você adquiriu habilidades valiosas na integração do Hadoop com HDFS e MapReduce, equipando-o com o conhecimento para enfrentar desafios de big data do mundo real. Essa experiência, sem dúvida, contribuirá para o seu crescimento como um mago de dados, capacitando-o a obter insights e impulsionar a tomada de decisões em vários domínios.