Processe seus dados com Apache Pig

Obtenha as informações necessárias de grandes conjuntos de dados com Apache Pig

Apache Pig é uma linguagem de procedimentos de alto nível para consultar grandes conjuntos de dados semiestruturados usando Hadoop e a Plataforma MapReduce. Pig simplifica o uso de Hadoop permitindo consultas parecidas com SQL em um conjunto de dados distribuídos. Explore a linguagem por trás de Pig e descubra seu uso em um simples cluster do Hadoop.

M. Tim Jones, Independent author, Consultor

M. Tim JonesM. Tim Jones é arquiteto de firmware integrado 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.



15/Mar/2012

Entre em contato com o Tim

Tim é um dos nossos autores mais populares e prolíficos. Navegue por todos os artigos do Tim no developerWorks. Confira o perfil dele e comunique-se com ele, outros autores e colegas desenvolvedores na comunidade do developerWorks.

Não é surpreendente que o Hadoop encontre a popularidade de seu ecossistema em crescimento. Uma área em particular que está avançando é a programação de aplicativos Hadoop. Embora a programação de aplicativos Map e Reduce não seja complexa demais, fazer isso requer alguma experiência com o desenvolvimento de software. O Apache Pig altera isto criando uma abstração de linguagem de procedimentos mais simples sobre o MapReduce para expor uma interface mais parecida com Structured Query Language (SQL) para aplicativos Hadoop. Então, em vez de gravar um aplicativo separado do MapReduce, é possível gravar um único script no Pig Latin que é automaticamente paralelizado e distribuído em um cluster.

Exemplo de Pig Latin

Vamos começar com um exemplo simples de Pig e dissecá-lo. Um uso interessante do Hadoop é procurar um grande conjunto de dados para registros que atendam a um determinado critério de procura (conhecido de outra forma no Linux® como grep). a Listagem 1 mostra a simplicidade deste processo no Pig. Dadas as três linhas mostradas, apenas uma é a procura real. A primeira linha simplesmente lê o conjunto de dados de teste (o log de mensagens) em um pacote que representa uma coleção de tuplas. Você filtra esses dados (a única entrada na tupla, representada como $0 ou campo 1) com uma expressão regular, procurando a sequência de caracteres WARN. Por fim, você armazena este pacote, que agora representa todas essas tuplas das mensagens que contêm WARN em um novo arquivo chamado warnings no sistema de arquivo do host.

Listagem 1. Um Script de Pig Latin Simples
messages = LOAD 'messages';
warns = FILTER messages BY $0 MATCHES '.*WARN+.*';
STORE warns INTO 'warnings';

Como você pode ver, este simples script implementa um fluxo simples, mas seria necessário consideravelmente mais código se implementado diretamente no modelo tradicional de MapReduce. Isto torna consideravelmente mais fácil aprender o Hadoop e começar a trabalhar com os dados, comparados ao desenvolvimento bruto.

Vamos agora nos aprofundar um pouco mais na linguagem Pig e depois observar alguns outros exemplos dos recursos de linguagem.


Os fundamentos de Pig Latin

Pig Latin é uma linguagem relativamente simples que executa instruções. Uma statement é uma operação que assume a entrada (como um pacote, que representa um conjunto de tuplas) e emite outro pacote como sua saída. Uma bag é uma relação semelhante à tabela, que você encontrará em um banco de dados relacional (em que as tuplas representam as linhas e as tuplas individuais são feitas de campos).

Um script no Pig Latin geralmente segue um formato específico nos quais os dados são lidos do sistema de arquivos, um número de operações é executado nos dados (transformando-os de uma ou mais formas) e depois a relação resultante é gravada de volta ao sistema de arquivos. É possível ver este padrão em sua forma mais simples (com uma transformação) em a Listagem 1.

Pig possui um rico conjunto de tipos de dados, suportando não só conceitos de alto nível como pacotes, tuplas e mapas como também tipos de dados simples como ints, longs, floats, doubles, chararrays e bytearrays. Com os tipos simples, você encontrará uma variedade de operadores aritméticos (como add, subtract, multiply, divide e module) além de um operador condicional chamado bincond que opera semelhante ao C ternary direto. E, como esperado, um conjunto integral de operadores de comparação, incluindo o reconhecimento de padrões ricos usando expressões regulares.

