Introdução à computação em nuvem
Houve recentemente uma crescente excitação quanto à computação em nuvem, o que se deve à última tendência do segmento de mercado de TI. A computação em nuvem pode ser imprecisamente definida como o uso de recursos escaláveis de computação fornecidos como serviço externo ao seu ambiente com base em pagamento conforme uso. Você pode acessar qualquer um dos recursos que se localizam na "nuvem" através da Internet e sem se preocupar com capacidade computacional, largura de banda, armazenamento, segurança e confiabilidade.
Esse artigo faz uma rápida apresentação das plataformas computacionais em nuvem, como a Amazon EC2, na qual é possível alugar servidores virtuais Linux® e introduzir uma estrutura MapReduce de software livre chamada Apache Hadoop, que será construída nos servidores virtuais Linux para estabelecer a estrutura de computação em nuvem. No entanto, o Hadoop não se restringe a ser implementado em VMs hospedados por qualquer fornecedor; também pode ser implementado em SO Linux em máquinas físicas.
Antes de analisarmos o Apache Hadoop, faremos uma rápida introdução à estrutura do sistema de computação em nuvem. Consulte a seçãoRecursos para mais detalhes sobre as camadas de computação em nuvem.
A infraestrutura (Infrastructure-as-a-Service, ou IaaS) é o leasing da infraestrutura (recursos computacionais e armazenamento) como um serviço. A IaaS fornece a capacidade de um usuário fazer o lease de um computador (ou host virtualizado) ou datacenter com restrições específicas de qualidade de serviço que possuem a capacidade de executar determinados sistemas operacionais e software. O Amazon EC2 está funcionando como o IaaS nessas camadas e fornece aos usuários hosts virtualizados. A Plataforma (Platform-as-a-Service, ou PaaS) se concentra na estrutura ou serviços do software, que fornecem o recurso de APIs para computação em "nuvem" na infraestrutura. O Apache Hadoop funciona como PaaS e será construído nos hosts virtualizados como a plataforma de computação em nuvem.
O Amazon EC2 é um serviço da Web que permite solicitar máquinas virtuais com diversas capacidades (CPUs, discos, memória e outros). Você paga apenas o tempo de computação utilizado deixando as tarefas de hospedagem para o Amazon.
Essa instâncias, AMIs (Amazon Machine Images), são baseadas em Linux e podem executar qualquer aplicativo ou software. Após ter alugado os servidores do Amazon, pode-se usar ferramentas SSH normais para configurar a conexão e manipular servidores exatamente como se faz com os físicos.
Uma apresentação mais detalhada do EC2 está fora do escopo deste artigo. Consulte a seção Recursos para informações adicionais.
A melhor prática para implementar uma estrutura de computação em nuvem Hadoop é implementar nas AMIs, que podem utilizar a capacidade de nuvem quando capacidade computacional, largura de banda, armazenamento e outros não são problemas. No entanto, na próxima parte deste artigo, construíremos o Hadoop sobre imagens VMWare de servidores Linux hospedados localmente, já que o Hadoop não se restringe a ser implementado em qualquer solução de nuvem. Antes disso, faremos uma introdução ao Apache Hadoop.
O Apache Hadoop é uma estrutura de software (plataforma) que permite uma manipulação distribuída de grande quantidade de dados. Introduzida em 2006, é suportada por Google, Yahoo! e IBM, para citar algumas. Pense nisso como um modelo de PaaS.
No centro do projeto está a implementação MapReduce e o HDFS (Hadoop Distributed File System), que foi inspirado pelo MapReduce (apresentado por um artigo do Google) e pelo Google File System.
MapReduce é uma estrutura de software, introduzida pelo Google, que suporta computação distribuída em grandes conjuntos de dados em clusters de computadores (ou nós). É a combinação de dois processos chamados Map e Reduce.
No processo Map, o nó mestre recebe a informação, divide-a em subtarefas menores e distribui essas tarefas para nós funcionais.
O nó funcional processa essa tarefa menor e devolve a resposta ao nó mestre.
No processo Reduce, o nó mestre recebe as respostas de todas as subtarefas e as combina de modo a obterem a saída, que é o resultado da tarefa original.
A vantagem do MapReduce é permitir o processamento distribuído do mapa e as operações de redução. Sendo cada operação de mapeamento independente, todos os mapas podem ser executados ao mesmo tempo, reduzindo o tempo de computação total.
A introdução completa ao HDFS e como operar esse sistema está fora do escopo deste artigo. Consulte a seçãoRecursos para informações adicionais.
Do ponto de vista do usuário final, o HDFS aparece como um sistema de arquivo tradicional. É possível realizar ações CRUD em arquivos com caminho de diretório determinados. Mas, devido às características de armazenamento distribuído, há "NameNode" e "DataNode", as quais adotam as responsabilidades.
O NameNode é o mestre do DataNodes. Fornece serviços de metadados dentro do HDFS. Os metadados indicam o mapeamento de arquivo do DataNode. Também aceita comandos operacionais e determina qual DataNode deve realizar a ação e replicação.
O DataNode funciona como blocos de armazenamento para HDFS. Também respondem a comandos que criam, excluem e replicam blocos recebidos do NameNode.
Quando um aplicativo é enviado, devem ser fornecidos diretórios de entrada e saída contidos no HDFS. O JobTracker, como único ponto de controle para iniciar os aplicativos MapReduce, decide quantas tarefas TaskTracker e subordinadas devem ser criadas, atribuindo cada subtarefa ao TaskTracker. Cada TaskTracker informa o status e tarefas concluídas de volta ao JobTracker.
Em geral, um nó mestre atua como NameNode e JobTracker e o nó escravo atua como DataNode e TaskTracker.
Agora vamos configurar o Hadoop Cluster no Linux VMs para podermos executar aplicativos MapReduce no Hadoop Cluster.
O Apache Hadoop suporta três modos de implementação:
- Modo Independente: Por padrão, o Hadoop foi configurado para executar em modo independente não distribuído. Esse modo é útil para depurar um aplicativo.
- Modo Pseudodistribuído: O Hadoop também pode executar em um único nó em modo pseudodistribuído. Nesse caso, cada daemon Hadoop executa como um processo Java ™ diferente.
- Modo Totalmente distribuído: O Hadoop é configurado em diferentes hosts e executa como um cluster.
Para configurar o Hadoop em modo independente ou pseudodistribuído, consulte o Web site do Hadoop. Neste artigo, vamos discutir somente a configuração do Hadoop no modo totalmente distribuído.
Neste artigo, vamos precisar de três servidores GNU/Linux; um funcionará como nó mestre e os outros serão nós escravos.
Tabela 1. Informação do servidor
| IP do Servidor | Nome de host do servidor | Função |
| 9.30.210.159 | Vm-9-30-210-159 | Mestre (NameNode e JobTracker) |
| 9.30.210.160 | Vm-9-30-210-160 | Escravo 1 (DataNode e TaskTracker) |
| 9.30.210.161 | Vm-9-30-210-161 | Escravo 2 (DataNode e TaskTracker) |
Cada máquina precisa de um Java SE 6 instalado e também de um Hadoop binário. Consulte a seçãoRecursos para informações adicionais. Este artigo usa o Hadoop versão 0.19.1.
Também é necessário instalar o SSH e executar sshd em cada máquina. Versões populares do Linux como SUSE e RedHat já possuem SSH instalado por padrão.
Atualize o arquivo /etc/hosts e certifique-se que as três máquinas podem estar em contato entre si utilizando IP e nome de host.
Já que o nó mestre do Hadoop se comunica com nós escravos utilizando SSH, deve ser configurada uma conexão autenticada SSH sem passphrase entre mestre e escravos. Em cada máquina, execute o seguinte comando para gerar as chaves RSA públicas e privadas.
ssh-keygen –t rsa |
Isso vai gerar id_rsa.pub no diretório /root/.ssh. Renomeie o id_rsa.pub (59_rsa.pub neste caso) do mestre e copie para os nós escravos. Depois, execute o seguinte comando para adicionar a chave pública do mestre para as chaves autorizadas dos escravos.
cat /root/.ssh/59_rsa.pub >> /root/.ssh/authorized_keys |
Agora tente os nós escravos para SSH. Devem estar conectados sem precisar de senha.
Configure o Hadoop para funcionar em modo totalmente distribuído ao configurar os arquivos de configuração sob o diretório <Hadoop_home>/conf/.
Configure a implementação Hadoop em hadoop-site.xml. Essa configuração substitui as configurações em hadoop-default.xml.
Tabela 2. Propriedade de configuração
| Propriedade | Explicação |
| fs.default.name | URI NameNode |
| mapred.job.tracker | URI JobTracker |
| dfs.replication | Número de replicação |
| hadoop.tmp.dir | Diretório temporário |
hadoop-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://9.30.210.159:9000</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>9.30.210.159:9001</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/tmp/</value>
</property>
</configuration>
|
Configure o arquivo hadoop-env.sh para especificar o JAVA_HOME. Assinale a linha e especifique seu diretório JAVA_HOME.
exporte JAVA_HOME=<JAVA_HOME_DIR> |
Adicione o endereço IP do nó mestre para o arquivo mestre.
9.30.210.159 |
Adicione o endereço IP do nó escravo para o arquivo escravo.
9.30.210.160 9.30.210.161 |
Copie hadoop-site.xml, hadoop-env.sh, mestres e escravos para cada nó escravo; pode utilizar SCP ou outro utilitário de cópia.
Execute o seguinte comando para formatar o sistema de arquivo distribuído Hadoop para inicializar.
<Hadoop_home>/bin/hadoop namenode -format |
Inicie agora o cluster Hadoop utilizandobin/start-all.sh.
A saída do comando indica alguns logs localizados no mestre e nos escravos. Verifique os logs e confira se tudo está correto. Se você falhar em algo, formate o HDFS, limpe o diretório temporário especificado em hadoop-site.xml e comece outra vez.
Visite a seguinte URL para verificar se o nó mestre e os outros nós escravos estão funcionando.
NameNode: http://9.30.210.159:50070 JobTracker: http://9.30.210.159:50030 |
Agora que o Hadoop Cluster está configurado na nuvem, já está pronto para executar aplicativos MapReduce.
Aplicativos MapReduce devem possuir as características de "Map" e "Reduce", o que significa que a tarefa ou trabalho podem ser divididos em pequenas partes para serem processados ao mesmo tempo. Depois, o resultado de cada subtarefa pode ser reduzido para obter a resposta da tarefa original. Um exemplo disso é a busca da palavra-chave Website. As tarefas de busca e extração podem ser divididas em nós escravos delegados, onde cada resultado pode ser agregado e o resultado final está no nó mestre.
Experimente o aplicativo de amostra
O Hadoop vem acompanhado de alguns aplicativos de amostra para teste. Um dele é o contador de palavras, que considera determinadas ocorrências de palavras em diversos arquivos. Execute esse aplicativo para verificar o Hadoop Cluster.
Primeiro, coloque os arquivos de entrada (sob o diretório conf/) no sistema de arquivo distribuído. Contaremos as palavras nesses arquivos.
$ bin/hadoop fs –put conf input |
Depois, execute a amostra, que conta ocorrências de palavras que iniciam com "dfs."
$ bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+' |
A saída do comando indica o processo de Map e Reduce.
Os dois comandos anteriores irão gerar dois diretórios em HDFS, uma "entrada" e uma "saída". Relacione os comandos com:
$ bin/hadoop fs –ls |
Visualize os arquivos que foram extraídos do sistema de arquivo distribuído. É relacionada a ocorrência de palavras que começam com "dfs*" por pares de valor-chave.
$ bin/hadoop fs -cat ouput/* |
Agora, visite o site do JobTracker e conheça um log de tarefa concluído.
Criar um aplicativo Log Analyzer MapReduce
Crie um aplicativo Portal (IBM WebSphere® Portal v6.0) Log Analyzer que possua muito em comum com o aplicativo WordCount no Hadoop. O Analyzer irá passar por todos os arquivos SystemOut*.log do Portal e mostrar quantas vezes os aplicativos do Portal foram iniciados durante um determinado período.
Em um ambiente Portal, todos os logs serão divididos em partes de 5 MB e são bons candidatos a serem analisados por diversos nós ao mesmo tempo.
hadoop.sample.PortalLogAnalyzer.java
public class PortalLogAnalyzer {
public static class Map extends MapReduceBase
implements Mapper<LongWritable, Text, Text, IntWritable> {
private static String APP_START_TOKEN = "Application started:";
private Text application = new Text();
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException {
String line = value.toString();
if(line.indexOf(APP_START_TOKEN) > -1) {
int startIndex = line.indexOf(APP_START_TOKEN);
startIndex += APP_START_TOKEN.length();
String appName = line.substring(startIndex).trim();
application.set(appName);
output.collect(application, new IntWritable(1));
}
}
}
public static class Reduce extends MapReduceBase
implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException {
int sum = 0;
while(values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws IOException {
JobConf jobConf = new JobConf(PortalLogAnalyzer.class);
jobConf.setJobName("Portal Log Analizer");
jobConf.setOutputKeyClass(Text.class);
jobConf.setOutputValueClass(IntWritable.class);
jobConf.setMapperClass(Map.class);
jobConf.setCombinerClass(Reduce.class);
jobConf.setReducerClass(Reduce.class);
jobConf.setInputFormat(TextInputFormat.class);
jobConf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(jobConf, new Path(args[0]));
FileOutputFormat.setOutputPath(jobConf, new Path(args[1]));
JobClient.runJob(jobConf);
}
}
|
Consulte o documento API do site Hadoop para uma completa explicação da API Hadoop. Aqui está uma rápida descrição.
AA classe Map implementa a função map, que segue através de cada linha do arquivo de log e obtém o nome do aplicativo. Coloca então o nome do aplicativo na coleção de saída como par de valor-chave.
A classe Reduce soma todos os valores que possuem a mesma chave (mesmo nome de aplicativo). Portanto, a linha de saída deste aplicativo serão os pares de valor-chave que indicam quantas vezes cada aplicativo foi iniciado no Portal.
A função principal configura a tarefa MapReduce e a executa.
Primeiro, copie o código Java para o nó Mestre e compile. Copie o código Java para o diretório <hadoop_home>/workspace. Compile e arquive em um arquivo Jar, que será executado com o comando hadoop mais tarde.
$ mkdir classes $ javac –cp ../hadoop-0.19.1-core.jar –d classes hadoop/sample/PortalLogAnalyzer.java $ jar –cvf PortalLogAnalyzer.jar –C classes/ . |
Copie seus logs de Portal para workspace/input. Vamos supor que existem diversos arquivos de log que contêm todos os logs de maio de 2009. Coloque esses logs no HDFS.
$ bin/hadoop fs –put workspace/input input2 |
Ao executar o PortalLogAnalyzer, a saída indica o processo de Map e Reduce.
$ bin/hadoop jar workspace/PortalLogAnalizer.jar hadoop.sample.PortalLogAnalizer input2
output2
|
$ bin/hadoop fs –cat output2/* |
Ao visitar o site JobTracker, você verá outra tarefa concluída.
- Computação em Nuvem
com Linux (developerWorks, fevereiro de 2009) análise detalhada da computação em nuvem para explorar
o que isso significa.
- Declaração de arquitetura: Uma
introdução às possibilidades (e riscos) da computação em nuvem (developerWorks,
fevereiro de 2009) apresenta possibilidades e riscos da Computação em Nuvem.
- Computação distribuída
com Linux e Hadoop (developerWorks, dezembro de 2008) apresenta a estrutura Hadoop e mostra por que esta é uma das mais importantes estruturas de computação distribuída baseada em Linux.
- Computação em nuvem com
Amazon Web Services, Parte 3: Servidores sob demanda com EC2 apresenta os servidores virtuais
fornecidos pela Amazon Elastic Compute Cloud (EC2).
- Website Apache
Hadoop fornece documentos API, tutorial, referências de comando, downloads e muito mais.
- Obtenha uma ideia básica emMapReduce.
- Notas de Release Java SE6 fornece informação
sobre instalação de Java SE 6.