big blog analysis
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.TRANSCRIPT
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)
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