Computação em nuvem com Linux e Apache Hadoop

Muitas empresas como IBM®, Google, VMWare e Amazon forneceram produtos e estratégias para computação em nuvem. Esse artigo mostra como usar o Apache Hadoop para construir uma estrutura MapReduce para fazer um Hadoop Cluster e como criar uma amostra de aplicativo MapReduce que execute em Hadoop. Você também vai aprender como configurar tarefas que consomem tempo e disco na nuvem.

Yi Ming Huang, Software Engineer, IBM  

Yi Ming Huang is a software engineer working on Lotus ActiveInsight in the China Development Lab. He has experience on Portlet/Widget-related Web development and is interested in REST, OSGi, and Spring technologies.



Zhao Hui Nie, Software Engineer, IBM

Zhao Hui Nie is a software engineer with the IBM WebSphere Dashboard Framework development team in the IBM China Software Development Lab. He designs and develops basic builders for WebSphere Dashboard Framework. You can reach him at niezh@cn.ibm.com.



10/Nov/2009

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.


Amazon EC2

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.


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

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.

HDFS

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.

JobTracker e TaskTracker

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.


Configure o Apache Hoop

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.

Preparar o ambiente

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 ServidorNome de host do servidorFunçã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.

Configurar comunicações

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.

Configurar o nó mestre

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
PropriedadeExplicaçã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

Configure os nós escravos

Copie hadoop-site.xml, hadoop-env.sh, mestres e escravos para cada nó escravo; pode utilizar SCP ou outro utilitário de cópia.

Formatar o HDFS

Execute o seguinte comando para formatar o sistema de arquivo distribuído Hadoop para inicializar.

	<Hadoop_home>/bin/hadoop namenode -format

Verifique o Hadoop Cluster

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.

Agora que o Hadoop Cluster está configurado na nuvem, já está pronto para executar aplicativos MapReduce.


Crie um aplicativo 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
publicclass PortalLogAnalyzer {
	
publicstaticclass Map extends MapReduceBase 
	implements Mapper<LongWritable, Text, Text, IntWritable> {

	privatestatic String APP_START_TOKEN = "Application started:";
	 private Text application = new Text();
		
	 publicvoid 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));
	    }
	}
}
	
publicstaticclass Reduce extends MapReduceBase 
	    implements Reducer<Text, IntWritable, Text, IntWritable> {
		
	publicvoid 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));
	}
}
	
publicstaticvoid 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.

Execute o PortalLogAnalyzer

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.

Recursos

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=445845
ArticleTitle=Computação em nuvem com Linux e Apache Hadoop
publish-date=11102009