segunda-feira, 29 de julho de 2013

     O grande desafio e objetivo do universo NoSQL é paralelizar aplicações. E um grande aliado nesta tarefa é o MapReduce. Ele é um modelo de programação paralelo, desenvolvido pelos engenheiro da Google, que permite massiva escalabilidade, usando dezenas, centenas de servidores conectador em cluster. Como o nome sugere, é composto de uma fase Map para selecionar os dados, e uma fase Reduce responsável pela transformação dos dados. 

     Sendo um pouco mais específico, a função Map que processa pares chave-valor para gerar um conjunto de pares intermediários chave-valor. A função Reduce que processa e une todos valores intermediários associados com a mesma chave em uma espécie de sumarização dos resultados. Vejamos um exemplo gráfico:



     A motivação da Google para usar este modelo foi facilitar o processamento de grandes volumes de dados, paralelizando o processamento através de centenas ou mesmo milhares de CPUs. Com esta solução, obteve um processamento tolerante à falhas, com ferramentas de monitoração e com uma abstração limpa e fácil para os programadores. Além do framework da Google, diversas implementações fora desenvolvidas, como para MongoDB e além da mais conhecida inserida no projeto Hadoop.

     Uma analogia simples foi feita pela IBM:
As an analogy, you can think of map and reduce tasks as the way a cen­sus was conducted in Roman times, where the census bureau would dis­patch its people to each city in the empire. Each census taker in each city would be tasked to count the number of people in that city and then return their results to the capital city. There, the results from each city would be reduced to a single count (sum of all cities) to determine the overall popula­tion of the empire. This mapping of people to cities, in parallel, and then com­bining the results (reducing) is much more efficient than sending a single per­son to count every person in the empire in a serial fashion.

      

Mas, afinal, por que o MapReduce  é útil? 


     Um exemplo clássico é a necessidade de contar quantas palavras existem em um determinado conjunto de documentos. Lembrando que a quantidade que estamos lidando aqui é gigantesca, pois a Google o desenvolveu como solução para auxiliar sua ferramenta de busca.
      Abaixo, temos um exemplo genérico das funções  Map e Reduce:

Map
    map (String fileName, String documento) {
      List <String> Text = tokenize(documento)
      for each token in Text {
        emitIntermediate ( token, 1)
      }
    }
Reduce
    reduce (String token, List<Integer> values) {
      Integer sum = 0
      for cada value in values {
        sum = sum + value
      }
      emit ( token, sum)
    }
     Esta é uma ferramenta muito poderosa, com aplicação muito frequente em bancos NoSQL. seu entendimento é fundamental. No próximo post mostraremos a implementação na prática, com o MongoDB.
     Até lá!

0 comentários:

Postar um comentário