Todas as instruções Pig Latin operam em relações (e são chamadas de operadores relacionais). Como mostrou a a Listagem 1, há um operador para carregar dados e armazenar dados no arquivo de sistema. Há um meio para FILTRAR dados iterando as linhas de uma relação. Esta funcionalidade é comumente usada para remover dados da relação que não são de fato para operações subsequentes. Como alternativa, se precisar iterar as colunas de uma relação em vez das linhas, é possível usar FOREACH . FOREACH permite operações aninhadas como FILTER quanto a ORDER para transformar os dados durante a iteração.

O operador ORDER fornece a capacidade de classificar uma relação baseada em um ou mais campos. O operador JOIN executa uma união interna ou externa de duas ou mais relações baseadas em campos comuns. O operador SPLIT fornece a capacidade de dividir uma relação em duas ou mais relações baseadas em uma expressão definida pelo usuário. Por fim, o operador GROUP agrupa os dados em uma ou mais relações baseadas em alguma expressão. Tabela 1 fornece uma lista parcial de operadores relacionais no Pig.

Tabela 1. A lista incompleta de operadores relacionais do Pig Latin
OperadorDescrição
FILTERSelecione um conjunto de tuplas de uma relação baseada em uma condição.
FOREACHItere as tuplas de uma relação, gerando uma transformação de dados.
GROUPAgrupe os dados em uma ou mais relações.
JOINUna duas ou mais relações (união interna ou externa).
LOADCarregue os dados a partir do sistema de arquivos.
ORDERClassifique uma relação baseada em um ou mais campos.
SPLITParticione uma relação em duas ou mais relações.
STOREArmazene dados no sistema de arquivos.

Embora esta não seja uma lista exaustiva de operadores no Pig Latin, esta tabela fornece um conjunto extremamente útil de operações para processar grandes conjuntos de dados. É possível aprender mais sobre a completa linguagem do Pig Latin por meio de Recursos, como o Pig possui um conjunto legal de documentação online. Agora, pratique gravar alguns scripts do Pig Latin para entender como esses operadores funcionam na prática.


Obtendo Acesso ao Pig

Em artigos anteriores no Hadoop, eu usei a abordagem de instalar e configurar o Hadoop como um pacote. Mas Cloudera facilitou ainda mais o uso de Hadoop ao compactá-lo com Linux como um dispositivo virtual. E apesar de ser um grande download, a máquina virtual (VM) é pré-construída e configurada não só com o Hadoop, mas também o Apache Hive e o Pig. Então, com um download e um hypervisor tipo 2 livremente disponível (VirtualBox ou Kernel-based Virtual Machine [KVM]), você tem todo um ambiente Hadoop que é pré-configurado e pronto para funcionar.


Deixando o Hadoop e o Pig prontos para execução

Após fazer download de seu arquivo VM específico, será necessário criar uma VM para seu hypervisor particular. Na Recursos), você encontrará instruções passo a passo sobre como fazer isto.

Memória da VM Cloudera

Descobri que a VM não funcionaria adequadamente com 1GB de memória designada a ela. Duplicar ou triplicar essa distribuição de memória resulta em operação normal (isto é, sem problemas de espaço™ de heap Java).

Uma vez que criar sua VM, é possível iniciá-la por meio de VirtualBox, que inicializa o kernel Linux e inicia todos os daemons necessários de Hadoop. Com a inicialização completa, comece criando um terminal no qual comunicar-se com o Hadoop e o Pig.

É possível usar o Pig em qualquer um dos modos. O primeiro é o modo Local, que não possui dependência no Hadoop ou no Hadoop Distributed File System (HDFS), onde tudo é executado em uma única máquina virtual Java (JVM) no contexto do sistema de arquivos local. O outro modo é Mapreduce, que usa um sistema de arquivos Hadoop e cluster.

Pig em Modo Local

