Open Library no Mongodb

Embed Size (px)

DESCRIPTION

Uso de map/reduce e do framework de agregação do MongoDB para análise de uma grande base de dados bibliográfica

Text of Open Library no Mongodb

  • 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
  • 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
  • 3. Sobre o projeto Open Library @ramalhoorgTuesday, July 17, 12
  • 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
  • 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
  • 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
  • 7. Data on the Web (1999) From Relations to Semistructured Data and XML Autores: Abiteboul, Buneman & Suciu Notao apresentada: semelhante a JSON @ramalhoorgTuesday, July 17, 12
  • 8. Semistructured Database Design (2004) Autores: Ling, Lee & Dobbie Algoritmos de normalizao sem a 1 Forma Normal (N1NF = Non First Normal Form) @ramalhoorgTuesday, July 17, 12
  • 9. Converso e importao da massa de dados @ramalhoorgTuesday, July 17, 12
  • 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
  • 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
  • 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 >= 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
  • 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
  • 14. Anlise dos dados usando o framework de agregao @ramalhoorgTuesday, July 17, 12
  • 15. Indexao para anlise Criar ndices esparsos para: key revision type outros... @ramalhoorgTuesday, July 17, 12
  • 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
  • 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
  • 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!