Big Blog Analysis

Preview:

DESCRIPTION

Apresentação feita no MongoSP, 28 Julho 2012. A mineração de dados sobre blogs é uma tarefa difícil devido ao seu grande volume da dados. O MongoDB é uma ótima solução para distribuir os dados em shards, dentro de um cluster de computadores, e analisar as informações com tarefas MapReduce sobre 30 milhões de postagens coletadas de usuários Brasileiros.

Citation preview

Big Blog AnalysisSharding e Map/Reducecom MongoDB

MongoSPJulho 13, 2012

Henrique DiasUniversidade Federal do

Rio Grande do Sul

RoteiroSharding(distribuição)

Map/Reduce(paralelismo)

Ex.: TF-IDF , PageRank

TrabalhoAnalista de T.I. na UFRGS

Sistemas em PHP

Banco de dados Relacional

TrabalhoAnalista de T.I. na UFRGS

Sistemas em PHP

Banco de dados Relacional

PesquisaMestrando na UFRGS

Mineração de Dados

Cluster, Paralelismo, Distribuído

PesquisaMestrando na UFRGS

Mineração de Dados

Cluster, Paralelismo, Distribuído

Análise de Blogs

Projeto de Mestrado

Análise de Blogs

Projeto de Mestrado

● Dados de posts, sem esquema● Milhões de posts● Dados distribuídos● Processamento Paralelo

Análise de Blogs

Projeto de Mestrado

● Dados de posts, sem esquema● Milhões de posts● Dados distribuídos● Processamento Paralelo

MongoDB serve!

"Não há bala de prata"Fred Brooks '86

ProblemaAutores de Blogs Populares em Tópicos

ProblemaAutores de Blogs Populares em Tópicos

Coleta de Blogspara o MongoDB

ProblemaAutores de Blogs

Populares em Tópicos

Coleta de Blogspara o MongoDB

Map/ReducePageRank

ProblemaAutores de Blogs

Populares em Tópicos

Coleta de Blogspara o MongoDB

Map/ReducePageRank

recomendação de Tags com TF-IDF

distribuído

Sharding

Shard London Bridge

Processos MongoDBmongod --shardsvr

mongod --configsvr

mongos --configdb

MongoShard

MongoShard

MongoShard

MongoConfig

mongos

router

tolerânciaà falhas

Shardingmongod --shardsvr

--dbpath /home/mongodb/base --port 27018

mongod --shardsvr --dbpath /home/mongodb/base2 --port 27010

mongod --configsvr--dbpath /home/mongodb/config--port 27019

Shardingmongos --configdb localhost:27019

mongo> use admin

> db.runCommand({ addshard: "localhost:27018" });> db.runCommand({ addshard: "localhost:27010" });

> db.runCommand( { enablesharding : "blogdb" } );> db.runCommand( { shardcollection : "posts",

key : "shardKey" });

Sharding

blogID, content, publishedDate

tags, postID, comments

authorID, title

Shard Key?

blogID, content, publishedDate

tags, postID, comments

authorID, title

Shard Key!

Virtual Shards

VM (8GB 4vP) VM (8GB 4vP)

VM (8GB 4vP)

MongoShard

MongoShard

MongoShard

MongoShard

MongoConfig

MongoShard

MongoShard

758,102 blogs

30,635,902 posts

21,467,340 comments

tam. méd. obj: 1.8mb

Conjunto de Dados

Post em JSON{

"_id" : ObjectId("4e92239ee4b020f5ff0041fb"),"authorID" : "10757528238954720127","blogID" : "1000004267813776424","postID" : "4057761886666222842","published" : ISODate("2011-03-24T12:00:00Z"),"title" : "Quis autem vel eum","content" : "Lorem ipsum dolor sit amet...","tags" : [ "voluptatem" , "accusantium" ],"comments" : [

{"commentID" : "77618861000004262228","authorID" : "00627699636039248506","published" : ISODate("2011-03-24T12:12:11.645Z"),"content" : "Neque porro quisquam est,..."}]

}

Map/Reduce

Map/ReduceMAP Local

Reduce Reduceregistros

Map/ReduceMAP Local

Reduce Reduce

key,value

key,value

key,value

registros

Map/ReduceMAP Local

Reduce Reduce

key,value

key,value

key,value

shufflecombine

registros

Map/ReduceMAP Local

Reduce Reduce

key,value

key,value

key,value

shufflecombine

registros

saída

Map/Reduce

política ...

saúde ...

carros ...

cinema ...

moda ...

futebol ...

livros ...

filmes ...

...

MAP Reduce

saúde, 1

futebol, 1

política, 1

saúde, 143futebol, 230política, 85...

...

documentos

Map/Reduce MongoDBFunções JavaScript

