Slide 1

Slide 1 text

Sistemas de Recomendação com Dataproc Daniela Petruzalek Senior Software Engineer @ Globo.com [email protected] 9 de Dezembro de 2017

Slide 2

Slide 2 text

O espaço de prateleira é limitado

Slide 3

Slide 3 text

Mas a internet...

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

O fenômeno da cauda longa Amazon: 36,7% (2008) $1,9 bi USD Amazon: 63,3%(2008) $3,4 bi USD Mais de 100 mil livros vendidos

Slide 6

Slide 6 text

Casos de Sucesso

Slide 7

Slide 7 text

Arquitetura de um Sistema de Recomendação Resultados de Algoritmos API de Recomendação Algoritmos de Recomendação Fonte de Documentos Dados de Consumo

Slide 8

Slide 8 text

Scheduler Arquitetura de um Sistema de Recomendação Resultados de Algoritmos API de Recomendação Algoritmos de Recomendação Fonte de Documentos Dados de Consumo

Slide 9

Slide 9 text

Apache Spark • Framework para processar Big Data • Processamento em memória (RDDs) • Baseado em grafos de execução • É possível programar um processo distribuido da mesma forma que um processo local

Slide 10

Slide 10 text

Componentes e Plataformas

Slide 11

Slide 11 text

Modelo de Execução

Slide 12

Slide 12 text

Ecossistema de Big Data

Slide 13

Slide 13 text

É um Pokémon ou uma tecnologia de Big Data? https://pixelastic.github.io/pokemonorbigdata/

Slide 14

Slide 14 text

= +

Slide 15

Slide 15 text

https://medium.com/google-cloud/recommendation-systems-with-spark-on-google-dataproc-bbb276c0dafd

Slide 16

Slide 16 text

Sistema de Recomendação na GCP CloudSQL (recs) Compute Engine Dataproc Cloud SQL (movies) Cloud SQL (ratings)

Slide 17

Slide 17 text

Algoritmo: Filtragem Colaborativa • Processo: • Identificar usuários similares • Recomendar itens que usuários similares gostam Filmes Usuários User x Item Matrix | Utility Matrix | Rating Matrix

Slide 18

Slide 18 text

Dataset: Movie Lens http://files.grouplens.org/datasets/movielens/ml-latest.zip

Slide 19

Slide 19 text

Passo 1: Criar Projeto na Cloud

Slide 20

Slide 20 text

Passo 1: Criar Projeto na Cloud

Slide 21

Slide 21 text

Passo 2: Criar o Modelo de Dados -- create_db.sql CREATE DATABASE TEST; -- create_movies.sql CREATE TABLE MOVIES( id varchar(255), title varchar(255), genre varchar(255), PRIMARY KEY (id)); -- create_ratings.sql CREATE TABLE RATINGS( userId varchar(255), movieId varchar(255), rating float, PRIMARY KEY (userId, movieId), FOREIGN KEY (movieId) REFERENCES MOVIES(id)); -- create_recommendations.sql CREATE TABLE RECOMMENDATIONS( userId varchar(255), movieId varchar(255), prediction float, PRIMARY KEY (userId, movieId), FOREIGN KEY (userId,movieId) REFERENCES RATINGS(userId,movieId));

Slide 22

Slide 22 text

Passo 3: Subir Arquivos Para a Cloud $ gcloud config set project recsys-187600 $ gsutil mb gs://recsys-tutorial $ gsutil cp *.sql gs://recsys-tutorial $ gsutil cp movies.csv ratings.csv gs://recsys-tutorial

Slide 23

Slide 23 text

Passo 4: Configurar o Cloud SQL

Slide 24

Slide 24 text

Passo 4: Configurar o Cloud SQL

Slide 25

Slide 25 text

Passo 4: Configurar o Cloud SQL

Slide 26

Slide 26 text

Passo 4: Configurar o Cloud SQL

Slide 27

Slide 27 text

Passo 4: Configurar o Cloud SQL

Slide 28

Slide 28 text

Passo 5: Configurar o Dataproc

Slide 29

Slide 29 text

Passo 5: Configurar o Dataproc

Slide 30

Slide 30 text

Passo 6: Algoritmo # engine.py # Configurações do job conf = SparkConf().setAppName('Movie Recommender') \ .set('spark.driver.memory', '6G') \ .set('spark.executor.memory', '4G') \ .set('spark.python.worker.memory', '4G') sc = SparkContext(conf=conf) sqlContext = SQLContext(sc) # Acesso ao Cloud SQL jdbcDriver = 'com.mysql.jdbc.Driver’ jdbcUrl = 'jdbc:mysql://%s:3306/%s?user=%s&password=%s' % ( CLOUDSQL_INSTANCE_IP, CLOUDSQL_DB_NAME, CLOUDSQL_USER, CLOUDSQL_PWD)

Slide 31

Slide 31 text

Passo 6: Algoritmo # Load via JDBC dfRates = sqlContext.read.format('jdbc') \ .option('useSSL', False) \ .option("url", jdbcUrl) \ .option("dbtable", TABLE_RATINGS) \ .option("driver", 'com.mysql.jdbc.Driver') \ .load() # BugFix ratesRDD = dfRates.rdd cleanRDD = ratesRDD.filter(lambda row : row[0] != "userId") # Treino do modelo com ALS model = ALS.train( cleanRDD.rdd.map(lambda r: (int(r[0]), int(r[1]), r[2])).cache(), rank=rank, seed=seed, iterations=iterations, lambda_=regularization_parameter)

Slide 32

Slide 32 text

Passo 6: Algoritmo # Gera 10 recomendações para cada usuário predictions = model.recommendProductsForUsers(10) \ .flatMap(lambda pair: pair[1]) \ .map(lambda rating: (rating.user, rating.product, rating.rating)) schema = StructType([ StructField("userId", StringType(), True), StructField("movieId", StringType(), True), StructField("prediction", FloatType(), True)]) dfToSave = sqlContext.createDataFrame(predictions, schema) # Salva no Cloud SQL dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode='overwrite')

Slide 33

Slide 33 text

Passo 7: Executar o job $ gsutil cp engine.py gs://recsys-tutorial

Slide 34

Slide 34 text

Passo 7: Executar o job

Slide 35

Slide 35 text

Passo 8: Validar os resultados

Slide 36

Slide 36 text

Passo 8: Validar os resultados

Slide 37

Slide 37 text

Conclusões • Sistema de recomendações simples de implementar • A infraestrutura da GCP abstrai muito a complexidade da arquitetura de Big Data • Faltam algumas features para ser production ready: • Suporte a outros algoritmos (ensemble) • Scheduler • Testes A/B • Ingestão de dados reais • API para consumo

Slide 38

Slide 38 text

Obrigada! [email protected] https://linkedin.com/in/petruzalek https://twitter.com/danicat83 https://github.com/danicat