Prática: Processar Logs com o Apache Hadoop

Extrair dados úteis de logs usando o Hadoop em sistemas Linux típicos

Logs são parte essencial de qualquer sistema de computação, suportando recursos que vão de auditorias a gerenciamento de erro. À medida que os logs crescem e o número de origens de log aumenta (como em ambientes em nuvem), é necessário um sistema escalável para processá-los de forma eficiente. Esta sessão prática explora logs de processamento com o Apache Hadoop a partir de um sistema Linux típico.

M. Tim Jones, Independent author, Consultor

M. Tim JonesM. Tim Jones é arquiteto de firmware embarcado e autor de Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (agora em sua segunda edição), AI Application Programming (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Seu conhecimento em engenharia varia do desenvolvimento de kernels para naves espaciais geossíncronas até a arquitetura de sistemas embarcados e o desenvolvimento de protocolos de rede. Tim é arquiteto de plataforma da Intel e autor em Longmont, Colorado.



10/Ago/2012

Os logs vêm em todos os formatos, mas, à medida que aplicativos e infraestruturas crescem, o resultado é uma quantia massiva de dados distribuídos úteis para mineração. De servidores da web e de correio a logs de kernel e de inicialização, os servidores modernos retêm um rico conjunto de informações. Quantias massivas de dados distribuídos são uma aplicação perfeita para o Apache Hadoop, assim como são arquivos de log — de dados textuais estruturados e ordenados por horário.

É possível usar processamento de log para extrair diversas informações. Um de seus usos mais comuns é extrair erros ou contar a ocorrência de algum evento dentro de um sistema (como falhas de logins). Também é possível extrair alguns tipos de dados de desempenho, como conexões ou transações por segundo. Outras informações úteis incluem a extração (mapa) e criação de vistas de sites (redução) de um log da web. Essa análise também pode suportar a detecção de visitas de usuários exclusivas, além de estatísticas de acesso a arquivo.

Visão geral

Estes exercícios proporcionam prática em:

  • Ativar um ambiente Hadoop simples e colocá-lo em execução
  • Interagir com o sistema de arquivos do Hadoop (HDFS)
  • Escrever um aplicativo MapReduce simples
  • Escrever uma consulta de filtragem do Apache Pig
  • Escrever uma consulta acumulativa do Pig

Pré-requisitos

Para aproveitar estes exercícios ao máximo, é necessário ter um conhecimento de trabalho básico do Linux®. também é útil ter algum conhecimento de dispositivos virtuais para ativar um ambiente simples.


Exercício 1. Ativar um ambiente Hadoop simples e colocá-lo em execução

Há duas maneiras de ativar o Hadoop e colocá-lo em execução. A primeira é instalar o software Hadoop e, em seguida, configurá-lo para seu ambiente (o caso mais simples é uma instância de nó único, na qual todos os daemons são executados em um único nó). Consulte Processamento de Dados Distribuídos com Hadoop, Parte 1: Introdução para obter detalhes.

A segunda maneira, e a mais simples, é com o uso da VM Demo do Hadoop da Cloudera (que contém uma imagem do Linux e uma instância do Hadoop configurada). A máquina virtual (VM) da Cloudera é executada no VMware, em Kernel-based Virtual Machine (KVM) ou no Virtualbox.

Escolha um dos métodos e conclua a instalação. Em seguida, execute as tarefas a seguir:

  • Verifique se o Hadoop está em execução emitindo um comando ls do HDFS.

Exercício 2. Interagir com o HDFS

O HDFS é um sistema de arquivos de uso específico que gerencia dados e réplicas em um cluster do Hadoop, distribuindo-os a nós de cálculo para processamento eficiente. Apesar de o HDFS ser de uso específico, ele implementa muitos dos comandos típicos do sistema de arquivos. Para recuperar informações da ajuda para o Hadoop, emita o comando hadoop dfs. Execute as tarefas a seguir:

  • Crie um subdiretório de teste no HDFS.
  • Mova um arquivo do sistema de arquivos local para o subdiretório do HDFS usando copyFromLocal.
  • Para obter crédito extra, visualize o arquivo no HDFS usando um comando hadoop dfs .

Exercício 3. Escrever um aplicativo MapReduce simples

Conforme demonstrado no Processamento de Dados Distribuídos com Hadoop, Parte 3: Desenvolvimento de aplicativo, escrever um aplicativo de mapa e redução de contagem de palavras é simples. Usando o exemplo do Ruby demonstrado naquele artigo, desenvolva um aplicativo Python de mapa e redução e execute-o em um conjunto de dados de amostra. Lembre-se de que o Hadoop classifica a saída de mapa de forma que palavras semelhantes apareçam próximas, fornecendo uma otimização útil para o redutor.


Exercício 4. Escrever uma consulta simples do Pig

Como você viu no Processe seus dados com Apache Pig, o Pig permite desenvolver scripts simples que são convertidos em aplicativos MapReduce. Neste exercício, você extrai todas as entradas de log (de /var/log/messages) que contêm a palavra kernel: e a palavra terminating.

  • Crie um script que extraia todas as linhas do log com os critérios predefinidos.

Exercício 5. Escrever uma consulta de agregação do Pig

Mensagens de log são geradas por diversas fontes no kernel Linux (como kernel ou dhclient). Neste exemplo, o objetivo é descobrir as várias fontes que geram mensagens de log e a sua quantidade por fonte.

  • Crie um script que conte o número de mensagens de log para cada fonte.

Soluções dos exercícios

A saída específica depende de sua instalação e configuração específicas do Hadoop.


Solução para o Exercício 1. Ativar um ambiente Hadoop simples e colocá-lo em execução

No Exercício 1, um comando ls é executado no HDFS. A Listagem 1 ilustra a solução adequada.

Listagem 1. Executando uma operação ls no HDFS
$ hadoop dfs -ls /
drwxrwxrwx    - hue       supergroup           0 2011-12-10 06:56 /tmp
drwxr-xr-x    - hue       supergroup           0 2011-12-08 05:20 /user
drwxr-xr-x    - mapred    supergroup           0 2011-12-08 10:06 /var
$

Mais ou menos arquivos podem estar presentes, dependendo do uso.


Solução para o Exercício 2. Interagir com o HDFS

No Exercício 2, um subdiretório é criado no HDFS um arquivo é copiado para ele. Observe que os dados de teste são criados movendo o buffer de mensagem de kernel para um arquivo. Para obter crédito extra, visualize o arquivo no HDFS usando o comando cat (consulte a Listagem 2).

Listagem 2. Manipulando o HDFS
$ dmesg > kerndata
$ hadoop dfs -mkdir /test
$ hadoop dfs -ls /test
$ hadoop dfs -copyFromLocal kerndata /test/mydata
$ hadoop dfs -cat /test/mydata
Linux version 2.6.18-274-7.1.el5 (mockbuild@builder10.centos.org)...
...
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
$

Solução para o Exercício 3. Escrever um aplicativo MapReduce simples

No Exercício 3, é criado um aplicativo MapReduce simples de contagem de palavras em Python. Python é, na verdade, uma linguagem excelente na qual implementar o exemplo de contagem de palavras. É possível localizar um breve relatório útil sobre Python MapReduce em Writing a Hadoop MapReduce Program in Python por Michael G. Noll.

Este exemplo supõe que as etapas do exercício 2 tenham sido executadas (para absorver dados no HDFS). A Listagem 3 fornece o aplicativo de mapa.

Listagem 3. Aplicativo de mapa no Python
#!/usr/bin/env python

import sys

for line in sys.stdin:
    line = line.strip()
    words = line.split()
    for word in words:
        print '%s\t1' % word

A Listagem 4 fornece o aplicativo de redução.

Listagem 4. O aplicativo de redução em Python
#!/usr/bin/env python

from operator import itemgetter
import sys

last_word = None
last_count = 0
cur_word = None

for line in sys.stdin:
    line = line.strip()

    cur_word, count = line.split('\t', 1)

    count = int(count)

    if last_word == cur_word:
        last_count += count
    else:
        if last_word:
           print '%s\t%s' % (last_word, last_count)
           last_count = count
        last_word = cur_word

if last_word == cur_word:
    print '%s\t%s' % (last_word, last_count)

A Listagem 5 ilustra o processo para chamar o exemplo Python MapReduce no Hadoop.

Listagem 5. Testando o Python MapReduce com o Hadoop
$ hadoop jar /usr/lib/hadoop-0.20/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
  -file pymap.py -mapper pymap.py -file pyreduce.py -reducer pyreduce.py \
  -input /test/mydata -output /test/output
...
$ hadoop dfs -cat /test/output/part-00000
...
write	3
write-combining	2
wrong.	1
your	2
zone:	2
zonelists.	1
$

Solução para o Exercício 4. Escrever uma consulta simples do Pig

No Exercício 4, são extraídas as entradas de log de /var/log/messages que contêm a palavra kernel: e a palavra terminating. Neste caso, o Pig é usado em modo local para consultar o arquivo local (consulte a Listagem 6). Carregue o arquivo em uma relação (log) do Pig, filtre seu conteúdo para somente mensagens com kernel e, em seguida, filtre essa relação resultante para mensagens com terminating.

Listagem 6. Extraindo todas as mensagens de log com kernel + terminating
$ pig -x local
grunt> log = LOAD '/var/log/messages';
grunt> logkern = FILTER log BY $0 MATCHES '.*kernel:.*';
grunt> logkernterm = FILTER logkern BY $0 MATCHES '.*terminating.*';
grunt> dump logkernterm
...
(Dec  8 11:08:48 localhost kernel: Kernel log daemon terminating.)
grunt>

Solução para o Exercício 5. Escrever uma consulta de agregação do Pig

No Exercício 5, extraia as fontes de logs e as contagens de mensagens de log de /var/log/messages. Neste caso, crie um script para a consulta e execute-o por meio do modo local do Pig. Na Listagem 7, carregue o arquivo e analise a entrada usando um espaço como um delimitador. Em seguida, designe os campos de cadeia de caractere delimitados para seus elementos denominados. Use o operador GROUP para agrupar as mensagens por sua fonte e, em seguida, use os operadores FOREACH e COUNT para agregar seus dados.

Listagem 7. Script de fontes de logs e de contagens para /var/log/messages
log = LOAD '/var/log/messages' USING PigStorage(' ') AS (month:chararray, \
  day:int, time:chararray, host:chararray, source:chararray);
sources = GROUP log BY source;
counts = FOREACH sources GENERATE group, COUNT(log);
dump counts;

O resultado é mostrado executado na Listagem 8.

Listagem 8. Executando seu script de fontes de logs
$ pig -x local logsources.pig
...
(init:,1)
(gconfd,12)
(kernel:,505)
(syslogd,2)
(dhclient:,91)
(localhost,1168)
(gpm[2139]:,2)
[gpm[2168]:,2)
(NetworkManager:,292)
(avahi-daemon[3345]:,37)
(avahi-daemon[3362]:,44)
(nm-system-settings:,8)
$

Recursos

Aprender

Obter produtos e tecnologias

  • VM Demo do Hadoop da Cloudera (maio de 2012): Comece a usar com o Apache Hadoop, com um conjunto de máquinas virtuais que incluam uma imagem do Linux e uma instância pré-configurada do Hadoop.
  • Avalie produtos IBM da maneira que for melhor para você: faça download da versão de teste de um produto, avalie um produto online, use-o em um ambiente de nuvem ou passe algumas horas na SOA Sandbox aprendendo a implementar Arquitetura Orientada a Serviços de modo eficiente.

Discutir

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, Software livre
ArticleID=829650
ArticleTitle=Prática: Processar Logs com o Apache Hadoop
publish-date=08102012