> map = function() { this.content.split(' ').forEach( function(word){ emit( word, 1 ); });}

> reduce = function(key, values) { var count = 0; values.forEach(function(value) { count += value; } ); return count; }

> db.posts.mapReduce(map, reduce, {out: { inline : 1}});

Map/Reduce MongoDB

MongoShard

MongoShard

MongoShard

mongos

dispara

Map/Reduce MongoDB

MongoShard

MongoShard

MongoShard

mongos

mapreduce

mapreduce

mapreduce

Map/Reduce MongoDB

MongoShard

MongoShard

MongoShard

mongos

reduce

TF-IDF Distribuídopara recomendação de Tags

Tópicos

Métrica de RelevânciaPalavra x Tag x Global

TF-IDF

TF: Frequência do Termo

tf(t,d) =

IDF: Frequência inversa nos documentos

idf(t,D) = log

tf x idf (t,d,D) = tf(t,d) x idf(t,D)

TF-IDF

|D||{d ∈ D : t ∈ d}|

|t||T|

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint magna occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

TF-IDF

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint magna occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

TF-IDF

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint magna occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

TF-IDFN = 70, D = 100

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint magna occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

TF-IDFN = 70, D = 100

tf(magma,d) = 2/70idf(magma,D) = 100/4

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint magna occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

TF-IDFN = 70, D = 100

tf(magma,d) = 2/70idf(magma,D) = 100/4

tf-idf(magna,d,D) = 0,09

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint magna occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

TF-IDFN = 70, D = 100

tf(magma,d) = 2/70idf(magma,D) = 100/4

tf-idf(magna,d,D) = 0,09

tf(in,d) = 3/70idf(in,D) = 100/65

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint magna occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

TF-IDFN = 70, D = 100

tf(magma,d) = 2/70idf(magma,D) = 100/4

tf-idf(magna,d,D) = 0,09

tf(in,d) = 3/70idf(in,D) = 100/65

tf-idf(in,d,D) = 0,01

Valores necessários:

n: Ocorrências de p em uma tag ( Tarefa 1 )

N: Nº palavras em uma tag ( Tarefa 2 )

d: Nº de tags que p aparece ( Tarefa 3 )

D: Total de tags ( Tarefa 2 )

TF-IDF Map/Reduce

TF-IDF Tarefa 1MAP Reduce

{ tag , palavra } , 1

{ tag , palavra } , n

somatório da palavra para a tag

Entrada

Posts{ tags, conteúdo }

TF-IDF Tarefa 1Map

function(){var tags = this.tags;

this.content.split(' '). forEach(function(sWord){

tags.forEach(function(sTag){ emit ( { tag: sTag , word: sWord } , 1 );

});});

};

TF-IDF Tarefa 1Reduce

function( key , values ){var count = 0;values.forEach( function(value) {

count += value;});return count;

};

TF-IDF Tarefa 1Resultado

{_id: {tag:"saúde", word:"doença" } values : 98 }{_id: {tag:"política", word:"leis" } values : 13 }{_id: {tag:"saúde", word:"saúde" } values : 32 }{_id: {tag:"política", word:"crise" } values : 45 }{_id: {tag:"saúde", word:"corpo" } values : 98 }{_id: {tag:"saúde", word:"para" } values : 34 }{_id: {tag:"2012", word:"de" } values : 65 }...

TF-IDF Tarefa 2MAP Reduce

tag , n

tag , N

somatório dos contadores

Entrada

{ tag, palavra } , n

TF-IDF Tarefa 2Resultado

{_id: "saúde", values : 670 }{_id: "política", values : 830 }{_id: "futebol", values : 700 }{_id: "2012", values : 1500 }...

Combina o resultado com o anterior

TF-IDF Tarefa 2Resultado

{tag:"saúde", word:"doença" } n:98, N:670{tag:"política", word:"leis" } n:13, N:830{tag:"saúde", word:"saúde" } n:32, N:670{tag:"política", word:"crise" } n:45, N:830{tag:"saúde", word:"corpo" } n:98, N:670{tag:"saúde", word:"para" } n:34, N:670{tag:"2012", word:"de" } n:65, N:1500...

TF-IDF Tarefa 3MAP Reduce

palavra , 1

palavra , d

documentos que a palavra aparece

Entrada

{ tag, palavra } , n

TF-IDF Tarefa 3Resultado

{_id: "doença", values : 45 }{_id: "leis", values : 23 }{_id: "saúde", values : 80 }{_id: "crise", values : 41 }{_id: "corpo", values : 30 }{_id: "para", values : 350 }{_id: "de", values : 480 }...

Combina resultados anteriores

TF-IDF CálculoResultado

