52
By Ivanilton Polato e Frank Helbert. These slides are licensed under the Atribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil Licence (CC BY-NC-SA 3.0) Ivanilton Polato Frank Helbert UTFPR Câmpus Campo Mourão Doutorado em Ciência da Computação DINTER IME/USP-UTFPR Abril/2012 Rodando um recomendador

Rodando um Recomendador no Hadoop usando Mahout

Embed Size (px)

Citation preview

Page 1: Rodando um Recomendador no Hadoop usando Mahout

By Ivanilton Polato e Frank Helbert. These slides are licensed under theAtribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil Licence (CC BY-NC-SA 3.0)

Ivanilton Polato Frank HelbertUTFPR Câmpus Campo Mourão

Doutorado em Ciência da Computação

DINTER IME/USP-UTFPR

Abril/2012

Rodando um recomendador

Page 2: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 2

Motivações atuais!

Grandes quantidades (massivas) de dadosDemoram MUITO para processar serialmente!

Máquinas individuais falham!Mais máquinas juntas... probabilidade maior!O número de nós em um cluster não é constante!

Computação nas nuvensDisponibilidade de computação e dados

Escalabilidade de aplicaçõesComputação sob demanda

Page 3: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 3

Histórico

Fonte: Evert Lammerts (SARA.nl)

* http://nutch.apache.org/** http://labs.google.com/papers/mapreduce.html http://labs.google.com/papers/gfs.html

Page 4: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 4

HistóricoFev/03 – Primeira biblioteca Map/Reduce na Google Out/03 – Artigo sobre GFSDez/04 – Artigo sobre Map ReduceDez/05 – Doug Cutting implementa MR e DFS no NutchFev/06 – Hadoop se torna um projeto oficial da Apache, Doug Cutting é contratado pela Yahoo!, que adota o Hadoop Abr/07 – Yahoo! roda Hadoop em um cluster de 1000 nósJan/08 – Hadoop se transforma em um projeto principal da ApacheDez/11 – Apache disponibiliza versão 1.0.0

Page 5: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 5

O que é Apache Hadoop?

Framework para computação distribuídaUsado em clusters/grades computacionais

Milhares de nós

Hardware comum (Commodity cluster computing)

Petabytes de dados

Open Source (licença Apache)

Java

Inspirado originalmente pelo GFS e MapReduce da Google

Page 6: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 6

Suposições do Projeto

Os dados que serão processados não cabem em um nó

Cada nó é hardware comum

Falhas acontecem

Mover dados é caro

Mover computação é barato

Computação distribuída é fácil

Page 7: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 7

Ideias

Sistemas de arquivos distribuído

Replicação interna

Recuperação de falhas automáticas

Mover computação para os dados

Escrever programas que são fáceis de distribuir

Suposições do Projeto

Page 8: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 8

Composição do Apache Hadoop

Núcleo composto por:Hadoop Common: Bibliotecas principais

HDFS: Sistema de arquivos

MapReduce: Paradigma de programação

Projetos relacionados:HBase: BD distribuído e escalável

Hive e Pig: infraestrutura de DW

Na web: http://hadoop.apache.org/

Page 9: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 9

Possibilidades de uso

System Data

...WEB ANALYTICS...

Page 10: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 10

Quem usa?

Lista completa: http://wiki.apache.org/hadoop/PoweredBy

Page 11: Rodando um Recomendador no Hadoop usando Mahout

By Ivanilton Polato e Frank Helbert. These slides are licensed under theAtribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil Licence (CC BY-NC-SA 3.0)

HDFSHadoop Distributed File System

Page 12: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 12

HDFS: Hadoop Distributed File System

Sistema de arquivos distribuídoGrande ordem de 10k nós

Milhões de arquivos

Projetado para hardware de baixo custoRedundância por replicação

Tolerância a falhas e recuperação

Otimizado para processamento em loteLocalização dos dados exposta

Grande largura de banda associada

Page 13: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 13

HDFS: Hadoop Distributed File System

Coerência dos dadosModelo “write-once-ready-many”

Arquivos existentes sofrem apenas operações de “append”

Arquivos quebrados em pedaços (blocos)Variam de 64mb (padrão) a 256mb

Blocos distribuídos pelos nós (um arquivo é dividido em N blocos e armazenado em M nós)

Blocos são replicados e as replicações distribuídas

Page 14: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 14

Todos os comandos são executados com o prefixo hadoop fs

