Open Library no Mongodb

  • Published on
    18-Dec-2014

  • View
    870

  • Download
    0

Embed Size (px)

DESCRIPTION

Uso de map/reduce e do framework de agregao do MongoDB para anlise de uma grande base de dados bibliogrfica

Transcript

<ul><li> 1. Luciano Ramalho luciano@ramalho.org @ramalhoorg Open Library no MongoDB Usando Map/Reduce e o Aggregation Framework para anlise e modelagem de dadosTuesday, July 17, 12 </li> <li> 2. Temas Sobre o projeto Open Library Converso e importao da massa de dados Anlise dos dados com o framework de agregao Anlise dos dados com Map/Reduce Refatorao do modelo de dados para o MongoDB Encerramento @ramalhoorgTuesday, July 17, 12 </li> <li> 3. Sobre o projeto Open Library @ramalhoorgTuesday, July 17, 12 </li> <li> 4. Sobre a Open Library Misso: One web page for every book Um projeto do Internet Archive 117.439.126 registros bibliogrcos em jun/2012 Mais de 1.000.000 de e-books gratuitos para baixar (livres, CC, domnio pblico etc.) @ramalhoorgTuesday, July 17, 12 </li> <li> 5. A Tecnologia da Open Library Infobase: uma API Python para bases de dados semi-estruturadas sobre tabelas normalizadas tambm conhecida como ThingDB Inclui versionamento de registros Muitos join para recuperar uma entidade conceitual Fortemente depenente do SOLR/Lucene para exibir suas pginas @ramalhoorgTuesday, July 17, 12 </li> <li> 6. Modelo de dados semi-estruturado Base terica existe! Palavras-chave para pesquisa: semistructured ou semi-structured database The semistructured data model is designed as an evolution of the relational data model that allows the representation of data with a exible structure. SUCIU, Dan. SemiStructured Data Model. In: LIU, L. Encyclopedia of Database Systems @ramalhoorgTuesday, July 17, 12 </li> <li> 7. Data on the Web (1999) From Relations to Semistructured Data and XML Autores: Abiteboul, Buneman &amp; Suciu Notao apresentada: semelhante a JSON @ramalhoorgTuesday, July 17, 12 </li> <li> 8. Semistructured Database Design (2004) Autores: Ling, Lee &amp; Dobbie Algoritmos de normalizao sem a 1 Forma Normal (N1NF = Non First Normal Form) @ramalhoorgTuesday, July 17, 12 </li> <li> 9. Converso e importao da massa de dados @ramalhoorgTuesday, July 17, 12 </li> <li> 10. Massa de dados OL Complete Dump: ol_cdump_latest.txt.gz* 118.598.056 linhas em 1/jun/2012 16 GB comprimidos (.gz), 91 GB sem compresso 32 tipos diferentes de registros 1.158.930 (~1%) no so registros bibliogrcos Inclui todas as revises de todos os registros * http://openlibrary.org/developers/dumps @ramalhoorgTuesday, July 17, 12 </li> <li> 11. Converter para carregar Escolha de uma chave primria (campo _id) Chave composta: key+"-"+revision /books/OL1656964M-1 Opo adotada: a converso mais simples possvel Usar JSON do dump, acrescido de campo _id @ramalhoorgTuesday, July 17, 12 </li> <li> 12. Carga: conversor_ol.py import sys import json import io def conv_linha(lin, indent=None): rec_type, rec_key, rec_revision, rec_modified, rec_json = lin.split(ut) rec = json.loads(rec_json) rec[u_id] = rec_key + u- + rec_revision return json.dumps(rec, indent=indent) def conv_arquivo(nome_arq, max_lin=sys.maxsize, indent=None): with io.open(nome_arq, encoding=utf-8) as arq: for num_lin, lin in enumerate(arq, 1): if not lin.strip(): continue saida = conv_linha(lin, indent) print saida.encode(utf-8) if num_lin &gt;= max_lin: break if __name__==__main__: if len(sys.argv) == 2: converte_arquivo(sys.argv[1]) else: print Modo de usar: %s % __name__ * https://github.com/ramalho/mongosp @ramalhoorgTuesday, July 17, 12 </li> <li> 13. Usando mongoimport python conversor_ol.py $1 | mongoimport -d openlibrary -c complete --stopOnError -d: database -c: collection --stopOnError: interromper se houver erro --upsert: sobrescrever ao importar _id duplicado (default: ignorar o novo registro) --le: arquivo a inserir (default: stdin) @ramalhoorgTuesday, July 17, 12 </li> <li> 14. Anlise dos dados usando o framework de agregao @ramalhoorgTuesday, July 17, 12 </li> <li> 15. Indexao para anlise Criar ndices esparsos para: key revision type outros... @ramalhoorgTuesday, July 17, 12 </li> <li> 16. Aggregation Framework: o bsico Novidade no MongoDB 2.1/2.2 Alternativa ao Map/Reduce Mais fcil de usar Melhor desempenho implementado em C++, usa threads (Map/Reduce depende do interpretador JavaScript Spidermonkey, mono-thread) @ramalhoorgTuesday, July 17, 12 </li> <li> 17. Exemplo: group_types.js db = db.getMongo().getDB(openlibrary); db.complete.ensureIndex({"type.key":1}); var res = db.complete.aggregate( { "$group" : { ! "_id" : "$type.key", }}, ! "qt" : { "$sum" : 1 } $group ); { "$sort" : { "qt" : -1 }} $sort res.result.forEach(function (r) { print(r.qt+"t"+r._id); }); * https://github.com/ramalho/mongosp @ramalhoorgTuesday, July 17, 12 </li> <li> 18. Exemplo: group_types.js $ time mongo2.1 O primeiro lote group_types.js MongoDB shell version: 2.1.2 de 1.000.000 de connecting to: test 605781! /type/edition registros tem 9 382428! /type/author tipos diferentes 9211!/type/work 1935!/type/redirect Os trs primeiros 623! /type/delete 7! /type/template so os mais 7! /type/page importantes: 5! /type/doc edition, author, 3! /type/macro work real!0m23.658s user!0m0.030s sys! 0m0.004s @ramalhoorgTuesday, July 17, 12 </li> <li> 19. Agregao em estgios Estgios: etapas em um uxo (steps in a pipeline) Estgios so executados em ordem, na ordem dos parmetros da invocao de mapReduce Cada estgio aplica um operador especial O mesmo operador pode ser usado vrias vezes em estgios diferentes @ramalhoorgTuesday, July 17, 12 </li> <li> 20. Operadores de estgios $match $group $project $sort $limit $unwind $skip @ramalhoorgTuesday, July 17, 12 </li> <li> 21. Exemplo 2a * https://github.com/ramalho/mongosp var res = db.complete.aggregate( { $match : {"type.key" : "/type/edition"} }, { $project : { languages : 1} }, { $unwind : "$languages" }, { $group : { _id : "$languages.key", $match }}, qt : { $sum : 1 } $project ); { $sort : { qt : -1, _id : 1 }} $unwind $group $sort @ramalhoorgTuesday, July 17, 12 </li> <li> 22. Exemplo 2b * https://github.com/ramalho/mongosp db = db.getMongo().getDB(openlibrary); db.complete.ensureIndex({"revision":1}); var res = db.complete.aggregate( { $match : {"type.key" : "/type/edition"} }, { $project : { languages : 1} }, { $unwind : "$languages" }, $group { $group : { _id : "$languages.key", qt : { $sum : 1 } $sort }}, { $sort : { qt : -1, _id : 1 }} ); res.result.forEach(function (r) { print(r.qt+"t"+r._id); }); @ramalhoorgTuesday, July 17, 12 </li> <li> 23. O que no d para fazer (atualmente) Conjunto limitado de operadores Para lidar com strings, por exemplo: $substr, $toLower, $toUpper, $strcasecmp no tem length, regex, startswith, etc. O framework foi feito para ser extensvel Mas no tem uma arquitetura de plug-ins @ramalhoorgTuesday, July 17, 12 </li> <li> 24. Anlise dos dados com Map/Reduce @ramalhoorgTuesday, July 17, 12 </li> <li> 25. O problema do schema after Conceito: schema before x schema after Michael Stonebraker (criou Ingres,VoltDB etc): MongoDB schema after Em uma base schema after em produo, o esquema real quase nunca exatamente o planejado @ramalhoorgTuesday, July 17, 12 </li> <li> 26. Anlise profunda dos dados Estatsticas sobre a estrutura dos registros para cada tipo de registro, quais campos ocorrem, e em qual frequncia Estatsticas sobre estrutura dos campos valores simples, arrays e documentos aninhados (objetos) @ramalhoorgTuesday, July 17, 12...</li></ul>