{tag:"saúde", word:"doença" } n:98, N:670, d:45{tag:"política", word:"leis" } n:13, N:830, d:23{tag:"saúde", word:"saúde" } n:32, N:670, d:80{tag:"política", word:"crise" } n:45, N:830, d:41{tag:"saúde", word:"corpo" } n:98, N:670, d:30...

> D = db.TFIDF_Tarefa2.count();> db.TagsTFIDF.find().forEach(function(item){

item.tfidf = (item.n/item.N)*Math.log(D/item.d) });

TF-IDF ResultadoSaúde

saúdeágua

doençaspelecorpo

sintomasanimais

alimentoscriançascélulas

...

Políticadeputadopresidente

governocontraDilma

ministroMinistério

EstadopolíticaCâmara

...

Futebolgolstime

futebolequipe

goljogadorCopa

contrarodadapartida

...

PageRank Distribuído

Popularidade

PageRank

__

__

__

_ __

PageRank

__

__

__

_ __

PageRank

__

__

__

_ __

PageRank

__

__

__

_ __

PageRank

__

__

__

_ __

80

9

PageRank

__

__

__

_ __

80

9

40

40

3

3

3

PageRank

__

__

__

_ __

80

9

40

43

40

40

3

3

3

PageRank Map/Reduce

Tarefa 1:Lista de ID usuário x IDs Autores comentados

Tarefa 2:Iterações propagando os valores de PageRank

PageRank Tarefa 1MAP Reduce

userID , authorID

userID , [authorIDs]

lista de autores comentados por

Entrada

PostauthorID, Comentários

PageRank Tarefa 1Query{tags: "saúde"}

Mapfunction(){

var idAuthor = this.authorID;this.comments.forEach ( function (comment) {

if (comment.userID!=idAuthor) {emit ( comment.userID , [ idAuthor ] );

}});

};

PageRank Tarefa 1Reduce

function( key , values ){var outL = [];values.forEach( function(value) {

outL = outL.concat(value);});return outL;

};

PageRank Tarefa 1Resultado

{ _id: "00627699636039248506" , values: [

"10757528238954720121","40577618866662228425","10000042678137764244",...

]}

PageRank Tarefa 2MAP Reduce

authorID , PR/N

authorID , PageRank

valor do PageRank de cada Autor

Entrada

userID , [authorIDs]

PageRank Tarefa 2Map

function(){var prK = this.value.pr/this.value.outL.length;

this.value.outL.forEach ( function (authorID) {emit ( authorID, { pr:prK , outL:[] , prOld: 0 } );

});

if (this.value.outL.length + prK > 0) emit ( this._id , {

pr: 0 , outL: this.value.outL , prOld: this.value.pr } );

};

PageRank Tarefa 2Reduce

function( key , values ){var result = { pr:0 , outL:[] , prOld:0 }; values.forEach(function(value) {

result.pr += value.pr;result.outL = result.outL.concat(value.outL); result.prOld += value.prOld;

}); return result;

};

Processo deve executar até PageRank convergir

PageRank ResultadoSaúde

refugiadstardollcoturnonwelovefrfcoeliesangeloriforbidde

...

Política

bigbostmilitarpolibiofator

tribodohempadablogdop

...

Futebol

medobvalcabragesptec

hugogoesnovoblogbigbotheblogdoma

...

Desempenho?

Processo Offline

PageRank: 65.650.470ms (~18h)

TF-IDF: 108.213.056ms (~30h)

Tempo Execução

Memória CompartilhadaDisco Virtual Sata

JS Single-ThreadMap/Reduce JS LocksTamanho do Objeto BSON

Por que?

$olução!CloudFiber Channel

Dividir em mais $hards"ticket SERVER-4258 will allow multi-threading"

Reduzir o tamanho do BSON

Próximos Passos150 Milhões de Posts

Processo Online com mais $hard$

NMF, K-Means em Map/Reduce

Obrigado! Dúvidas?inf.ufrgs.br/~hdpsantos (código-fonte e dados)

hdpsantos@inf.ufrgs.br

MongoSPJulho 13, 2012

Henrique DiasUniversidade Federal do

Rio Grande do Sul

Durabilidade?

repairDatabase()versões anteriores

hoje: journaling

Reparar os Dados

mongoexport - json, csv

mongodump - bson

Backup dos Dados

Google Compute Engine

AWS Free Usage Tier

Teste com Single Shard

● EC2 m1.xlarge● EBS 20GB

AWS Free Usage Tier

Teste com Single Shard

● EC2 m1.xlarge● EBS 20GB

Mesmo desempenho!(para single shard)

Nossa Infra-estrutura?

Um Dell Server

4 Xeon Quad-core24 GB RAM2 x 1TB SATA

ColetaMongoShard

MongoShard

MongoShard

MongoShard

MongoConfig

MongoShard

MongoShard

7x mongos70 Coletores