Principais comandos similares unix/linux:ls »» lista arquivos

put »» envia arquivos ao fs (origem, destino)

get »» copia arquivos do fs (origem, destino)

rm »» remove arquivos do fs

rmr »» remove arquivos e diretórios do fs

cat »» mostra o conteúdo de arquivo no fs

HDFS: Hadoop Distributed File System

Page 15: Rodando um Recomendador no Hadoop usando Mahout

By Ivanilton Polato e Frank Helbert. These slides are licensed under theAtribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil Licence (CC BY-NC-SA 3.0)

MapReduce

Page 16: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 16

A ideia

A ideia do paradigma de programação Map e Reduce não é novaProvavelmente 40+ anos!

No Hadoop é a parte do framework responsável pelo processamento distribuído (paralelo) de grandes conjuntos de dados.

Provê um modelo de programação

Usa padrões já conhecidos:cat | grep | sort | unique > file

input | map | shuffle | reduce > output

Page 17: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 17

A natureza do MapReduce

Map em programação funcionalmap({1,2,3,4}, (x2)) {2,4,6,8}Todos os elementos são processados por um método e os elementos não afetam uns aos outros

Reduce em programação funcionalreduce({1,2,3,4}, (x)) {24} Todos elementos na lista são processados juntos

Tanto em Map quanto em Reduce:A entrada é fixa (imutável), e a saída é uma nova lista

Page 18: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 18

Continuando...

O paradigma MapReduce é adequado para trabalhar com grandes quantidades de dadosRealiza computação sobre os dados (pouca movimentação de dados)

Utiliza os blocos armazenados no DFS, logo não necessita divisão dos dados

Lida com o paralelismoUm Map por bloco, se possível

Page 19: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 19

MapReduce no Hadoop

A função Map atua sobre um conjunto de entrada com chaves e valores, produzindo uma lista de chaves e valoresA função Reduce atua sobre os valores intermediários produzidos pelo Map para, normalmente, agrupar os valores e produzir a saída

Input Output

map <k1, v1> lista(<k2, v2>)

reduce <k2, lista(v2)> lista(<k3, v3>)

Page 20: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 20

Exemplos: Word Count

Lê arquivos texto e conta a frequência das palavrasEntrada: arquivos texto

Saída: arquivo textoCada linha: palavra, separador (tab), quantidade

Map: gera pares de (palavra, quantidade)

Reduce: para cada palavra, soma as quantidades

Page 21: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 21

Map e Reduce (Pseudo-código)map(String key, String value):

// key: document name

// value: document contents

for each word w in value:

EmitIntermediate(w, “1”);

reduce(String key, Iterator values):

// key: a word

// values: a list of counts

int result = 0;

for each v in values:

result += ParseInt(v);

Emit(AsString(result));

Page 22: Rodando um Recomendador no Hadoop usando Mahout

By Ivanilton Polato e Frank Helbert. These slides are licensed under theAtribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil Licence (CC BY-NC-SA 3.0)

Funcionamentoem um cluster

Page 23: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 23

MapReduce: Simplified Data Processing on Large Clusters Jeffrey Dean e Sanjay Ghemawat ACM, 2008

Page 24: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 24

HDFS: NameNode & DataNodes

NameNode (NN)Gerencia o namespace do sistema de arquivosMapeia nomes de arquivos para blocos

Mapeia blocos para DataNodes

Gerenciamento de replicação

DataNode (DN)Servidor de blocos que armazenaDados no sistema de arquivos local

Metadados dos blocos (hash)

Disponibiliza metadados para clientes

Fonte: Evert Lammerts (SARA.nl)

Page 25: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 25

MapReduce: JobTracker & TaskTrackers

JobTrackerControla os metadadosStatus de um jobStatus de Tasks nos TTsDecide o escalonamento

TaskTrackersSolicita trabalho do JTBusca código para executar do DFSAplica configurações específicas dos jobsComunicam-se com o JT nas tasksEnviar saídas, atualizações de tasks, matar tasks, ...

Fonte: Evert Lammerts (SARA.nl)

Page 26: Rodando um Recomendador no Hadoop usando Mahout

By Ivanilton Polato e Frank Helbert. These slides are licensed under theAtribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil Licence (CC BY-NC-SA 3.0)

Mahout

Page 27: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 27

Apache Mahout

É uma biblioteca de algoritmos de aprendizagem de máquina

