COMPUTAÇÃO PARALELA E DISTRIBUÍDA Aluno: Alessandro Faletti Orientadora: Noemi Rodriguez Introdução O objetivo inicial no projeto era aplicar a possibilidade de processamento em paralelo no sistema CSBase da Tecgraf. No entanto, percebemos que seria necessário um estudo anterior sobre programação paralela em ambientes de memória distribuída, e acabamos redirecionando o projeto para o estudo de programação paralela no ambiente de memória distribuída provido pelo serviço Amazon Elastic Compute Cloud (AmazonEC2) que disponibiliza capacidade computacional redimensionável na nuvem como um serviço web. Softwares SO: Linux Fedora 21 AmazonEC2 Metodologia Antes de começarmos com a implementação direta do processamento paralelo no sistema CSBase da Tecgraf, começamos com um estudo de como funcionam os sistemas que utilizam a programação paralela. Para isso estudamos o livro Parallel Programming in C with MPI and OpenMP de Michael J. Quinn. Desta forma fizemos um estudo sobre a biblioteca MPI (Message-Passing Interface), onde seu principal objetivo é a troca de mensagens entre dois ou mais processos. Utilizamos a biblioteca para realizar vários pequenos testes didáticos, programando em linguagem C. A princípio os primeiros programas foram desenvolvidos para serem utilizados em máquinas locais, entretanto no decorrer do estudo, surgiu a ideia de utilizarmos a programação paralela em conjunto com a nuvem (internet). Após o entendimento básico da biblioteca, começamos a estudar a possibilidade de adaptarmos o programa que havíamos feito, para funcionar com várias instancias de máquinas virtuais na nuvem. Para isso, utilizamos do serviço Amazon Elastic Compute Cloud (AmazonEC2) que é um serviço da web que disponibiliza capacidade computacional redimensionável na nuvem. Essa integração foi onde encontramos algumas dificuldades de implementação, pois nos deparamos com o problema de comunicação entre as máquinas e então foi necessário um estudo maior de como funcionam as chaves públicas e privadas no sistema operacional Linux. Para a comunicação entre as máquinas, é utilizado comandos como ssh e scp, porém essa comunicação requer uma autenticação usualmente feita através de senha, isso impossibilita que a transferência de arquivos entre hosts possa ser feita automaticamente, sem intervenções. Logo, para resolver esse problema é possível gerar chaves públicas de acesso e criptografar os dados de maneira direta e assim remover a autenticação por senha. Utilizando as funções fornecidas pela MPI [1], foi possível gerar um script em lua [2] que criasse uma quantidade de máquinas virtuais fornecidas pela Amazon EC2 e que todas essas máquinas pudessem se comunicar e trocar mensagens entre elas. Dessa forma qualquer usuário que tiver um tipo de computação de grande escala para ser realizado, pode-se utilizar desse sistema para obter um resultado bem mais rápido. Entretanto observamos que o
programador que desejado desenvolver algo para utilizar o nosso script, ele teria que entender muito do funcionamento da biblioteca e esse não era o nosso objetivo. Portanto demos início a um outro estudo, este era sobre o modelo de programação paralela muito utilizado nos dias atuais, o MapReduce. Este novo modelo computacional é inspirado pelas funções MAP e REDUCE [3] usadas comumente em programação funcional e desta forma eliminaríamos o fato do programar necessitar conhecer sobre o funcionamento de troca de mensagens entre as máquinas. A função MAP, leva uma série de pares (chave / valor) processa cada um e gera zero ou mais (chave / valor) pares de saída. Os tipos de entrada e de saída do mapa podem ser (e geralmente são) diferentes umas das outras. Se o aplicativo está fazendo uma contagem de palavras, a função de mapa iria quebrar a linha em palavras e de saída de um par chave / valor para cada palavra. Cada par de saída deve conter a palavra como a chave e o número de ocorrências dessa palavra na linha como o valor. A função REDUCE pode percorrer os valores que estão associados com a chave e produzir zero ou mais saídas. No exemplo a contagem de palavras, a função toma os valores de entrada, resume-os e gera uma única saída da palavra e a soma final. Assim, utilizando este novo modelo, começamos a implementação de um framework que seu principal objetivo é o gerenciamento de arquivos processados em paralelo na computação elástica da AmazonEC2. Dessa maneira fizemos um script em lua no qual o usuário não precisa se preocupar com a comunicação entre os máquinas que irão funcionar em paralelo, sua única preocupação é desenvolver as funções MAP e REDUCE. O framework é desenvolvido em lua e para a realização de troca de mensagens entre os computadores da AmazonEC2, foi utilizado uma biblioteca de lua, chamada de luasocket, que possibilita o tráfego de informações entre as máquinas pelas portas sockets que a biblioteca gerencia. Com esse pequeno sistema desenvolvido, pode-se processar dados em grande volume, com um tempo de processamento curto, pois todo o trabalho será subdividido para cada máquina escrava que estará localizada na nuvem, desta forma sem a necessidade de ter máquinas físicas à disposição. Entretanto existe um ponto negativo no framework desenvolvido, pois este divide o trabalho para cada máquina de acordo com a quantidade de arquivos de entrada. Portanto para ter uma maior divisão de tarefas e o trabalho ficar bem mais dividido e homogêneo, é necessário que o programador divida a grande quantidade de dados que ele precisa processar em vários arquivos. Uma ideia posterior seria desenvolver uma ferramenta que faça essa divisão de dados em vários arquivos como complemento do framework. Discussões Observamos que para processar poucos dados, o framework possui um desempenho muito ruim se comparado ao processar os mesmos dados em uma máquina individual. Entretanto para grandes volumes de dados, ele se torna extremamente útil. O framework, apesar de simples, é funcional e foi uma grande forma de aprendizado sobre a computação paralela e distribuída.
Exemplos da ferramenta utilizando MPI Primeiramente uma imagem de 3 máquinas da amazon em funcionamento, criadas diretamente pelo script desenvolvido em lua. Esta imagem mostra o resultado de uma multiplicação de matrizes utilizando a biblioteca MPI e a Amazon
Exemplos da ferramenta utilizando MapReduce Nesta imagem é possível observar 2 máquinas da Amazon criadas pelo framework do MapReduce. Nesta imagem é possível observar um pequeno exemplo para achar amigos em comum entre pessoas. O exemplo pode ser visto com mais detalhes pelo link http://stevekrenzel.com/finding-friends-with-mapreduce.
Conclusões O estudo teórico permitiu uma maior compreensão do uso das funções fornecidas pelas bibliotecas. Foi possível realizar utilizá-las em vários testes iniciais em um ambiente local e após todos os testes feitos com sucessos, é feita a mudança para o ambiente nuvem. Pela sua própria experiência, a curva de aprendizado é não trivial e esse tipo de ferramenta em que foi trabalhado é importante para dar acesso ao potencial de ambientes de computação elástica. A computação paralela é usada hoje com bastante frequência para o processamento de grandes volumes de dados, onde somente um processador levaria muito tempo para conclusão do objetivo. Isso pode ser visto na própria internet, pois há uma enorme quantidade de dados sendo trafegados e a computação de todo o dado é realizado praticamente instantaneamente ao nossos olhos, isso só é possível graças a esse compartilhamento de processamento fornecido pela computação paralela. Referências 1 - Open MPI: Open Source High Performance Computing. Disponível em: https://www.open-mpi.org/. Acessado em 10 de agosto de 2015 2 Ierusalimschy, Roberto. Programming in Lua. Roberto Ierusalimschy, 2003 3 What is MapReduce? About MapReduce. Disponível em: https://www- 01.ibm.com/software/data/infosphere/hadoop/mapreduce/. Acessado em 20 de janeiro de 2016