Para o modo Local, simplesmente inicie o Pig e especifique o modo Local com exectype . Fazendo isso, leva você ao shell Grunt, que permite inserir instruções Pig interativamente:

$ pig -x local
...
grunt>

A partir daqui, é possível codificar interativamente seu script do Pig Latin, vendo o resultado após cada operador. Retorne à a Listagem 1 e tente este script (consulte a Listagem 2). Observe que, neste caso, em vez de armazenar seus dados em um arquivo, você simplesmente faz dump deles como um conjunto de relações. Você perceberá na saída modificada que cada linha de log (que corresponde ao critério de procura definido pelo FILTER) é a própria relação (ligada por parênteses [()]).

Listagem 2. Usando Pig interativamente em modo Local
grunt> messages = LOAD '/var/log/messages';
grunt> warns = FILTER messages BY $0 MATCHES '.*WARN+.*';
grunt> DUMP warns
...
(Dec 10 03:56:43 localhost NetworkManager: <WARN> nm_generic_enable_loopback(): error ...
(Dec 10 06:10:18 localhost NetworkManager: <WARN> check_one_route(): (eth0) error ...
grunt>

Se tiver especificado o operador STORE , ele teria gerado seus dados em um diretório do nome especificado (não um arquivo regular simples).

Pig em modo Mapreduce

Para o modo Mapreduce, primeiro, você deve garantir que o Hadoop esteja em execução. A forma mais fácil de fazer isso é executar uma operação de lista de arquivo na raiz da árvore de sistema de arquivos Hadoop, como na A Listagem 3.

Listagem 3. Testando a Disponibilidade do Hadoop
$ hadoop dfs -ls /
Found 3 items
drwxrwxrwx   - hue    supergroup          0 2011-12-08 05:20 /tmp
drwxr-xr-x   - hue    supergroup          0 2011-12-08 05:20 /user
drwxr-xr-x   - mapred supergroup          0 2011-12-08 05:20 /var
$

Como mostrado, este código resultará em uma listagem de um ou mais arquivos, se o Hadoop estiver executando com sucesso. Agora, vamos testar o Pig. Comece iniciando o Pig e depois altere o diretório para sua raiz hdfs para determinar se é possível ver o que você viu externamente no HDFS (consulte a Listagem 4).

Listagem 4. Testando o Pig
$ pig
2011-12-10 06:39:44,276 [main] INFO  org.apache.pig.Main - Logging error messages to...
2011-12-10 06:39:44,601 [main] INFO  org.apache.pig.... Connecting to hadoop file \
system at: hdfs://0.0.0.0:8020
2011-12-10 06:39:44,988 [main] INFO  org.apache.pig.... connecting to map-reduce \
job tracker at: 0.0.0.0:8021
grunt> cd hdfs:///
grunt> ls
hdfs://0.0.0.0/tmp     <dir>
hdfs://0.0.0.0/user    <dir>
hdfs://0.0.0.0/var     <dir>
grunt>

Até então, tudo bem. É possível ver seu sistema de arquivo Hadoop no Pig, então agora, tente ler alguns dados nele a partir de seu sistema de arquivo host local. Copie um arquivo do local para HDFS pelo Pig (consulte Listagem 5).

Listagem 5. Obtendo alguns dados de teste
grunt> mkdir test
grunt> cd test
grunt> copyFromLocal /etc/passwd passwd
grunt> ls
hdfs://0.0.0.0/test/passwd<r 1> 1728

Em seguida, com seus dados de teste agora seguros no sistema de arquivos Hadoop, é possível tentar outro script. Observe que é possível cat o arquivo no Pig para ver seu conteúdo (apenas para ver se está lá). Neste exemplo particular, identifique o número de shells especificados para usuários no arquivo passwd (a última coluna em passwd).

Para começar, é necessário carregar seu arquivo passwd do HDFS em uma relação do Pig. Você faz isso antes de usar o operador LOAD , mas, neste caso, deseja analisar os campos do arquivo de senha até seus campos individuais. Neste exemplo, especifique a função PigStorage , que permite indicar o caractere delimitador para o arquivo (neste caso, um caractere de ponto e vírgula [:]). Você também especifica os campos individuais (ou o esquema) com a palavra-chave AS , incluindo seus tipos individuais (consulte Listagem 6).

Listagem 6. Lendo seu arquivo em uma relação
grunt> passwd = LOAD '/etc/passwd' USING PigStorage(':') AS (user:chararray, \
passwd:chararray, uid:int, gid:int, userinfo:chararray, home:chararray, \
shell:chararray);
grunt> DUMP passwd;
(root,x,0,0,root,/root,/bin/bash)
(bin,x,1,1,bin,/bin,/sbin/nologin)
...
(cloudera,x,500,500,,/home/cloudera,/bin/bash)
grunt>

Em seguida, use o operador GROUP para agrupar as tuplas nesta relação baseada em seu shell (consulte na Listagem 7). Faça dump disto novamente, apenas para ilustrar o resultado do GROUP direto. Observe que há tuplas agrupadas (como em um pacote interno) sob seu shell particular que está sendo usado (com o shell especificado no início).

Listagem 7. Agrupando as tuplas como uma função de seu shell
grunt> grp_shell = GROUP passwd BY shell;
grunt> DUMP grp_shell;
(/bin/bash,{(cloudera,x,500,500,,/home/cloudera,/bin/bash),(root,x,0,0,...), ...})
(/bin/sync,{(sync,x,5,0,sync,/sbin,/bin/sync)})
(/sbin/shutdown,{(shutdown,x,6,0,shutdown,/sbin,/sbin/shutdown)})
grunt>

Mas o seu desejo é uma contagem dos shells exclusivos especificados no arquivo passwd. Então, você usa o operador FOREACH para iterar cada tupla em seu grupo para COUNT o número que aparece (consulte Listagem 8 ).

Listagem 8. Agrupando os resultados com contagens para cada shell
grunt> counts = FOREACH grp_shell GENERATE group, COUNT(passwd);
grunt> DUMP counts;
...
(/bin/bash,5)
(/bin/sync,1)
(/bin/false,1)
(/bin/halt,1)
(/bin/nologin,27)
(/bin/shutdown,1)
grunt>

Observação: Para executar este código como um script, basta digitar o script em um arquivo e, depois, executá-lo como pig myscript.pig.


Operadores de Diagnóstico

O Pig suporta um número de operadores diagnósticos que podem ser usados para depurar scripts do Pig. Como você viu nos exemplos de script anteriores, o operador DUMP é inestimável para visualizar não só dados, mas o esquema dos dados em si. Também é possível usar o operador DESCRIBE para gerar um formato detalhado do esquema de uma relação (campo e tipo).

O operador EXPLAIN é totalmente um pouco mais complexo, porém útil. Para uma determinada relação, é possível usar EXPLAIN para visualizar como os operadores físicos estão agrupados em tarefas de mapa e redução (isto é, como os dados são derivados).

Tabela 2 fornece uma lista de operadores de diagnóstico no Pig Latin e sua descrição.

Tabela 2. Os operadores de diagnóstico do Pig Latin
OperadorDescrição
DESCRIBERetorne o esquema de uma relação.
DUMPFaça dump do conteúdo de uma relação para a tela.
EXPLAINExiba os panosde execução MapReduce.

Funções Definidas pelo Usuário

Embora o Pig seja eficiente e útil no contexto explorado neste artigo, ele pode ser ainda mais eficiente com as funções definidas pelo usuário (UDFs). Os scripts do Pig podem usar funções definidas para operações como a análise de dados de entrada ou formatação de dados de saída e até mesmo de operadores. As UDFs são gravadas na linguagem Java e permitem que o Pig suporte processamento customizado. As UDFs são a forma de estender o Pig em seu domínio de aplicativo particular. É possível aprender mais sobre o desenvolvimento de UDFs em Recursos).


Usuários Pig

Como você pode ver neste breve artigo, o Pig é uma ferramenta eficiente para consulta de dados em um cluster Hadoop. É tão eficiente que o Yahoo! estima que entre 40% e 60% de suas cargas de trabalho do Hadoop sejam geradas de scripts do Pig Latin. Com 100.000 CPUs no Yahoo! e, aproximadamente, 50% em execução no Hadoop, são muitos pigs por todo o lado.

Mas o Yahoo! não é a única organização que aproveita o Pig. Você encontrará o Pig no Twitter (processando logs, minerando dados de tweet), na AOL e no MapQuest (para análises e processamento de dados em lote), e no LinkedIn, onde o Pig é usado para descobrir pessoas que possa conhecer. O Ebay está, segundo boatos, usando o Pig para otimização de procura e adyard usa o Pig em quase metade de seu sistema recomendado.


Avançando

Nada menos que um livro pode enumerar o poder por trás do Pig para processamento de grandes dados. O Pig facilita, mesmo para não desenvolvedores, executar grandes processamentos de dados em um cluster Hadoop. O Pig foi originalmente desenvolvido pelo Yahoo! em 2006 e logo após moveu-se para o Apache Software Foundation para que pudesse ser usado globalmente. Esse movimento foi um resultado do reconhecimento dos pesquisadores do Yahoo! sobre o poder que o Pig forneceu aos não desenvolvedores. À medida que o Hadoop cresce em termos de popularidade como uma infraestrutura, é o ecossistema do Hadoop que alterará a face dos grandes dados e seu uso constantemente crescente.

Recursos

Aprender

  • O texto Web site Apache é a fonte para informações sobre o Pig, incluindo notícias atuais, o software mais recente, como iniciar e como se envolver.
  • O método A VM Demo do Hadoop é de longe a forma mais simples de obter uma instância do Hadoop em execução. A VM contém tudo que precisa, incluindo o Hadoop, Hive e Pig em um sistema operacional Linux CentOS.
  • O texto VM de Treinamento Cloudera é uma ótima forma de iniciar com o Hadoop. Ela minimiza a quantia de configuração necessária e permite iniciar o processamento de conjuntos de dados facilmente com o Hadoop e o Pig.
  • Dispositivos Virtuais e o Open Virtualization Format (M. Tim Jones, developerWorks, outubro de 2009) explora o uso de dispositivos virtuais como uma nova forma de entrega para software. Os dispositivos virtuais permitem a distribuição de software pré-configurado (com o sistema operacional) como uma VM.
  • O Pig possui um grande número de recursos online, variando de manuais de referência, livros de receita e outros recursos. O Pig também possui dois manuais bem escritos (parte 1 quanto a parte 2), a livro de receitas de script, e um Guia UDF.
  • O Pig possui uma grande população de usuários que consiste em propriedades proeminentes da web. Saiba mais sobre a variedade de empresas da web que usam o Pig no Apache PoweredBy .
  • Na zona Linux do developerWorks, encontre vários artigos de instruções e tutoriais, bem como downloads, fóruns de discussão e muitos outros recursos para desenvolvedores e administradores Linux.
  • O texto zona de software livre do developerWorks fornece muitas informações sobre ferramentas de software livre e de como utilizar tecnologias de software livre.
  • Fique por dentro dos eventos técnicos e webcasts do developerWorks com ênfase em uma série de produtos IBM e assuntos relacionados ao segmento de mercado de TI.
  • Participe de um briefing gratuito do developerWorks Live! para se atualizar rapidamente sobre produtos e ferramentas IBM e tendências do segmento de mercado de TI.
  • Acompanhe as demos on demand do developerWorks , que abrangem desde demos de instalação e configuração de produtos para iniciantes até funcionalidades avançadas para desenvolvedores experientes.
  • Siga o Tim no Twitter. Também é possível seguir o DeveloperWorks no Twitter, ou inscreva-se em um feed de tweets sobre Linux no developerWorks.

Obter produtos e tecnologias

  • Avalie produtos IBM da maneira que for melhor para você: faça download da versão de testes de um produto, avalie um produto on-line, 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

  • Participe da comunidade do developerWorks. Entre em contato com outros usuários do developerWorks e explore os blogs, fóruns, grupos e wikis voltados para desenvolvedores.

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=801798
ArticleTitle=Processe seus dados com Apache Pig
publish-date=03152012