Processamento de Dados Massivos/Projeto e implementação de aplicações Big Data/Mineração de Itemsets Frequentes: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 142:
==== MapReduce++ ====
 
MapReduce++ é um projeto open-source quecujo objetivo é contemdisponibilizar diferentes implementações emda C++abstração doMapReduce modelona linguagem de programação MapReduceC++. Esse projeto possuidefine uma interface padrão para desenvolvimento de bibliotecas MapReduce, que éserve acomo base depara suas implementações. Atualmente, MapReduce.++ contém duas implementações paralelas do modelo MapReduce:
 
* MapMP - uma biblioteca MapReduce para multi-processadores (memória compartilhada) baseada em OpenMP
Atualmente, MapReduce++ contém duas implementações de MapReduce:
* MaPI - um framework MapReduce para multi-computadores (memória distribuída) baseada em Message Passing Interface (MPI)
 
Há também uma terceira versão, chamada SeqMR, que tem como objetivo auxiliar o usuário durante a etapa de desenvolvimento. Trata-se de uma versão sequencial para desenvolvimento. Portanto, caso o usuário não possua o ambiente de execução, este pode desenvolver a aplicação MapReduce usando SeqMR que não requer nenhum recurso além do gcc/g++. Finalizada a etapa de desenvovimento, o usuário deve então fazer pequenas adaptações no código para explorar o paralelismo intrinseco às tarefas de mapeamento e redução. São alterações como mudar a herança das classes de SeqMR para MapMP, no caso de memória compartilhada, ou para MaPI no caso de memória distribuída. Nesse último caso, faz-se necessária também a criação de serializadores e a inicialização dos servidores de mapeamento e redução.
MapMP - uma biblioteca MapReduce para multi-processadores (memória compartilhada)
MaPI - um framework MapReduce para multi-computadores (memória distribuída)
 
Uma boa forma começar o desenvolvimento de aplicações usando implementações baseadas em MapReduce++ (alternativa àquela apresentada no paragrafo anterior) é baseando nos exemplos disponíveis no projeto. Visto que os dados da aplicação aqui discutida podem não caber em uma só máquina, a implementação MaPI é a mais indicada para o nosso propósito. A seguir, é apresentado um passo-a-passo desde o download até a execussão de um programa MaPI.
===== Download =====
 
==== MaPI: Download ====
 
Baixe a versão mais atual do MapReduce++ no SourceForge
 
Baixe a versão mais atual no SourceForge
http://sourceforge.net/projects/mapreducepp/
 
===== MaPI: Instalação no Ubuntu Linux =====
 
Para desenvolver e executar programas MapReduce++MaPI, é necessário possuirter compilador g++ e suportsuporte para desenvolvimento e execução de programas baseados em MPI.
 
Instale o g++ com o seguinte comando no terminal:
 
$sudo apt-get install g++
<pre>$ sudo apt-get install g++</pre>
 
Para suporte a MPI, pode-se usar a implementação OpenMPI (recomendada):
 
$sudo apt-get install openmpi-bin libopenmpi-dev
<pre>$ sudo apt-get install openmpi-bin libopenmpi-dev</pre>
 
ou MPICH2, se preferir:
$sudo apt-get install mpich2
 
<pre>$ sudo apt-get install mpich2</pre>
===== Configuração do cluster =====
 
==== MaPI: Exemplo de aplicação ====
Necessária a instalação do ssh client e server.
 
$sudo apt-get install openssh-server openssh-client
...
 
<pre>
#include "../MaPI/MaPI.h"
#include <iostream>
#define MRType int,char,int,char,string
class MyMapper : public MaPI_Mapper<MRType> {
public:
virtual vector< pair<int,char> >
map( pair<int,char> a )
{
vector< pair<int,char> > m(1,a);
cout << "\tMapping..\n";
return m;
};
};
class MyReducer : public MaPI_Reducer<MRType> {
public:
virtual pair<int,string>
reduce( pair<int, vector<char> > bs )
{
string reduced;
for(unsigned i=0;i<bs.second.size();i++)
reduced += bs.second[i];
cout << "\tReducing..\n";
return make_pair(bs.first,reduced);
};
};
int main(int argc,char** argv)
{
MaPI_MapReduce<MRType> mapReduce;
MySerializer serializer;
MyMapper mapper(&mapReduce,&serializer);
MyReducer reducer(&mapReduce,&serializer);
mapReduce.initServers(argc,argv);
vector< pair<int,char> > input;
input.push_back(make_pair(1,'a'));
input.push_back(make_pair(2,'b'));
input.push_back(make_pair(1,'c'));
vector< pair<int,string> > output
= mapReduce.run(mapper,reducer,input);
cout << output << endl;
return 0;
}</pre>
 
O usuário deve especificar os seguintes cinco tipos:
* da chave e do valor de entrada
* da chave e do valor intermediário
* do valor de redução
 
Para compilar e executar o programa o usuário deve usar a seguinte linha de comando, onde "-np 3" significa que mpirun usará três processos:
 
<pre>$ mpiCC ex01.cpp -o program && mpirun -np 3 ex01</pre>
 
Ao executar o comando acima, a aplicação de exemplo produzirá a seguinte saída, onde a última linha é o resultado produzido pelo MapReduce.
 
<pre>Mapping..
Mapping..
Mapping..
Reducing..
Reducing..
vector(2) [pair(1 , "ac") , pair(2 , "b")]</pre>
 
===== MaPI: Configuração do cluster =====
 
Até então, os testes foram executados em uma máquina apenas. Para usar um cluster, é necessária a instalação do ssh client e server.
 
<pre>$ sudo apt-get install openssh-server openssh-client</pre>
 
Como iniciar e parar um servidor ssh:
$sudo /etc/init.d/ssh start
$sudo /etc/init.d/ssh stop
 
<pre>$ sudo /etc/init.d/ssh start
=== Detalhes de implementação ===
$ sudo /etc/init.d/ssh stop</pre>
 
===== MaPI: breve descrição da estrutura =====
 
Para maiores detalhes, veja [citar].
 
= Avaliação =