É um projeto da Apache Software FoundationSoftware Livre – Licença Apache

Bem documentado

Contribuição da Comunidade

Principal objetivo:Ser escalável para manipular volume gigantesco

de dados

Page 28: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 28

Apache Mahout

Trabalha com: Matrizes e Vetores, Estruturas esparsas e densas, Agrupamento, Cobertura, K-Means, Análise densidade de funções, Filtragem colaborativa, Taste – motor de filtragem

Mahout pode ser usado com o Hadoop explorando a escalabilidade para processar os dados

Page 29: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 29

Gerando recomendações

1. Construir uma matriz que relaciona os itensMatriz de co-ocorrência

Computa o número de vezes que cada par de itens aparecem juntos na lista de preferências de algum usuário

Se existem 9 usuários que expressam preferência pelos itens X e Y, então X e Y co-ocorrem 9 vezes

Co-ocorrência é como similaridade, quanto mais dois itens aparecem juntos, mais provável que sejam similares

Page 30: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 30

Gerando recomendações

Matriz de co-ocorrência para um conjunto de dados com sete itens

Page 31: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 31

Gerando recomendações

2. Computando o vetor de cada usuárioUm vetor para cada usuário

Com n itens na base de dados, o vetor de preferências terá n dimensões

Se o usuário não exprime nenhuma preferência por um determinado item, o valor correspondente no vetor será zero

Neste exemplo, o vetor do usuário três é [2.0, 0.0, 0.0, 4.0, 4.5, 0.0, 5.0]

Page 32: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 32

Gerando recomendações

3. Computando as recomendaçõesPara computar as recomendações para o usuário

três, basta multiplicar seu vetor pela matriz de co-ocorrência

Computar cada valor da saída corresponde a estimar a preferência por um determinado item

Page 33: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 33

Gerando recomendações

Multiplicando a matriz de co-ocorrência com o vetor de preferências do usuário três para chegar ao vetor que nos leva às recomendações

Page 34: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 34

Gerando recomendações

Intuitivamente, olhando para a linha 3 da tabela, se o item desta linha co-ocorre com muitos itens que o usuário 3 expressou sua preferência, então é provável que seja algo que o usuário 3 goste

Page 35: Rodando um Recomendador no Hadoop usando Mahout

By Ivanilton Polato e Frank Helbert. These slides are licensed under theAtribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil Licence (CC BY-NC-SA 3.0)

Rodando o recomendador

Page 36: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 36

Integrando o Mahout no Hadoop

Precisamos do RecommenderJob

Modo Newbie:Apenas coloque o JAR pré-compilado da

distribuição do Mahout no diretório do hadoop.

mahout-core-0.6-job.jarModo Expert:

Faça as alterações necessárias no Mahout para sua persolnalização, gere o JAR e coloque no diretório do hadoop.

Page 37: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 37

Chamada do Mahout no Hadoop

:~$ bin/hadoop jar mahout-core-0.6-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob -Dmapred.input.dir=input/movieRec10M.txt -Dmapred.output.dir=outputCosine --usersFile input/movieUsers.txt --numRecommendations 10 --maxPrefsPerUser 100 --similarityClassname SIMILARITY_COSINE

Page 38: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 38

Formato dos dados

O recomendador do Mahout espera que os dados estejam da forma:RecommenderJob (org.apache.mahout.cf.taste.hadoop.item.RecommenderJob)

userID,itemID[,preferencevalue]UserID é um Long

ItemID é um Long

Preferencevalue é um Double

Page 39: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 39

Carregar os dados no HDFS

Comando:

hadoop fs -put <caminho_local_do_arquivo> <caminho_do_arquivo_no_hdfs>

Ex:

:~$ hadoop fs -put moviesRecommendation1M.txt input/moviesRec.txt

Page 40: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 40

Executando o RecomenderJob

Parâmetros de chamada:--usersFile(path): (xor) arquivo contendo os Ids dos

usuários considerados na computação

--itemsFile(path): (xor) arquivo contendo os Ids dos itens;

--numRecommendations(integer): número de recomendações computadas por usuário (padrão:10)

--booleanData(boolean): tratar a entrada como não tendo valores de preferência (padrão:falso)

--maxPrefsPerUser(integer): número máximo de preferências consideradas por usuário (padrão:10)

Page 41: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 41

Executando o RecomenderJob

Parâmetros de chamada:--similarityClassname(classname): (obrigatório) medida de

