Como fazer um email de digest usando Apache Spark

Luiz Henrique Zambom Santana
SocialBase
Published in
3 min readMay 4, 2018

Recentemente lançamos a versão beta do email de digest da SocialBase. Essa ferramenta ajuda nossos usuários a ficarem informados mesmo quando não puderam entrar na aplicação e reforça os posts mais importantes nas últimas semanas.

Um post no SocialBase

Existem muitos conteúdos que explicam como desenvolver uma ferramenta de recomendação, como os slides abaixo.

Recomendação baseada em Aprendizado de Máquina

Filtragem colaborativa é o principal método para recomendação baseada em Aprendizado de Máquina. Existem diversas formas de lidar com a recomendação, mas duas são as principais: baseada no item ou baseada no usuário. Nós usamos a recomendação baseada no usuário. A característica que usamos para fazer a recomendação é a curtida em posts. Portanto, o que define a similaridade entre dois usuários é o conjunto de posts que cada usuário curtiu.

Recomendação baseada em usuários (https://gerardnico.com/data_mining/collaborative_filtering)

MLlib do Apache Spark

Para implementar o digest, usamos o Apache Spark. O Spark é uma ferramenta voltada para Fast Data como foco em baixa latência nas respostas e oferecendo facilidade de uso. A arquitetura do Spark, é bastante simples. Com base nela, cada aplicação deverá instanciar um contexto do Spark (Spark Context) que contém as informações necessárias para acessar o cluster onde a mesma será executada. O Spark Context comunica-se com o Cluster Manager, um componente responsável por distribuir a execução de jobs em Workers disponíveis nos nós do cluster. A principal vantagem desta arquitetura é que o processamento dos dados é feito todo em uma memória compartilhada entre os nós, sendo que o acesso ao disco é evitado sempre que possível.

Visão geral da arquitetura do Spark.

Além da arquitetura geral, é importante conhecer os seguintes conceitos do Spark:

  • Resilient Distributed Datasets (RDD): abstraem um conjunto de objetos distribuídos no cluster, geralmente executados em memória principal. Esses objetos podem estar armazenados em sistemas de arquivo tradicional, no HDFS e em alguns bancos de dados NoSQL como Cassandra e HBase;
  • Operações: representam transformações (como agrupamentos, filtros e mapeamentos entre os dados) ou ações (como contagens e persistências);
  • Contexto Spark (Spark Context): como ilustrado anteriormente, representa o principal ponto de entrada ao cluster Spark para uma aplicação que o está utilizando.

A Filtragem de Conteúdo é implementada usando o Alternating Least Squares (ALS), uma técnica de Aprendizado de Máquina supervisionada disponível na biblioteca de aprendizado de máquina MLlib. Portanto devemos primeiramente criar um modelo ALS baseado em pontos rotulados. Os pontos rotulados no Spark são implementados usando a classe Rating e devem ser armazenados em um RDD. Finalmente, treinamos o modelo de ALS usando esses pontos.

MatrixFactorizationModel model = ALS.train(JavaRDD.toRDD(ratings), rank, numIterations, 0.01);

Esse modelo é usado para prever uma lista de quais são os post vai importantes para cada cliente.

JavaPairRDD<Tuple2<Integer, Integer>, Double> predictions = JavaPairRDD.fromJavaRDD(
model.predict(JavaRDD.toRDD(userProducts)).toJavaRDD()
.map(r -> new Tuple2<>(new Tuple2<>(r.user(), r.product()), r.rating()))
);

Percorrendo essa podemos criar emails personalizados para cada um dos nossos usuários. Com essa recomendação cada usuário receberá um email com os três posts mais relevantes baseado na filtragem colaborativa.

Email de digest

--

--