Rodando um Recomendador no Hadoop usando Mahout

Preview:

Citation preview

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

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

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

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

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

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

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

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/

Frank Helbert Ivanilton Polato 9

Possibilidades de uso

System Data

...WEB ANALYTICS...

Frank Helbert Ivanilton Polato 10

Quem usa?

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

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

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

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

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

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

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

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

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

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>)

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

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));

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

Frank Helbert Ivanilton Polato 23

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

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)

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)

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

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

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

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

Frank Helbert Ivanilton Polato 30

Gerando recomendações

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

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]

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

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

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

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

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.

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

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

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

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)

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

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...

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)

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

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)

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

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.

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

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

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

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/

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

Recommended