Concrete Logo
Hamburger button

MapReduce – parte II

  • Blog
  • 28 de Novembro de 2012
Share

Este post é o segundo de uma série que pretende abordar MapReduce, BigData e Hadoop.

 
Vamos transformar o pseudo código do fim de MapReduce – parte I em código Java e o resultado está abaixo:

Map

    [sourcecode language=”java”]
    import java.io.BufferedInputStream;
    import java.util.Scanner;
    import java.util.StringTokenizer;

    public class Mapper {

    private void map () {
    Scanner sc = new Scanner(new BufferedInputStream(System.in));
    String line = "";
    while (sc.hasNextLine()) {
    line = sc.nextLine();
    StringTokenizer tokens = new StringTokenizer(line);
    while(tokens.hasMoreTokens()){
    emitIntermediate(tokens.nextToken(), "1");
    }
    }
    sc.close();
    }

    private void emitIntermediate (String w, String um) {
    System.out.println(w + "\t" + um);
    }

    public static void main(String[] args) {
    new Mapper().map();
    }
    }[/sourcecode]

Reduce

    [sourcecode language=”cpp”]
    import java.io.BufferedInputStream;
    import java.util.Scanner;

    public class Reducer {
    private void reduce () {
    String line = "";
    String previousKey = null;
    int total = 0;
    String key;
    int value;
    Scanner sc = new Scanner(new BufferedInputStream(System.in));

    while (sc.hasNextLine()) {
    line = sc.nextLine();
    String [] linha = line.split("\\s+");
    key = linha[0];
    value = Integer.parseInt(linha[1]);
    if (!key.equals(previousKey)) {
    emit(previousKey, total);
    previousKey = key;
    total = 0;
    }
    total += value;
    }
    emit(previousKey, total);
    sc.close();

    }

    private void emit(String term, int sum) {
    if (term != null) {
    System.out.println(term + "\t" + sum);
    }
    }

    public static void main(String[] args) {
    new Reducer().reduce();
    }
    }[/sourcecode]

 

Vendo os resultados

Vamos contar a frequência das palavras de um livro em formato .txt. Para isto vamos nos valer do Google e procurar por “ulysses gutemberg“.

O primeiro link já aponta para o livro Ulysses escrito por James Joyce no projeto Gutemberg de onde podemos baixar a versão txt em https://www.gutenberg.org/cache/epub/4300/pg4300.txt.

O livro conta um dia de vida de Leopold Bloom em Dublin e faz paralelos com o poema épico Odisséia de Homero (Odysseus, herói do livro de Homero significa Ulysses em latim). É um livro difícil para mim. Já tentei ler pelo menos umas 3 vezes e que não consigo passar das primeiras páginas. Minha vingança virá agora contando a frequência das palavras.

Digamos que o arquivo do Ulysses já esteja baixado e esteja no mesmo diretório onde foram compilados os códigos Java lá de cima.

Vocês devem ter reparado e talvez estranhado o uso da classe Scanner em cima do System.in. A explicação é que eu queria executar tudo do mesmo modo streaming usando pipes como executamos scripts shell. Mais para a frente nesta série, quando formos rodar o mesmo programinha convertido para Python no ElasticMapReduce da Amazon, será exatamente assim que executaremos.

O comando que vocês deverão executar é:

Captura de Tela 2012-11-27 às 16.50.15

Se você quer conferir seus resultados, aí vão os meus:

Captura de Tela 2012-11-27 às 16.54.03

 

Conclusão

Sim, sei. Estão estranhando. O exemplo rodou na minha máquina como um programinha qualquer e deixa a impressão que não tem nada de MapReduce.

Na verdade tem sim. Este código poderia ser paralelizado usando MapReduce sem tirar nem por. Quem estiver mais curioso, pode antecipar que faremos em um post futuro e colocar para rodar na Amazon EMR (Amazon Elastic MapReduce) (e configurar para usar vários nós).

Antes de sair por aí usando Hadoop, etc. e tal, era fundamental explicar os conceitos. Foi o que fizemos nestes dois primeiros posts da série.

No próximo voltaremos ao blá, blá, blá falando mais de MapReduce, lembrando alguns outros casos de uso, como é a arquitetura do framework do Google e abordando a questão da patente. Vocês sabiam da patente do Google em cima da implementação de MapReduce?

É isso, tudo como preparação para depois entrar no Hadoop, aguardem.