similaridade;

SIMILARITY_COOCCURRENCE

SIMILARITY_LOGLIKELIHOOD

SIMILARITY_TANIMOTO_COEFFICIENT

SIMILARITY_CITY_BLOCK

SIMILARITY_COSINE

SIMILARITY_PEARSON_CORRELATION

SIMILARITY_EUCLIDEAN_DISTANCE

Page 42: Rodando um Recomendador no Hadoop usando Mahout

By Ivanilton Polato e Frank Helbert. These slides are licensed under theAtribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil Licence (CC BY-NC-SA 3.0)

Mão na massa...

Page 43: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 43

Atividade

Em grupos

Rodar o Hadoop na máquina localPseudo-Distributed mode

Colocar rating para 10 filmes que já assistiu

Enviar arquivos para o HDFS

Rodar o recomendador

Aplicar script python nos resultados

Juntar recomendações e rodar exemplo no cluster (fully distributed mode)

Page 44: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 44

Instalando Hadoop (Pseudo-Distributed)

Extraia o conteúdo do arquivo

hadoop-1.0.1-pre-config.tar.gz no seu home

Dentro de hadoop-1.0.1/conf altere:hadoop-env.sh (alterar linha 9: java home)

DE: /usr/lib/jvm/java-6-openjdk

PARA: /usr/lib/jvm/java-6-sun

OU: verifique sua versão do java!

Verifique os 3 arquivos .xml no diretório conf:core-site.xml

hdfs-site.xml

mapred-site.xml

Page 45: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 45

Verifique o ssh da máquina. A maquina deve se conectar ao localhost sem necessidade de password.

:~$ ssh localhost

Agora vamos formatar (criar) o HDFS:

:~$ bin/hadoop namenode -format

E agora vamos inicializar o Hadoop (start-

Instalando Hadoop (Pseudo-Distributed)

Page 46: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 46

Edite o arquivo yourRec.txt e coloque suas recomendações nele:Crie um id único a partir de 1000 (chute um valor);

Procure no arquivo filmes.txt por filmes que você já assistiu e classifique-os com nota de 1 a 5.

Cada linha de seu arquivo deverá conter a seguinte estrutura:

<user_id_criado>,<id_filme>,<rating>

ex: 1977,123,4

Faça isto para no mínimo dez filmes.

Preenchendo com suas recomendações

Page 47: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 47

Preenchendo com suas recomendações

Agora vamos juntar suas recomendações com o arquivo de recomendações de outros usuários com o comando:

:~$ cat yourRec.txt >> rec.txt

Edite o arquivo user.txt que contenha apenas uma linha com seu user_id criado nela.

Page 48: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 48

Enviando arquivos ao HDFS

Agora que os arquivos estão preenchidos, envie seus dois arquivos para o fs com os comandos:

:~$ bin/hadoop fs -put rec.txt input/rec.txt

:~$ bin/hadoop fs -put user.txt input/user.txt

Page 49: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 49

Rodando o RecommenderJob

Verificar se o arquivo mahout-core-0.6-job.jar está no diretório raiz do hadoop.

A partir do diretório raiz do hadoop, executar o comando:

:~$ bin/hadoop jar mahout-core-0.6-job.jar

org.apache.mahout.cf.taste.hadoop.item.RecommenderJob

-Dmapred.input.dir=input/rec.txt -Dmapred.output.dir=output

--usersFile input/user.txt

--numRecommendations 10

Page 50: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 50

Resultados!

Acesse em seu navegador: http://localhost:50070/Opção: “Browse the filesystem”

Verificar os filmes recomendados para você usando o script imprimeFilmes.py com o seguinte comando:

:~$ python imprimeFilmes

Page 51: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 51

Referências:

LivrosHadoop – The Definitive Guide Tom White – 2ª Ed.

Hadoop in ActionChuck Lam – 1ª Ed.

Mining of Massive DatasetsRajaraman, A. & Ullman, J.D., 2011

Mahout in ActionOwen, S. et al., Manning, 2011

Web: http://wiki.apache.org/hadoop/

Page 52: Rodando um Recomendador no Hadoop usando Mahout

Frank Helbert Ivanilton Polato 52

Apêndice

Criar chave ssh e permitir acesso sem senha:

:~$ sudo apt-get install ssh

:~$ ssh-keygen -t rsa

:~$ cat .ssh/id_rsa.pub >> authorized_keys

:~$ ssh localhost