+ All Categories
Home > Documents > Gonçalo da Cruz Pereira e Sousarepositorium.sdum.uminho.pt/bitstream/1822/40119/1...a chamar Big...

Gonçalo da Cruz Pereira e Sousarepositorium.sdum.uminho.pt/bitstream/1822/40119/1...a chamar Big...

Date post: 18-Jan-2019
Category:
Upload: hoangque
View: 215 times
Download: 0 times
Share this document with a friend
131
Gonçalo da Cruz Pereira e Sousa Document-Based Databases: Estudo Comparativo no Âmbito das Bases de Dados NoSql Gonçalo da Cruz Pereira e Sousa outubro de 2015 UMinho | 2015 Document-Based Databases: Estudo Comparativo no Âmbito das Bases de Dados NoSql Universidade do Minho Escola de Engenharia
Transcript

Gonçalo da Cruz Pereira e Sousa

Document-Based Databases:Estudo Comparativo noÂmbito das Bases de Dados NoSql

Gonç

alo

da C

ruz P

ereir

a e

Sous

a

outubro de 2015UMin

ho |

201

5Do

cum

ent-B

ased

Dat

abas

es:

Estu

do C

ompa

rativ

o no

Âm

bito

das

Bas

es d

e Da

dos

NoS

ql

Universidade do MinhoEscola de Engenharia

outubro de 2015

Dissertação de MestradoCiclo de Estudos Integrados Conducentes ao Grau deMestre em Engenharia e Gestão de Sistemas de Informação

Trabalho efectuado sob a orientação doProfessor Doutor José Luís Mota Pereira

Gonçalo da Cruz Pereira e Sousa

Document-Based Databases:Estudo Comparativo noÂmbito das Bases de Dados NoSql

Universidade do MinhoEscola de Engenharia

I

O conhecimento é um tesouro, mas a prática é a chave para alcançá-lo.

Thomas Fuller

Agradecimentos _______________________________________________________________________________

III

Agradecimentos

Ao concluir a presente dissertação gostaria de manifestar o meu sincero agradecimento a

todos os que contribuiram para a sua realização, não podendo deixar de salientar algumas

pessoas em particular:

Ao professor Doutor José Luís Mota Pereira, orientador desta dissertação, agradeço a

disponibilidade demonstrada, os esclarecimentos prestados e a partilha de conhecimentos.

Ao Departamento de Sistemas de Informação agradeço pela ajuda sempre prestada ao longo

destes anos.

Aos Amigos que tiveram presentes nesta caminhada, Fábio Teixeira, Diogo Silva, José

Santos, Jaime Oliveira e Diana Aguiar agradeço todo o apoio.

Ao meu grande amigo José Oliveira agradeço o apoio e camaradagem ao longo destes anos.

À Filipa Neiva realço um agradecimento especial por ter estado sempre presente e sempre

me ter apoiado bastante ao longo destes anos.

À minha mãe e ao meu irmão agradeço pela amizade e ajuda pois sem eles nada disto era

possível.

Ao meu irmão pequenino, que apesar de ter nascido há pouco tempo também merece um

agradecimento.

Ao meu falecido pai agradeço e dedico esta dissertação pois era a vontade dele ver-me

formado.

Resumo _______________________________________________________________________________

V

Resumo

Depois de várias décadas de grande sucesso e bons serviços prestados às organizações, a

tecnologia relacional de bases de dados tem vindo a ser desafiada por uma nova classe

de tecnologias de bases de dados a que se deu a designação genérica de NoSql. Para este

facto contribuíram decisivamente os recentes desenvolvimentos na área a que se tem vindo

a chamar Big data, na qual, dada a complexidade e volume dos conjuntos de dados a

gerir, o tradicional modelo relacional começou a apresentar dificuldades.

Dentro desta nova classe de tecnologias de Bases de Dados surgiram diferentes propostas,

com distintas proveniências e áreas de aplicação, vulgarmente classificadas em quatro

grupos, de acordo com o seu modelo de dados: Column, Document, Key/Value e Graph

Based Databases.

Dada a grande diversidade de propostas atualmente existentes em cada um dos modelos de

Bases de Dados NoSql, torna-se pertinente compreender as suas características específicas

e áreas de aplicação mais relevantes, enquanto, simultaneamente se vincam as suas

diferenças relativamente às tradicionais bases de dados relacionais.

Em particular, pretende-se abordar uma das quatro classes de bases de dados em que o

mundo NoSql se divide – as Document-Based databases, de que produtos como o MongoDB

e o CouchDB são alguns dos principais representantes. Como propósito do trabalho em que

esta dissertação se enquadra, pretende-se perceber quais as diferenças, a nível de

desempenho, entre soluções suportadas por estes dois produtos, quando utilizados no

suporte de bases de dados de dimensão crescente, procurando evidenciar também as

diferenças entre estas e soluções construídas recorrendo à bem conhecida tecnologia

relacional.

Palavras chave: Big data, Sql, NoSql, Document databases.

Abstract _______________________________________________________________________________

VII

Abstract

After many decades of great success and good services provided to organizations, relational

databases have been challenged by a new class of database technologies with the generic

designation of NoSql. To this fact contributed, decisively, the recent developments in the

area called BigData, in which, due to its complexity and volume of data to manage, the

traditional relational model has began to present difficulties.

In this new class of database technologies appeared different proposals, with different

origins and application areas, commonly classified into four groups, according to its data

model: Column, Document, Key/Value and Graph Based Databases.

Given the wide variety of currently existing proposals in each of the NoSql Database

families, it is pertinent to understand their most important specific characteristics and

application areas, while, simultaneously, clarifying their differences regarding traditional

relational databases.

In particular, it is intended to explore one of the four database classes in which the NoSql

world is divided – the Document-Based databases, in which products like MongoDB and

CouchDB are some of the main representatives. In this thesis, it’s intended to understand

what are the differences, in performance, between solutions developed using these two

products, when used to support databases of growing dimensions, seeking to highlight the

differences between these and solutions built using the well-known relational technology.

Key words: Big data, Sql, NoSql, Document databases.

Índice _______________________________________________________________________________

IX

Índice Agradecimentos............................................................................................................................. III

Resumo ............................................................................................................................................ V

Abstract ........................................................................................................................................ VII

Índice ............................................................................................................................................. IX

Índice de Figuras ........................................................................................................................... XI

Índice de Tabelas ......................................................................................................................... XIII

Lista de Siglas e Acrónimos ......................................................................................................... XV

Capitulo 1- Introdução .................................................................................................................... 1

1.1 Enquadramento ..................................................................................................................... 1

1.2 Objetivos e Resultados Propostos......................................................................................... 2

1.3 Abordagem Metodológica .................................................................................................... 3

1.4 Estrutura da Dissertação ....................................................................................................... 4

Capitulo 2- Fundamentos Teóricos ................................................................................................. 5

2.1 Big data ................................................................................................................................. 5

2.2 Surgimento do conceito NoSql ............................................................................................. 7

2.3 NoSql .................................................................................................................................... 9

2.3.1 Teorema CAP .............................................................................................................. 12

2.3.2 BASE Vs ACID .......................................................................................................... 14

2.3.3 Caraterização das Bases de dados NoSql .................................................................... 16

2.3.4 Tipos de Bases de Dados NoSql ................................................................................. 25

2.3.5 Comparação entre os tipos de Bases de Dados NoSql ................................................ 38

2.3.6 Considerações Finais ................................................................................................... 43

Capítulo 3 – Análise e Carregamento dos dados ........................................................................... 45

3.1 Dados para Carregamento .................................................................................................. 45

3.2 Carregamento dos dados no MySQL .................................................................................. 46

3.2.1 Modelo conceptual de dados ............................................................................................ 47

3.2.2 Descrição das Entidades ................................................................................................... 47

3.2.3 Carregamento das tabelas filho ........................................................................................ 49

3.2.4 Carregamento das tabelas pai ........................................................................................... 52

3.3 Carregamento de dados no MongoDB ............................................................................... 54

3.3.1 Estrutura dos Documentos .......................................................................................... 54

3.3.2 Carregamento da coleção ............................................................................................ 55

3.4 Carregamento dos dados no CouchDB ............................................................................... 56

Capitulo 4 – Benchmarking .......................................................................................................... 59

4.1 Consultas MySQL ............................................................................................................... 59

4.2 Consultas MongoDB ........................................................................................................... 60

Índice _______________________________________________________________________________

X

4.3 Consultas CouchDB ............................................................................................................ 61

4.4 Criação de Índices ............................................................................................................... 63

4.5 Resultados ........................................................................................................................... 64

4.5.1 Consulta 1 ......................................................................................................................... 64

4.5.2 Consulta 2 ......................................................................................................................... 64

4.5.3 Consulta 3 ......................................................................................................................... 65

4.6 Discussão de Resultados ..................................................................................................... 65

Capítulo 5 – Testes de Carga ........................................................................................................ 67

5.1 Base de Dados BD1............................................................................................................. 67

5.2 Base de dados BD2 ............................................................................................................. 68

5.3 Base de dados BD3 ............................................................................................................. 69

5.4 Base de dados BD4 ............................................................................................................. 70

5.5 Discussão de resultados ....................................................................................................... 71

Capítulo 6 – Conclusões ................................................................................................................ 73

6.1 Contribuições ...................................................................................................................... 73

6.2 Dificuldades ........................................................................................................................ 73

6.3 Trabalho futuro .................................................................................................................... 74

Referências Bibliográficas ............................................................................................................ 75

Anexos .......................................................................................................................................... 81

Anexo A .................................................................................................................................... 83

Anexo B .................................................................................................................................... 97

Anexo C .................................................................................................................................. 101

Anexo D .................................................................................................................................. 105

Anexo E ................................................................................................................................... 107

Índice de Figuras _______________________________________________________________________________

XI

Índice de Figuras Figura 1 - Teorema CAP (Retirado de Indrawan-Santiago, 2012, pag.47) ..................................... 12

Figura 2 - Fluxo do funcionamento do Map Reduce (Retirado de Alexandre & Cavique,

2013,pag.41) ................................................................................................................................... 19

Figura 3 - Exemplo MapReduce (Adaptado de Bonnet et al., 2011,pag.486) ................................ 19

Figura 4 - Fluxo de uma execução MapReduce (Retirado de Bonnet et al., 2011,pag.486) ........... 20

Figura 5 - Exemplo de sharding (Retirado de Cardoso, 2012,pag.25) ............................................ 22

Figura 6 - Exemplo de sharding de um carrinho e compras (Retirado de Tauro et al., 2012,pag.2)23

Figura 7 - Exemplo de uma chave ligada a um valor (Retirado de Sadalage & Fowler,

2012,pag.58) ................................................................................................................................... 26

Figura 8 - Estrutura típica das column-based databases (Retirado de Sadalage & Fowler,

2012,pag.46) ................................................................................................................................... 28

Figura 9 - Exemplo das relações numa graph database (Retirado de Sadalage & Fowler,

2012,pag.52) ................................................................................................................................... 30

Figura 10 - Exemplo de dois Documentos de uma Document database ......................................... 33

Figura 11 - Documento contendo um exemplo de descrição de um livro (Retirado de Silva,

2011,pag.14) ................................................................................................................................... 34

Figura 12 - Exemplo de uma função utilizada para obter o título de todos os livros armazenados na

base de dados (Retirado de Silva, 2011,pag.14) ............................................................................. 35

Figura 13 - Exemplo de um Documento com campos distintos (Retirado de Queiroz et al.,

2013,pag.485) ................................................................................................................................. 36

Figura 14 - Exemplo de uma consulta sobre todos os livros que contêm o título Flatland (Retirado

de Silva, 2011,pag.17) ..................................................................................................................... 37

Figura 15 - Exemplo de duas consultas efetuadas no MongoDB (Retirado de Silva, 2011,pag.17)37

Figura 16 - Consistent hashing (Retirado de Grolinger et al., 2013, pag.13).................................. 40

Figura 17 – Extrato do csv aviões ................................................................................................... 45

Figura 18 – Extrato do csv companhias aéreas ............................................................................... 46

Figura 19 – Extrato do csv aeroportos ............................................................................................ 46

Figura 20 – Extrato do csv contendo voos de 1995 ........................................................................ 46

Figura 21 - Modelo conceptual de dados ........................................................................................ 47

Figura 22 - Import do csv airport .................................................................................................... 50

Figura 23 - Exemplo de um documento criado no MongoDB ........................................................ 56

Figura 24 - Exemplo de um documento criado no CouchDB ......................................................... 57

Figura 25 - Criação de um índice no MySQL ................................................................................. 63

Figura 26 - Comparação de desempenhos na Consulta 1................................................................ 64

Figura 27 - Comparação de desempenhos na Consulta 2................................................................ 65

Figura 28 - Comparação de desempenhos na Consulta 3................................................................ 65

Figura 29 - Resultado do Teste de carga utilizando a consulta 1 .................................................... 67

Figura 30 - Resultado do Teste de carga utilizando a consulta 3 .................................................... 68

Figura 31 - Resultado do Teste de carga utilizando a consulta 1 .................................................... 68

Figura 32 - Resultado do Teste de carga utilizando a consulta 3 .................................................... 69

Figura 33 - Resultado do Teste de carga utilizando a consulta 1 .................................................... 69

Figura 34 - Resultado do Teste de carga utilizando a consulta 3 .................................................... 70

Figura 35 - Resultado do Teste de carga utilizando a consulta 1 .................................................... 70

Figura 36 - Resultado do Teste de carga utilizando a consulta 3 .................................................... 71

Figura 37 - Download do MongoDB .............................................................................................. 97

Figura 38 - Instalação do MongoDB ............................................................................................... 97

Figura 39 - Setup type da instalação do MongoDB ........................................................................ 98

Figura 40 - Correção do erro hotfix ................................................................................................ 98

Figura 41 - Mudança para a diretoria do MongoDB ....................................................................... 99

Figura 42 - Execução do comando "mongod" ................................................................................ 99

Índice de Figuras _______________________________________________________________________________

XII

Figura 43 - Inicialização do MongoDB ........................................................................................ 100

Figura 44 - Execução do comando "mongo" ................................................................................ 100

Figura 45 - Download do CouchDB ............................................................................................. 101

Figura 46 - Instalação do CouchDB .............................................................................................. 101

Figura 47 - Seleção da diretoria .................................................................................................... 102

Figura 48 - Alteração das credenciais do CouchDB ..................................................................... 102

Figura 49 - Execução do CouchDB através do curl ...................................................................... 103

Figura 50 - Download do Jmeter ................................................................................................... 107

Figura 51 - Inicialização do Jmeter ............................................................................................... 107

Figura 52 - Criação do Thread Group ........................................................................................... 108

Figura 53 - Criação do config element para o MongoDB ............................................................. 108

Figura 54 - Criação da sampler para o MongoDB ........................................................................ 109

Figura 55 - Criação do Listener .................................................................................................... 109

Figura 56 - Criação do Config Element para o MySQL ............................................................... 110

Figura 57 - Criação da Sampler para o MySQL ........................................................................... 111

Índice de Tabelas _______________________________________________________________________________

XIII

Índice de Tabelas Tabela 1- Comparação dos tipos de bases de dados NoSql em termos de segurança (Adaptado de

Grolinger et al., 2013, pag.17) ........................................................................................................ 25 Tabela 2 - Comparação entre os tipos de bases de dados NoSql (Adaptado de Indrawan-Santiago,

2012,pag.47) ................................................................................................................................... 39 Tabela 3 - Comparação dos tipos de bases de dados NoSql em termos de particionamento,

replicação e consistência (Retirado de Grolinger et al., 2013,pag.11) ............................................ 42 Tabela 4 - Descrição dos atributos da entidade airplane ................................................................. 47 Tabela 5 - Descrição dos atributos da entidade Airline .................................................................. 47 Tabela 6 - Descrição dos atributos da entidade airport ................................................................... 48 Tabela 7 - Descrição dos atributos da entidade aircraft type .......................................................... 48 Tabela 8 - Descrição dos atributos da entidade engine type ........................................................... 48 Tabela 9 - Descrição dos atributos da entidade flight ..................................................................... 49 Tabela 10 - Descrição dos atributos da entidade manufacturer ...................................................... 49 Tabela 11 - Descrição dos atributos da entidade model .................................................................. 49 Tabela 12 - Descrição dos atributos da entidade plane type ........................................................... 49

Lista de Siglas e Acrónimos _______________________________________________________________________________

XV

Lista de Siglas e Acrónimos XML- Extensible Markup Language

NoSql- Not Only SQL

SQL- Structured Query Language

CAP- Consistency, Availability e Partition Tolerance

PA- Partition Tolerance e Availability

CA- Consistency e Availability

CP- Consistency e Partition Tolerance

BASE- Basically available, soft state, eventually consistent

ACID- Atomicity, Consistency, Isolation, Durability

JSON- JavaScript Object Notation

API- Application Programming Interface

Introdução _______________________________________________________________________________

1

Capitulo 1- Introdução

Neste capítulo são contextualizadas as bases de dados NoSql no âmbito do Big data, e o

porquê das bases de dados relacionais estarem limitadas nesse contexto. Seguidamente são

referidos os objetivos e resultados propostos, e, por fim, é apresentada a estruturação do

documento.

1.1 Enquadramento

Com o aparecimento do Big data, no qual a complexidade e volume dos dados aumentou, a

tecnologia relacional começou a demonstrar fragilidades principalmente a nível de

desempenho. Isto fez com que uma nova tecnologia de base de dados, a NoSql, emergisse e

começasse a ser opção para as empresas.

O conceito Big data pode ser resumidamente definido como “uma coleção de bases de dados

tão complexa e volumosa que se torna muito difícil fazer algumas operações simples (ex.,

remoção, ordenação, sumarização) de forma eficiente utilizando Sistemas Gestão de Bases

de Dados (SGBD) tradicionais” (Vieira & Figueiredo, 2012).

Nas grandes aplicações web, desktop ou até mesmo móveis está-se a tornar cada vez mais

comum lidar com grande volume de dados, sendo que no futuro a situação será mais

exigente em termos de armazenamento de dados (Toth, 2012).

Em particular, a necessidade de gerir dados cujos formatos são dificilmente acomodáveis

em sistemas relacionais, dispersos por múltiplos servidores, levou ao aparecimento das ditas

Bases de Dados NoSql. Sendo assim, este novo tipo de bases de dados vieram para resolver

os problemas dos sistemas que precisam de escalabilidade e agilidade nas suas inserções,

buscas e alterações (Toth, 2012).

Lidando com tanta quantidade de registos, o desempenho pode diminuir com bases de dados

relacionais, assim, esta nova tecnologia veio para colmatar esta diminuição de desempenho,

focando-se numa abordagem diferente de persistência de dados que se baseia na

disponibilidade, desempenho e escalabilidade das soluções (Toth, 2012).

Dentro desta nova classe de tecnologias de Bases de Dados surgiram diferentes propostas,

com distintas proveniências e áreas de aplicação, vulgarmente classificadas em quatro

grupos, de acordo com o seu modelo de dados: Column, Document, Key/Value e Graph

Based Databases. Em simultâneo, e reconhecendo a relevância desta área, os próprios

construtores tradicionais de tecnologia relacional começaram também a fazer as suas

incursões, como é o caso da Oracle com o Oracle NoSql Database (do tipo Key/Value-

Introdução _______________________________________________________________________________

2

Based Databases), ou da Microsoft com o DocumentDB (do tipo Document-Based

Databases).

Dada a grande diversidade de propostas atualmente existentes em cada um dos modelos de

Bases de Dados NoSql, torna-se pertinente compreender as suas características específicas

e áreas de aplicação mais relevantes, enquanto, simultaneamente se vincam as suas

diferenças relativamente às tradicionais bases de dados relacionais.

Este trabalho vai abordar a tecnologia de Bases de dados NoSql denominada Document

Databases que tem como exemplos o CouchDB e o MongoDB. Este tipo de bases de dados

NoSql são parecidas com a abordagem chave/valor com uma grande exceção. Em vez de

armazenar qualquer arquivo binário como valor de uma chave é requisitado que o valor dos

dados que serão armazenados possuam um formato que a base de dados possa interpretar.

Na maioria das vezes podem ser arquivos de extensão XML, JSON ou qualquer formato

descritivo, variando muito de ferramenta para ferramenta (Toth, 2012).

Guardar novos documentos que contenham qualquer tipo de atributos pode ser tão fácil

como adicionar novos atributos nos Documentos existentes. Estas Document Databases

oferecem API’s mais ricas. Range queries nos valores, secondary indexes, querying nested

documents e operações como "and", "or", "between" são características, que podem ser

utilizadas convenientemente (Hecht & Jablonski, 2011).

Este é um tema atual e interessante de ser abordado pois é uma tecnologia cada vez mais

utilizada e que veio resolver muitos problemas. Nomeadamente as Document Databases

que através de documentos são guardados os dados. Sendo esta um dos principais tipos de

bases de dados NoSql, este trabalho é pertinente e uma mais-valia para aprender mais sobre

esta tecnologia.

1.2 Objetivos e Resultados Propostos

Com este trabalho pretende-se, justamente, explorar este novo domínio da tecnologia de

bases de dados, em particular as designadas Document Databases, de que produtos como

o MongoDB e o CouchDB, são alguns dos principais representantes.

Os objetivos são os seguintes:

Caracterização do contexto Big data e o papel das bases de dados NoSql nesse

contexto;

Caracterização detalhada de alguns dos produtos NoSql mais representativos de

Introdução _______________________________________________________________________________

3

entre as Document-Based Databases;

Análise comparativa desses produtos com base em casos de estudo

representativos das suas áreas de aplicação;

Identificação das vantagens relativamente às bases de dados relacionais.

1.3 Abordagem Metodológica

Estudo Exploratório será a abordagem metodológica a seguir durante a realização da

dissertação. Recorrendo a esta abordagem, pretende-se analisar as bases de dados NoSql,

nomeadamente as vantagens em relação à tecnologia SQL.

Afunilando para as Document Databases, em que se pretende fazer uma análise a esta

tecnologia.

Por fim pegar num caso prático e efetuar uma comparação entre as Document Databases e

a tecnologia Relacional.

Explorar novos fenómenos pode ajudar quem pesquisa a testar a viabilidade de um estudo

mais alargado, da necessidade da compreensão ou determinar o melhor método a utilizar

num estudo posterior.

Piovesan & Temporini (1995) citam Theodorson que refere que é “Um estudo preliminar

em que o objetivo principal é familiarizar-se com um fenômeno de investigação, de modo

que o estudo que se segue possa ser projetado com uma maior compreensão e precisão.

Permite também escolher as técnicas mais adequadas para a pesquisa e decidir sobre as

questões que mais necessitam de atenção e investigação detalhada, e pode alertar para

possíveis dificuldades, sensibilidades, e áreas de resistência. "

Citam também Polit e Hungler que referem que “é um estudo preliminar designado para

desenvolver ou refinar hipóteses, ou para testar e definir métodos de coleção de dados.”

Segundo Richardson (1989) “o estudo exploratório procura conhecer as características de

um fenômeno para procurar explicações das causas e consequências do dito fenômeno”

Já para Mattar (1994) “visa prover quem pesquisa de um maior conhecimento sobre o tema

ou problema de pesquisa em perspetiva. Por isso é apropriada para os primeiros estágios da

investigação, quando a familiaridade, o conhecimento e a compreensão do fenómeno por

parte de quem pesquisa são geralmente insuficientes ou inexistentes”.

Para Sampieri et al. (1991) “os estudos exploratórios servem para aumentar o grau de

familiaridade com fenômenos relativamente desconhecidos, obter informações sobre a

possibilidade de levar adiante uma investigação mais completa sobre um contexto particular

Introdução _______________________________________________________________________________

4

da vida real e estabelecer prioridades para investigações posteriores, entre outras utilizações.

Porém, os estudos exploratórios em poucas ocasiões constituem um fim em si mesmos. Eles

caracterizam-se por serem mais flexíveis na sua metodologia em comparação com os

estudos descritivos ou explicativos, e são mais amplos e dispersos que estes dois últimos

tipos (por exemplo, procuram observar tantas manifestações do fenômeno estudado quanto

for possível) ” (Révillion, 2001).

Segundo Rodrigues (2007) tem como objetivo inteirar quem pesquisa no problema, através

de pesquisa bibliográfica ou estudo de caso.

Já Révillion (2001) refere que o objetivo do estudo exploratório é procurar perceber as

razões e motivações que estão subjacentes a determinadas atitudes e comportamentos das

pessoas.

Sendo assim esta metodologia tem um foco amplo e raramente responde a questões de

investigação específicas.

1.4 Estrutura da Dissertação

O presente documento está estruturado em seis capítulos. No Primeiro capítulo é

apresentada uma contextualização da origem e necessidade da realização da dissertação.

Além disso, os principais objetivos e resultados esperados da dissertação são descritos, bem

como a metodologia seguida na presente dissertação.

No Segundo capítulo é apresentado o estado de arte sobre as bases de dados NoSql e todos

os termos adjacentes, contextualizando no âmbito da Big data.

No Terceiro capítulo é apresentada a análise e carregamento dos dados, é referido qual o

dataset escolhido e como este foi tratado e carregado para as bases de dados em estudo.

No Quarto capítulo é apresentado o benchmarking, em que escolhidas as consultas a serem

efetuadas irá realizar-se um estudo comparativo entre as tecnologias selecionadas.

No Quinto capítulo são apresentados os testes de carga, que para as consultas estudadas no

benchmarking, irá ser analisado o desempenho com utilizadores a aceder concorrentemente

à base de dados e verificar como estas se comportam.

No sexto e último capítulo são apresentadas as conclusões finais, onde é falado da

contribuíção desta dissertação, bem como as dificuldades sentidas e trabalho futuro.

5

Fundamentos Teóricos _______________________________________________________________________________

Capitulo 2- Fundamentos Teóricos O crescimento exponencial da web 2.0 resultou na geração de cada vez maiores quantidades

de dados, caracterizados por uma grande diversidade de formatos, de que é necessário tirar

partido. O armazenamento, a gestão e o processamento destes novos dados veio evidenciar

as limitações das bases de dados relacionais, tanto em termos de capacidade de lidar com os

grandes volumes de dados, como dos tipos de dados a suportar. Neste contexto, uma nova

tecnologia emergiu e está a tornar-se cada vez mais importante no mercado – as bases de

dados NoSql.

2.1 Big data

Atualmente o armazenamento e processamento de grandes quantidades de dados na área da

computação é um grande desafio. O mundo digital está a crescer a olhos vistos e a tornar-

se cada vez mais complexo, quer relativamente ao volume de dados (do Terabyte ao

Petabyte), à sua variedade (dados estruturados, semiestruturados e não estruturados) e à

velocidade a que têm de ser processados (ritmos cada vez mais rápidos).

A este fenómeno chama-se Big data, que pode ser definido como uma grande coleção de

dados que cresceu tanto e de forma tão diversificada que não pode ser gerido ou explorado

eficientemente com as tradicionais ferramentas da tecnologia relacional (Moniruzzaman &

Hossain, 2013).

O termo Big data surgiu como referência a um conjunto de problemas derivados das

enormes quantidades de dados produzidos por empresas, organizações e pessoas

particulares. Posteriormente, passou a descrever “o conjunto de soluções que visam tratar

esses dados, desde o seu armazenamento até à transformação destes em informações

relevantes para auxiliarem os gestores nas tomadas de decisões” (Basso & Padua, 2014).

Purcell (2013) cita Manyiak et al. (2011) que referem que o nome Big data deriva do facto

dos datasets serem maiores que as tradicionais bases de dados, que não têm capacidade para

capturar, guardar, e analisar estes.

Segundo Vieira et al. (2012), Big data pode ser resumidamente definido como “uma coleção

de bases de dados tão complexa e volumosa que se torna muito difícil e complexo fazer

algumas operações simples (ex: remoção, ordenação, sumarização) de forma eficiente

utilizando Sistemas de Gestão de Bases de Dados tradicionais.” Também acrescenta que

engloba o processamento, de forma eficiente e escalável, de grandes volumes de dados

complexos produzidos por diversas aplicações.

Fundamentos Teóricos _______________________________________________________________________________

6

Segundo Alexandre e Cavique (2013), o fenómeno Big data assenta nos chamados 3V’s:

Volume: A necessidade de lidar, de forma sustentada, com o crescimento

exponencial de dados gerados;

Velocidade: A necessidade de processar os dados em tempo real, devido à

importância que isso tem para as organizações atuais;

Variedade: O facto dos dados se apresentarem nos mais variados formatos, alguns

deles dificilmente acomodáveis em estruturas rígidas como as disponibilizadas pelo

modelo relacional.

Segundo Vieira et al. (2012), pode-se resumir as características de Big data em quatro

propriedades:

Volume de dados na ordem de dezenas ou centenas de Terabytes;

Necessidade de escalabilidade horizontal;

Fácil distribuição dos dados e/ou processamento;

Vários tipos de dados, desde complexos e/ou semiestruturados.

Big data inclui três tipos de dados, sendo eles, dados estruturados, semi-estruturados e não

estruturados.

Purcell (2013) cita Morris & Rob (2013) que referem que dados estruturados são dados

formatados para utilizar nos sistemas de gestão de bases de dados. Já em relação aos dados

semi-estruturados refere que são uma forma de dados estruturados mas que não estão

formatados para os modelos relacionais. Em relação aos dados não estruturados, refere que

são dados que estão no formato com que são coletados, não estando formatados.

Purcell (2013) cita também Baltzan e Phillips (2012) que referem alguns exemplos destes

tipos de dados. Para os dados semi- estruturados aponta XML. Já para os dados não

estruturados refere pdf’s, email’s e documentos.

A quantidade de dados gerada diariamente está-se a tornar abismal, desde redes sociais,

web, entre outros. Isto leva a problemas ao nível do processamento, armazenamento e

manipulação de dados, que faz com que os sistemas relacionais não sejam os mais indicados

para lidar com o problema do Big data. Por essa razão foram então criados os Sistemas

NoSql, que dispõem de melhorias ao nível do armazenamento e processamento de grandes

quantidades de dados, quer estruturados quer não estruturados (Vieira et al., 2012).

O NoSql veio resolver o problema da grande quantidade de dados que são gerados e têm de

ser tratados. Para além disso deve-se levar em consideração a necessidade das organizações

manterem esses dados durante longos períodos de tempo (Alexandre & Cavique, 2013).

7

Fundamentos Teóricos _______________________________________________________________________________

2.2 Surgimento do conceito NoSql

Para entender melhor este novo conceito é importante perceber em que consiste uma base

de dados. Esta pode ser definida, muito simplesmente, como um repositório onde se

armazenam dados de vários tipos, interligados através de algum mecanismo que permita

manter as referências entre si.

Castro & Batista (2013) citam Korth et al. (1999) que refere que “é uma coleção de dados

inter-relacionados, representando informações sobre um domínio específico, ou seja,

sempre que for possível agrupar informações que se relacionam e tratam de um mesmo

assunto pode-se dizer que se possui uma base de dados.”

Castro & Batista (2013) citam também Date (2004) que acrescenta que o propósito principal

que era pretendido pelas bases de dados desde o seu aparecimento era oferecer recursos que

mantivessem os dados organizados e torná-los disponíveis, quando solicitados.

E.F.Codd propôs o modelo relacional em 1970. Na altura, este veio simplificar o

armazenamento de dados e o seu processamento, ao migrar os dados para tabelas

relacionadas entre si por campos comuns, manipulados por uma linguagem de alto-nível –

a SQL. O que o autor não previu foi que a quantidade de dados que se teria de armazenar no

futuro se tornaria gigantesca como é atualmente (Cardoso, 2012).

Em relação ao conceito de NoSql, este foi inicialmente usado em 1998 por Carlo Strozzi

para referir uma base de dados open source que não utilizava a referida interface SQL

(Abramova et al., 2014; Strauch, 2010).

Pozzani (2013) refere que esta tecnologia foi desenvolvida inicialmente na Google, com o

Bigtable, sendo que o primeiro research paper foi publicado em 2003.

Um dos primeiros movimentos de mudança em direção ao NoSql ocorreu em 2007, quando

a Amazon apresentou o NoSql Dynamo. Esta foi das primeiras empresas a guardar os seus

dados numa base dados de características não-relacionais (Leavitt, 2010).

A utilização do NoSql que reconhecemos atualmente remonta a um encontro no dia 11 de

junho de 2009, em San Francisco, organizado por Johan Oskarsson. O exemplo do Bigtable

e Dynamo inspirou muitos projetos com um armazenamento de dados alternativo. Sendo

assim, na sua passagem por San Francisco ele queria conseguir visitar todas as empresas

que introduziram este novo conceito, mas chegou à conclusão que era impossível, então

organizou uma conferência onde todas pudessem estar presentes. Ele pretendia que o nome

da conferência fosse curto e memorável e facilmente encontrado no Google, então foi-lhe

sugerido o nome “NoSql” (Grolinger et al., 2013; Sadalage & Fowler, 2012).

Este termo é utilizado como um acrónimo para “Not only Sql”, que realça que o estilo de

Fundamentos Teóricos _______________________________________________________________________________

8

consultas SQL, não é o objetivo crucial destas bases de dados (Grolinger et al., 2013).

Ainda neste ano começaram as primeiras conferências sobre NoSql e originou que as

pessoas começassem a falar mais deste tema (Stonebraker, 2010).

Atualmente são gerados enormes volumes de dados a todo o instante e por todo o tipo

dispositivos, desde eletrodomésticos inteligentes, até ao comércio online. Existem cada vez

mais sistemas ligados à internet que comunicam entre si. Nos últimos anos, os avanços nas

tecnologias da Web, o incremento na utilização das redes sociais e a proliferação de sensores

e dispositivos móveis conectados à internet, resultou na geração de imensos dados que

necessitam de ser armazenados e posteriormente processados.

Toth (2011) concorda, referindo que o crescimento da quantidade de dados e informação na

web é indiscutível e percetível de dia para dia. Entretanto, se as aplicações possuem um

grande volume de dados poderão vir a existir problemas em relação à infra-estrutura.

Strauch (2010) acrescenta que, com o aparecimento da web 2.0, empresas famosas como

Google, Amazon, entre outras, começaram a largar as tradicionais bases de dados relacionais

como a Oracle para começarem a construir os seus próprios sistemas, isto para armazenar

e processar grandes quantidades de dados.

Tomando como exemplo uma das maiores redes sociais do momento, o Facebook, só nesta

rede, 2.4 biliões de conteúdos são partilhados entre amigos todos os dias. (Grolinger et al.,

2013; Parikh, 2013) Neste tipo de contextos a tecnologia relacional começou a apresentar

limitações especialmente relacionadas com a escalabilidade e desempenho.

As novas exigências fizeram com que a indústria das TIC surgisse com novas propostas

para estes problemas, resultantes das limitações dos sistemas de armazenamento relacional.

Empresas como o Facebook e Google concluíram que seria impossível gerir grandes

quantidades de dados com as bases de dados relacionais e começaram então a procurar

soluções alternativas aos sistemas relacionais. A alternativa que surgiu denominou-se NoSql

(Cardoso, 2012; Guimarães et al., 2013; Hecht & Jablonski, 2011).

Alexandre & Cavique (2013) citam McCreary & Kelly (2013) que concordam e referem

também que com o surgimento de tantas fontes de dados e a necessidade de processar toda

esta informação surgiu o conceito NoSql.

No entanto, ainda muita gente refere que existe uma carência de estudos que comprovem a

real eficácia do modelo NoSql perante o paradigma relacional. Já Rob, Coronel e Crockett

(2013) discordam e referem a tecnologia não relacional como o maior avanço para o

utilizador comparado com o modelo tradicional de armazenamento.

9

Fundamentos Teóricos _______________________________________________________________________________

Frozza et al. (2011) citam Tiwari (2011) que descreve o conceito da seguinte forma, o

modelo NoSql “é uma tendência que tende a superar o homólogo modelo relacional no que

se refere a escalabilidade horizontal e disponibilidade.”

Guimarães et al. (2013) citam Redmond e Wilson (2012) que referem que as bases de dados

NoSql foram criadas para ir de encontro às necessidades que surgiram com o aumento da

quantidade e diversidade de dados das aplicações atuais, que não são completamente

resolvidas pelas bases de dados relacionais, uma vez que estas aplicações exigem cada vez

mais espaço de armazenamento.

As organizações estão cada vez mais dependentes dos dados para competirem no mercado,

sendo assim, capturar e analisar dados, tornaram-se as chaves para o sucesso no negócio em

vez de ser um custo a minimizar (Indrawan-Santiago, 2012). Esta nova tecnologia veio

fornecer escalabilidade e agilidade aos sistemas, pois já careciam bastante destas

propriedades.

Para Pozzani (2013), NoSql representa uma nova encarnação, e justifica referindo que é

devido à grande escalabilidade das aplicações da internet e por estas se basearem em

computação distribuída e paralela.

Mas o desempenho não é importante por si só, a disponibilidade também é um requisito

considerado importante. Por isso, a Amazon oferecia disponibilidade de serviço de 99,9%

durante um ano (DeCandia et al., 2007; Hecht & Jablonski, 2011).

O fator vital para a mudança no armazenamento de dados era a necessidade de suportar

grandes volumes de dados em clusters, sendo que, bases de dados relacionais não foram

concebidas para correr eficientemente nestes (Sadalage & Fowler, 2012).

Diferentemente das bases de dados relacionais que, de uma forma ou outra, são todas

relativamente semelhantes, a área das bases de dados NoSql caracteriza-se por possuir

diferentes tipos que variam muito entre si, tendo cada uma as suas próprias caraterísticas e

finalidades (Vieira et al., 2012).

A tecnologia NoSql não foi criada com o intuito de substituir o modelo relacional mas sim

preencher uma necessidade do mercado que este não servia adequadamente.

2.3 NoSql

NoSql é um termo utilizado para descrever uma classe de tecnologias que fornecem uma

alternativa para o armazenamento de dados em comparação com os sistemas de gestão de

bases de dados relacionais. Caracterizam-se por fornecer soluções efetivas de baixo custo

para os problemas de disponibilidade e escalabilidade (Schram & Anderson, 2012).

Fundamentos Teóricos _______________________________________________________________________________

10

Segundo Cardoso (2012), “NoSql é uma coleção de produtos e conceitos sobre a

manipulação de grandes volumes de dados sem usar unicamente SQL”. Já para Pozzani

(2013) “é um termo para todas as bases de dados e armazenamentos de dados que não

seguem os princípios dos sistemas de gestão de bases de dados relacionais”.

Inicialmente, o termo NoSql era suposto significar “No Sql”, mas devido a poucos sistemas

eliminarem completamente a tecnologia relacional, foi então atualizado para “not only Sql”

(Schram & Anderson, 2012). Esta tecnologia é uma alternativa viável relativamente às bases

de dados relacionais, pois garante melhor desempenho nas consultas enquanto mantêm um

certo grau de escalabilidade e flexibilidade (Lee et al., 2013).

A internet e a cloud computing evoluíram bastante e, assim, várias aplicações emergiram, o

que forçou uma evolução ao nível das tecnologias de bases de dados, para responder aos

novos desafios:

Grandes níveis de concorrência na leitura e escrita de dados;

Para não defraudar as expectativas dos utilizadores, as bases de dados têm de

fornecer tempos de resposta suficientemente baixos;

Armazenamento de grandes volumes de dados (Big data) eficiente e com

determinados requisitos de acesso;

Aplicações muito exigentes em termos de processamento, como motores de pesquisa

e plataformas para redes sociais, têm de responder em tempo útil às solicitações de

milhões de utilizadores;

Para além da escalabilidade é fundamental uma alta disponibilidade;

Cada vez mais o volume de dados e os pedidos concorrentes aumentam, pelo que as

bases de dados necessitam de ser facilmente expandidas sem interrupções;

A juntar a tudo isto, exigem-se baixos custos de gestão e operação das soluções.

Já Stonebraker (2009) aponta as seguintes razões que levaram à adoção das bases dados não

relacionais:

Flexibilidade: Podem existir dados que não se adaptam aos rígidos modelos

relacionais e neste caso deveria existir mais flexibilidade.

Desempenho: Dados em vários sites têm dado problemas na gestão de dados

distribuídos nas aplicações (Stonebraker, 2009; Strauch, 2010).

Mesmo que não exista um consenso no que exatamente constitui uma solução NoSql, o

seguinte conjunto de caraterísticas é normalmente atribuído a estas: (Grolinger et al., 2013)

São completamente livres de esquemas, de modo a lidarem com uma grande

11

Fundamentos Teóricos _______________________________________________________________________________

variedade de tipos de dados;

Possibilitam escalar horizontalmente as soluções através da adição incremental de

novos nodos (commodity servers);

Focadas na disponibilidade e na tolerância ao particionamento. Sendo assim, estão

apontadas para cenários de alta distribuição. Portanto, escolhem comprometer a

consistência em favor da disponibilidade;

Normalmente, não suportam transações ACID como são fornecidas pelas

relacionais, sendo assim são muitas vezes referidas como sistemas BASE (Pritchett,

2008). No entanto, algumas bases de dados NoSql como o CouchDB fornecem

ACID.

Este tipo de tecnologia possui uma caraterística chave que é o facto de conseguirem escalar

horizontalmente, isto é, replicando e particionando dados através de vários servidores. Isto

permite que esta tecnologia suporte um grande número de operações simples de leitura e

escrita por segundo (Cattell, 2011).

Como já foi referido anteriormente, estas bases de dados vieram responder a várias

necessidades, mas um dos maiores desafios que enfrentam é a consistência. Quando se

abordar num próximo tópico o teorema CAP e Eventually Consistency, irá perceber-se o

tipo de consistência que é necessária no sistema.

Estas bases de dados NoSql, em comparação à tecnologia relacional, diferem na medida em

que não são construídas em tabelas e não utilizam a linguagem Sql para a manipulação de

dados. Os sistemas de gestão de bases de dados NoSql são ótimos quando se trabalha com

uma grande quantidade de dados, em que estes, devido à sua natureza não necessitam de um

modelo relacional (Moniruzzaman & Hossain, 2013). Sendo assim, a sua principal

vantagem é conseguirem lidar com dados não estruturados. Como são distribuídas, pode-se

aumentar o desempenho distribuindo a carga por várias máquinas que não custam tanto

como comprar uma máquina mais poderosa. Portanto, são ideais para lidar com grandes

volumes de dados (Cardoso, 2012; Moniruzzaman & Hossain, 2013).

Este tipo de tecnologia começa a encontrar-se em operação em grandes centros de dados,

onde as falhas são uma ocorrência constante, tanto devido a problemas de disco como

comunicação de rede. Esta tecnologia torna-se apropriada nesses contextos já que possui

recursos para permitir a replicação de dados em várias máquinas, o que se traduz num

aumento da disponibilidade dos sistemas (Queiroz et al., 2013).

Estão também desenhados para escalar para milhares ou até milhões de utilizadores em

simultâneo (Moniruzzaman & Hossain, 2013).

Fundamentos Teóricos _______________________________________________________________________________

12

2.3.1 Teorema CAP

O CAP (Consistency, Availability, Partition tolerance) foi introduzido em 2000 pelo

cientista de computação Eric Brewer (2000) como uma conjetura e foi formalmente provado

em 2002 por Seth Gilbert e Nancy Lynch (2002), sendo assim, estabelecida como teorema

(Cardoso, 2012; Silva, 2011).

Toth (2011), Sousa (2010), Brewer (2000) e Lynch (2002) referem que o teorema CAP,

enquadrando-se na área da computação distribuída, assenta em três requisitos que

descrevem da seguinte forma:

Consistência: Todos os nós de um sistema distribuído necessitam que a versão dos

dados que armazenam seja a mesma;

Disponibilidade: Ainda que um nó da rede esteja desligado, todos os clientes podem

encontrar, sempre que pretenderem, pelo menos uma cópia dos dados que

necessitam;

Tolerância ao particionamento: Caso o sistema seja implementado em servidores

diferentes, continua com os seus dados, propriedades e caraterísticas, sempre

transparentes para o cliente.

Já de acordo com Ferreira (2012), para um sistema distribuído ser consistente, todos os

clientes devem visualizar dados consistentes, independentemente de atualizações e

remoções. Para fornecer disponibilidade, todos os clientes devem sempre ser capazes de ler

e escrever dados mesmo que um nodo falhe. Para ser tolerante ao particionamento deve

continuar a funcionar como planeado, independentemente da rede ou perda de mensagens.

Na figura seguinte estão representadas as combinações possíveis.

Figura 1 - Teorema CAP (Retirado de Indrawan-Santiago, 2012, pag.47)

13

Fundamentos Teóricos _______________________________________________________________________________

Segundo Cardoso (2012), Toth (2011), Pozzani (2013) e Vieira et al. (2012), de acordo com

este teorema, num sistema de dados distribuído, é impossível ter ao mesmo tempo estes três

requisitos, sendo que apenas é possível ter dois deles ao mesmo tempo, o que leva a escolher

qual dos três requisitos é o menos necessário.

Pozzani (2013) refere as três combinações possíveis da seguinte forma, isto quando uma

caraterística é comprometida.

Comprometer a disponibilidade:

Escolha habitual para bases de dados relacionais com escalabilidade horizontal;

Disponibilidade é afetada por vários fatores entre os quais:

o Atrasos devidos a lag na rede;

o Escassez de recursos;

o Falha de Hardware que leva a fragmentações.

Comprometer a Tolerância ao particionamento:

Uma moderna interpretação deste teorema é, por exemplo, durante uma falha de

rede, um sistema distribuído ter de escolher entre disponibilidade e consistência;

Um sistema que não tiver tolerância ao particionamento é forçado a desistir da

consistência ou disponibilidade durante uma falha.

Comprometer a Consistência:

Sendo assim vamos ter fraca consistência, mas é possível aceitar Eventual Consistency, que

pode ser interpretada de duas formas:

Dado um período de tempo suficiente, onde nenhuma atualização foi enviada, pode-

se esperar que todas as atualizações vão, eventualmente, propagar-se pelo sistema e

todas as réplicas serão consistentes;

Na presença de contínuas atualizações, uma atualização aceite, eventualmente atinge

a réplica ou esta retira-se do serviço.

Eventual Consistency leva-nos para o conceito BASE que irá ser abordado no seguinte

ponto. Segundo Dimitrov (2010), as combinações possíveis dos três requisitos processa-se

da seguinte forma:

CA - Consistência e Disponibilidade

o Clusters únicos, fácil de assegurar devido a todos os nodos estarem sempre

em contacto;

o Exemplo: 2 PC;

o Quando um particionamento ocorre o sistema bloqueia.

CP - Consistência e Tolerância ao particionamento

Fundamentos Teóricos _______________________________________________________________________________

14

o Alguns dados podem ser inacessíveis (disponibilidade sacrificada), mas o

resto é consistente;

o Exemplo: sharded database.

PA - Disponibilidade e Tolerância ao particionamento

o Sistema está disponível mesmo durante o particionamento, mas alguns

dados podem-se revelar inconsistentes;

o Exemplo: DNS, caches, Master/Slave replication;

o Necessita de alguma estratégia de resolução de conflitos.

Sadalage e Fowler (2012) descrevem de uma maneira bastante simples e percetiva os

sistemas que utilizam a combinação da consistência com a disponibilidade. É fácil quando

se está perante máquinas individuais, pois elas não podem ter particionamentos, sendo

assim, não é necessário haver preocupações com o requisito tolerância ao particionamento,

pois só existe um nodo. Este é o conjunto de requisitos da maioria das bases de dados

relacionais.

Tipicamente as bases de dados NoSql são PA (Partition tolerance/Availability) enquanto a

maioria das relacionais são CA (Consistency/Availability).

2.3.2 BASE Vs ACID

Enquanto o ACID fornece um conjunto de propriedades que garantem que as transações das

bases de dados são processadas com confiança, o oposto modelo BASE, que é derivado

diretamente do teorema CAP, aponta para fornecer um diferente conjunto de propriedades

das que o ACID fornece (Silva, 2011).

2.3.2.1 Modelo ACID

O acrónimo ACID significa, Atomicity, Consistency, Isolation e Durability, é usado pela

generalidade dos sistemas de gestão de base de dados para assegurar a integridade na base

de dados. As suas caraterísticas constituintes significam o seguinte:

Atomicity: Caso exista uma falha na transação, o efeito das suas operações não é

aplicado na base de dados;

Consistency: A integridade da base de dados é garantida no final da execução de

uma transação;

Isolation: O resultado de uma execução de uma transação concorrente é o mesmo

do que uma transação isolada;

Durability: Após a confirmação de uma transação, mesmo que ocorram falhas os

15

Fundamentos Teóricos _______________________________________________________________________________

resultados são refletidos na base de dados.

ACID fornece um conjunto de propriedades que garantem que as transações das bases de

dados são processadas com confiança e que a base de dados é consistente em acessos

concorrentes e falhas do sistema (Silva, 2011).

2.3.2.2 BASE

Em relação ao modelo BASE, Toth (2011) refere que para que seja possível trabalhar com

um sistema distribuído foi proposto enfraquecer ou relaxar o requisito de consistência

permanente de dados, focando antes na disponibilidade e na tolerância ao particionamento.

Deste modo surge o conceito BASE (Basically Available, Soft state, Eventual consistency)

com propriedades e filosofia oposta.

O mundo NoSql aponta este teorema, referindo a razão pela qual se deve relaxar na

consistência.

Neste sistema não existem transações e são introduzidas ligações no modelo de dados para

permitir melhores esquemas de particionamentos (Moniruzzaman & Hossain, 2013).

Toth (2011) refere ainda que é considerado um cenário que lida bem com transações

distribuídas, tolerância a falhas de consistência e replicação otimista num sistema

distribuído.

Vieira et al. (2012) assim como Toth (2011), referem que o paradigma BASE foi criado a

partir do teorema CAP. O primeiro autor ainda refere que o facto de não se controlar a

consistência, faz com que exista uma sensível diminuição no custo computacional para a

garantia de consistência dos dados em relação às bases de dados relacionais. Já o segundo

autor refere que este modelo de consistência está normalmente associado a sistemas

distribuídos. Refere também, que todas as atualizações pendentes serão propagadas por

todos os nós do sistema, caso durante um determinado tempo não existam atualizações,

ficando assim no fim, todo o sistema consistente. A partir deste conceito vários tipos de

bases de dados NoSql foram criadas, que, como já foi referido não garantem

temporariamente consistência dos dados de uma aplicação. Toth (2011) refere grandes

empresas como a Google e a Amazon, que aproveitaram a vantagem deste paradigma, isto

porque utilizaram um modelo NoSql, aplicado ao conceito de distribuição horizontal. Como

não existe garantia de consistência, as configurações de fragmentação no modelo são mais

fáceis de efetuar e, por conseguinte, o modelo torna-se mais escalável e com custos mais

reduzidos.

Por exemplo, a maioria dos sistemas são chamados “Eventually consistent”, que significa

Fundamentos Teóricos _______________________________________________________________________________

16

que as atualizações são eventualmente propagadas em todos os nodos (Cattell, 2011).

Eventual Consistency é uma forma específica de fraca consistência (Vogels, 2009). Um

sistema distribuído que forneça Eventual Consistency garante que, quando nenhuma

atualização seja feita num registo, eventualmente o sistema será consistente (exemplo: todos

os nodos do sistema aguentarão eventualmente os mesmos valores, embora possa não ser

necessário, e todos os acessos de leitura serão retornados ao ultimo valor atualizado (Silva,

2011). Agora considerando um exemplo real, considerando duas pessoas que querem

atualizar um número de telefone ao mesmo tempo. Um atualiza e outro atualiza logo a

seguir, senão existisse controlo de concorrência um era atualizado e o outro era atualizado

por cima do primeiro.

As maneiras para manter consistência nestes casos chamam-se otimista e pessimista. A

maneira pessimista trabalha para prevenir que conflitos ocorram, já a otimista deixa os

ocorrer, deteta-os e depois toma medidas para os tratar (Sadalage & Fowler, 2012).

Resumindo, “Basically Available” significa que as bases de dados estão disponíveis sempre

que são acedidas, mesmo que uma parte esteja indisponível. “Soft State” diz que não

precisam sempre de ser consistentes e podem tolerar inconsistência por um certo período de

tempo; e “Eventual Consistency” enfatiza que, depois de um certo período de tempo, a base

de dados vem para um estado de consistência.

2.3.3 Caraterização das Bases de dados NoSql

2.3.3.1 Schema-Free

Segundo Rybinski (1987) e Imielinski & Lipski (1982), schema é um conjunto de fórmulas

que descrevem a base de dados e as relações de acordo com a sua sintaxe. Esta estrutura

provém da normalização que, segundo Codd (1970) citado por Cardoso (2012), é “o

processo de simplificação e organização dos campos e das tabelas de uma base de dados de

forma a reduzir a redundância dos dados”.

Cardoso (2012) refere que a normalização é importante numa base de dados, pois garante

que nas tabelas possam ser inseridos dados sem anomalias (inconsistência de dados,

redundância, etc). Jacobs (2009) também salienta que à medida que a quantidade de dados

aumenta numa tabela, a base de dados tende a ficar mais lenta. Sendo assim, Schrage (2002)

refere que para ganhar rapidez de leitura/obtenção de dados, abdica-se da normalização.

Segundo Cardoso (2012), ao ganhar esta rapidez também se ganha redundância nos dados

e uma maior interdependência entre os mesmos. No entanto, ainda existem alguns

17

Fundamentos Teóricos _______________________________________________________________________________

problemas inerentes à normalização ou à obrigação de possuir um schema, que é o caso de

todos os dados terem de obedecer àquela estrutura e caso necessite de modificações por

mais pequenas que sejam, podem obrigar a uma restruturação tão grande que pode vir a

obrigar a uma restruturação da aplicação que utiliza a base de dados.

Em relação ao Schema-Free pode-se referir como uma base de dados sem estrutura fixa, ou

seja, os dados não necessitam de obedecer a uma estrutura previamente definida. Sendo

assim, já é permitido um armazenamento de dados não estruturados em qualquer formato,

o que garante um bom desempenho para os desafios do Big data (Almeida & Brito, 2012).

Cardoso (2012) cita Stainer (2010) que refere que o facto de não possuir um schema também

traz desvantagens, como é o caso da possibilidade de possuir dados redundantes e até

incoerentes. Cardoso (2012) refere que a garantia das propriedades ACID deixa de ser válida

devido à inexistência de um schema, o que leva a um modelo diferente chamado BASE, o

qual foi abordado anteriormente.

Cardoso (2012) cita Brewer (2000) que refere que isto é necessário, pois abrindo mão da

consistência dos dados ganha na tolerância a falhas e na disponibilidade, que são bastante

importantes para lidar com grandes volumes de dados.

Por exemplo, Tweets e atualizações de estado nas redes sociais podem ser inconsistentes,

mas o sistema deve ter sempre alto desempenho e alta disponibilidade. Já nas aplicações

que lidam com finanças a consistência é a caraterística mais importante, portanto os sistemas

BASE não são os mais indicados para instituições bancárias (Hecht & Jablonski, 2011).

Os sistemas NoSql não assentam completamente em ACID ou BASE, isto porque, a maioria

das bases de dados permite personalizar a consistência e a disponibilidade de acordo com

as necessidades de cada um (Hecht & Jablonski, 2011).

2.3.3.2 MapReduce

MapReduce é uma tecnologia criada pela Google para dar resposta ao tratamento do enorme

volume de dados com que esta tem de lidar diariamente. Segundo Dean & Ghemawat

(2004), “é um modelo de programação e uma implementação associada ao processamento

e gestão de grandes datasets”. Refere também que é uma framework de programação que

processa datasets de grande porte com hardware regular.

Cardoso (2012) cita White (2012) que refere que é um modelo de dados para processamento

paralelo.

Esta tecnologia foi proposta inicialmente para tornar mais simples o processamento de

grandes volumes de dados em arquiteturas paralelas e distribuídas, como é o caso dos

Fundamentos Teóricos _______________________________________________________________________________

18

clusters. Sendo assim, é utilizado nestes e os dados são distribuídos e armazenados

utilizando pares <key, value>, onde, para a mesma chave, vários valores podem ser

armazenados. Portanto, a tecnologia MapReduce é ideal para lidar com o processamento

intensivo de grandes quantidades de dados pois é uma abordagem bastante escalável. Isto

porque a alocação dos dados no mesmo nó confere alto desempenho a esta tecnologia

(Vieira et al., 2012).

Segundo Alexandre e Cavique (2013), é um conjunto de processos que permite tratar um

grande volume de dados de forma distribuída. Refere que duas operações estão subjacentes

a esta tecnologia, o Map e o Reduce.

Em relação ao Map trata-se de dividir o problema em subconjuntos mais pequenos que

possam ser distribuídos por outros nós do cluster. Já o Reduce pega em todos os

subconjuntos de dados, agrega e trata a informação e responde ao problema original.

Cardoso (2012) concorda e refere que o MapReduce assenta em dois grandes conceitos:

Uma função de Map, que tem como objetivo separar os grandes volumes de dados

em pedaços mais pequenos;

Uma função de Reduce, que tem como objetivo processar e agrupar todos os

pequenos fragmentos dos dados.

Segundo Vieira et al. (2012), em relação ao aspeto do processamento dos dados, a tecnologia

utilizada pelos produtos NoSql é o MapReduce. Segundo o autor também se divide em dois

grandes conceitos, sendo eles:

Map, que tem como objetivo mapear e distribuir os dados pelos diversos nós de

processamento e armazenamento;

Reduce, que tem como objetivo agregar e processar os resultados parciais para gerar

um resultado final.

Como é possível verificar-se na imagem abaixo, os dados são divididos em pequenos

pedaços e, com a função reduce, são processados e agrupados.

19

Fundamentos Teóricos _______________________________________________________________________________

Figura 2 - Fluxo do funcionamento do Map Reduce (Retirado de Alexandre & Cavique, 2013,pag.41)

Cardoso (2012) cita Dean & Ghemawat (2004) que referem que o que aconteceu na

implementação do Google foi pegar num cluster típico e escolher um nó que seria o Master

e que iria receber o dataset gigantesco. Posto isto, divide os dados por algumas máquinas

que tomaram o papel de map workers e executaram a função de map aos dados que lhe

foram atribuídos. De seguida, os map workers notificaram o Master de que a função de map

estava concluída, o Master pôde delegar num ou mais reduce workers o trabalho de obter

os dados previamente mapeados pelo map worker e lhes aplicar a função de reduce. Por

fim, os dados estão processados

Caso de aplicação Map/Reduce

Figura 3 - Exemplo MapReduce (Adaptado de Bonnet et al., 2011,pag.486)

Em relação aos pontos (3), (4) e (5) pode-se visualizar na imagem seguinte como são

processados (Bonnet et al., 2011).

Fundamentos Teóricos _______________________________________________________________________________

20

Pode-se considerar que está relacionado com o poder de processamento existente em

ambientes Cloud. Ambientes MapReduce têm maior facilidade no carregamento de

informações quando comparados com ambientes das bases de dados relacionais, pois os

dados são armazenados no seu estado original, enquanto na tecnologia relacional a

transformação dos dados é feita no momento do processamento das consultas (Vieira et al.,

2012).

Outro exemplo é o caso do Hadoop, que para processar dados semi-estruturados e não

estruturados, utiliza este paradigma, em que localiza todos os dados relevantes e depois

seleciona apenas os dados que respondem à consulta (Purcell, 2013).

2.3.3.3 Escalabilidade

Clarck (2009) define escalabilidade como “alterar o tamanho enquanto mantém

proporções”.

Já Forbes (2010) refere que escalabilidade é “Pragmaticamente a medida da capacidade de

uma solução de crescer para o mais alto nível de uso realista de um modo possível, mantendo

ao mesmo tempo os níveis de serviço aceitáveis”.

Strauch (2010) cita.Clarck (2009) que acrescenta que escalar não está relacionado com ser

rápido mas sim com tamanho. Algum sistema que tenha alto desempenho não necessita de

escalar.

Existem duas formas de escalar sendo elas:

Escalar verticalmente: aumentar a capacidade do servidor, é limitada e tem custos

elevados. Esta está relacionada, segundo Vieira et al. (2012) com o uso de vários

núcleos/ CPU que compartilham memória e discos.

Figura 4 - Fluxo de uma execução MapReduce (Retirado de Bonnet et al.,

2011,pag.486)

21

Fundamentos Teóricos _______________________________________________________________________________

Escalar horizontalmente: aumentar o número de servidores tendo como beneficio

a facilidade na distribuição dos dados e existe distribuição de dados e carga por

vários servidores mas, contrariamente à escalabilidade vertical, sem haver partilha

de memória ou disco. Permite também o uso de hardware mais barato e comum

(Castro & Batista, 2013).

Opostamente às bases dados relacionais, as bases dados NoSql escalam melhor

horizontalmente e não necessitam de grande disponibilidade de hardware. Pode-se

simplesmente adicionar ou retirar mais máquinas sem comprometer o cluster (Strauch,

2010).

Esta capacidade de escalar horizontalmente é uma das principais caraterísticas do NoSql.

Segundo Vieira et al. (2012), isto permite que um grande volume de operações de

leitura/escrita sejam executadas muito mais eficientemente.

Como já foi abordado anteriormente, as bases de dados relacionais têm problemas com

escalabilidade, nomeadamente escalabilidade dinâmica que é uma propriedade fundamental

no ambiente Cloud. Para estas bases de dados apenas escalabilidade vertical é fácil de ser

atingida, sendo assim, os custos associados chegam a ser exorbitantes.

Vieira et al. (2012) refere então que o facto de um modelo único de SGBD contemplar todos

os modelos de dados, vai contra o contexto de Big data. Isto porque, por um lado, os

produtos relacionais oferecem diversas funcionalidades de extensão, mas, por outro lado, os

custos de manutenção tornam-se inviáveis, pois a maioria das soluções são caras.

Frequentemente, uma base de dados está ocupada porque várias pessoas estão a aceder a

diferentes partes do conjunto de dados. Nestas circunstâncias podemos suportar

escalabilidade horizontal pondo diferentes partes dos dados em diferentes servidores

(Sadalage & Fowler, 2012).

2.3.3.4 Sharding

Segundo Bell et al. (2010), sharding consiste em dividir os dados em fragmentos

independentes pelos nós existentes, o que faz que quando um cliente necessite dos dados

seja redirecionado para o nó que os contém.

Para Shawrtz et al. (2012) é o processo em que se divide os dados em pequenos bocados e

se armazenam posteriormente em diferentes nós.

Já Cardoso (2012) cita Warden (2011) que defende que é o esquema usado para decidir em

que máquina (nó) os pedaços de informação de uma base de dados vão residir.

E segundo Vieira et al. (2012) é uma técnica de partição horizontal dos dados numa

Fundamentos Teóricos _______________________________________________________________________________

22

arquitetura, mas sem compartilhamento de recursos. Nesta técnica refere que os dados são

divididos por registos em vez de serem divididos por colunas.

Como é possível visualizar na imagem seguinte, a informação é dividida por outros nós.

Bell et al. (2010) refere algumas razões para se efetuar sharding à base de dados, sendo elas:

Os dados serem colocados geograficamente mais perto do utilizador;

Facilitar a pesquisa através da redução do tamanho do Dataset;

Dividir ainda mais os fragmentos que estejam a ser muito utilizados de forma a

equilibrar a carga do sistema.

Existem inúmeras vantagens usando esta técnica. Uma delas é em cada tabela do servidor,

o número total de linhas é reduzido, isto porque as tabelas estão divididas e distribuídas em

vários servidores. Sendo assim, também o tamanho dos índices são reduzidos, o que

geralmente melhora o desempenho de consultas. Outra vantagem é que a base de dados pode

ser separada por diferentes máquinas, isto onde o shard foi implementado, e vários shards

podem ser alocados em diferentes máquinas (Vieira et al., 2012). Portanto, o desempenho

aumenta pois a base de dados está distribuída por várias máquinas.

Existem também algumas desvantagens. Cardoso (2012) refere uma que ele considera a

mais evidente que “é a mudança de um dataset que vem de uma base de dados não

distribuída para um que venha de uma base de dados distribuída em shards.” Segundo

Shawrtz et al. (2012), existem também algumas questões na mudança dos fragmentos de um

nó para o outro.

Para Vieira et al. (2012) o problema do sistema Master Slave é caso existam mais pedidos

de escrita do que uma máquina pode lidar, o que leva à necessidade de efetuar sharding.

Figura 5 - Exemplo de sharding (Retirado de Cardoso, 2012,pag.25)

23

Fundamentos Teóricos _______________________________________________________________________________

Nesta, estruturas completamente isoladas são postas num servidor por ordem alfabética. Na

figura 5 é mostrado um exemplo de todos os nomes dos clientes começados por A-M são

postos num único servidor e N-Z são postos noutro servidor. Isto certamente pode lidar com

o dobro da carga de trabalho. Similarmente pode haver “n” números de máquinas

adicionadas para facilitar a carga de trabalho (Tauro et al., 2012).

Figura 6 - Exemplo de sharding de um carrinho e compras (Retirado de Tauro et al., 2012,pag.2)

2.3.3.5 Segurança

Segurança é um aspeto importante das bases de dados que é valorizado pela maioria destas.

Sendo assim, irão ser avaliados os vários tipos de bases de dados nos seguintes aspetos de

segurança:

Autenticação: São mecanismos que identificam utilizadores que acedem aos dados.

São associadas passwords a logins, mas também são possíveis mecanismos mais

sofisticados, como certificados. Segundo Grolinger et al. (2013), para muitas

empresas um requisito importante para a autenticação é a capacidade de integração

com o sistema de diretório de utilizadores da empresa como o Lightweight Directory

Access Control (LDAP)/Active Directory and Kerberos servers.”;

Autorização: É a capacidade de assegurar um controlo de acessos aos recursos das

bases de dados. O objetivo é associar a cada utilizador um conjunto de permissões.

Por exemplo, em algumas bases de dados pode-se atribuir permissões específicas

para pedidos de leitura e escrita nas tabelas, execução de funções de administração

e criação de utilizadores;

Encriptação: É um mecanismo que tem como objetivo encriptar dados, para assim

não poderem ser lidos por “attackers” e outras pessoas não autorizadas. De acordo

com Grolinger et al. (2013), “uma solução de uma completa encriptação deve estar

Fundamentos Teóricos _______________________________________________________________________________

24

presente em pelo menos três diferentes níveis:

o Data at rest: Dados armazenados em disco podem ser lidos se um “attacker”

tiver acesso ao sistema de ficheiros dos servidores. Um mecanismo de

encriptação Data at rest garante que os dados dos utilizadores são

automaticamente encriptados quando escritos nesses ficheiros e

desencriptados quando recuperados;

o Client-to-server communication: A maioria das bases de dados permite

conexões remotas de utilizadores e aplicações para que os dados

armazenados possam ser obtidos. Este fluxo de dados deve também ser

encriptado para garantir uma comunicação privada e segura;

o Server-to-server connections: Porque muitas bases de dados NoSql incluem

algum tipo de replicações e funcionalidades de processamento distribuído,

comunicações através dos nodos do servidor podem também ser um fator

para obter acesso não autorizado aos dados. Um mecanismo de encriptação

servidor- servidor garante que estes fluxos não possam ser lidos;”

Auditoria: Funcionalidades de auditoria estão relacionadas com a criação de um

caminho de auditoria que tem como objetivo analisar registos de eventos que

ocorreram numa base de dados. Esta caraterística tem bastante importância, por

exemplo, numa análise forense de eventos de segurança.

Na tabela seguinte é apresentado o conjunto de caraterísticas de segurança encontradas nas

diversas soluções NoSql. Segundo Grolinger et al. (2013), “é possível afirmar que as

caraterísticas de segurança das soluções NoSql não são tão maduras como as incluídas nas

bases de dados relacionais”. Bases de dados NoSql como o Redis, Memcached, Voldemort,

e Riak, estão apontados para a sua utilização ser apenas em ambientes em rede. Sendo assim,

é assumido que o administrador de rede tem de assegurar que apenas aplicações autorizadas

têm acesso à base de dados, utilizando mecanismos como firewalls ou a adoção de virtual

private networks (VPN).

É de salientar que nem todas as bases de dados possuem caraterísticas de auditorias e,

quando possuem, são muito simples e não podem ser customizadas.

Bases de dados NoSql como o MongoDB e o Cassandra oferecem funcionalidades de

segurança adicionais nas suas edições empresariais, isto revela que a segurança é uma

preocupação relevante para as grandes empresas. Por exemplo, apenas no Cassandra

enterprise edition estão presentes mecanismos de encriptação data at rest e funcionalidades

25

Fundamentos Teóricos _______________________________________________________________________________

de auditoria.

NoSql

Databases

Encriptação Data at Rest Client/Server Server/Server

Autenticação Autorização Auditoria

Redis Não Não Não Apenas para

o

administrador

Não Não

Memcached Não Não Não Sim Não Não

Voldemort Sim Não Não Não Não Não

Riak Não Sim Sim Não Não Não

Cassandra Sim, na

enterpris

e edition

Sim Sim Sim Sim Sim, na

enterprise

edition

HBase Não Sim Sim Sim Sim Não

DynamoDB Não Sim Não Sim Sim Sim

SimpleDB Não Sim Não Sim Sim Não

MongoDB Não Sim Sim Sim Sim Não

CouchDB Não Sim Sim Sim Sim Não

Couchbase

Server

Não Não Não Sim Não Não

Neo4J Não Sim Não Não Não Não

Hyper

graphDB

Não Não Não Não Não Não

Allegro

Graph

Não Sim Não Sim Sim Sim

Tabela 1- Comparação dos tipos de bases de dados NoSql em termos de segurança (Adaptado de Grolinger et al., 2013,

pag.17)

2.3.4 Tipos de Bases de Dados NoSql

Segundo Toth (2011), Bonnet et al. (2011) e Guimarães et al. (2013), os principais tipos de

bases de dados NoSql são:

Document Databases, que têm como finalidade armazenar documentos em coleções,

coleções estas que contêm objetos idênticos. Não possuem esquema e campos

podem ser dinamicamente adicionados a um documento. (ex. CouchDB e

MongoDB);

Key Values Databases, que têm como finalidade armazenar os dados como chaves

e valores (ex. Riak, Redis e DynamoDB);

Graph Databases, que têm como finalidade armazenar relacionamentos entre os

dados (ex. Neo4J e OrientDB);

Column-based Databases, que têm como finalidade armazenar os dados como

triplas contendo linha, coluna e rótulo de tempo (ex. Cassandra, HBase).

2.3.4.1 Key Value Databases

As Key value databases são as que menos se assemelham com as bases de dados relacionais,

Fundamentos Teóricos _______________________________________________________________________________

26

isto porque não possuem esquemas nem coleções (Atzeni et al., 2013).

Almeida & Brito (2012) citam Lóscio et al. (2011) que referem que é uma “base de dados

composta por um conjunto de chaves, às quais estão associadas um único valor, que pode

ser uma string ou um binário”.

Toda a base de dados assemelha-se com um mapa ou dicionário que contém objetos

chamados valores, cada um identificado por uma chave única (Atzeni et al., 2013; Hecht &

Jablonski, 2011). Estes valores são isolados e independentes uns dos outros e, por isso, as

relações devem ser tratadas pela lógica da aplicação. Em relação às chaves, estas são a única

maneira para recuperar dados guardados. Possuem uma simples estrutura de dados, sendo

assim são livres de esquemas. Também permitem que novos valores de qualquer tipo

possam ser acrescentados em tempo real, sem que qualquer tipo de conflito com outros

dados armazenados aconteça e sem influenciar a disponibilidade do sistema.

Para ser possível adicionar algum tipo de estrutura no modelo de dados é necessário utilizar

o grupo de pares de chave-valor (Hecht & Jablonski, 2011).

O modelo de dados das Key Value Databases significa que um valor corresponde a uma

chave. Embora a estrutura seja simples, a velocidade de consulta é maior que nas bases de

dados relacionais, suporta grande armazenamento e alta concorrência. Fornece suporte para

consultas e operações de modificação através da chave primária (Han et al., 2011).

Estas bases de dados representam um “balde de dados”. Por exemplo, num caso de um

carrinho de compras mencionado na figura seguinte, onde se pode visualizar uma chave

ligado a um valor que contém dados de encomendas (Tauro et al., 2012).

Figura 7 - Exemplo de uma chave ligada a um valor (Retirado de Sadalage & Fowler, 2012,pag.58)

27

Fundamentos Teóricos _______________________________________________________________________________

Estas bases de dados são úteis quando se lida com operações simples, que são baseadas

apenas em atributos chave. (Hecht & Jablonski, 2011) É inviável neste modelo de dados

efetuar consultas ad-hoc, isto porque todas as consultas são efetuadas sobre as chaves e não

sobre os valores. (Carniel et al., 2012)

2.3.4.2 Column-Based Databases

São também conhecidas como column oriented databases. Este tipo de base de dados possui

um formato tabela e por isso tem uma representação gráfica semelhante às bases de dados

relacionais. Semelhante mas não igual, pois lida com valores nulos de maneira distinta e

não suporta associações entre tabelas (Han et al., 2011; Hecht & Jablonski, 2011).

Tomando como exemplo “um caso em que se use muitos tipos de atributos, as bases de

dados relacionais iriam guardar um valor nulo em cada coluna no qual o dataset não tem

valor. Já as column-based databases apenas armazenam um par chave-valor num único

registo, se o dataset precisar. É por isto que a Google as refere como “sparse” e torna as

column-based databases bastante eficientes em dominar grandes quantidades de dados.”

Este modelo opõe-se ao das bases de dados relacionais, isto porque as relacionais

armazenam os dados em linhas e nas column-based databases “os dados são indexados por

uma tripla (linha, coluna e timestamp), onde linhas e colunas são identificadas por chaves e

o timestamp permite diferenciar múltiplas versões de um mesmo dado” (Lóscio et al., 2011).

Já para Cattell (2011), o seu modelo de dados básico são registos e colunas, e o seu modelo

básico de escalabilidade está separado entre registos e colunas através de múltiplos nodos:

Registos estão separados ao longo dos nodos através de sharding na chave primária.

Normalmente, separam-se por range em vez de uma função hash. Isto significa que

consultas em intervalos de valores não têm de ir para todos os nodos;

Colunas de uma tabela são distribuídas através de múltiplos nodos utilizando

“column groups”. Estes podem parecer muito complexos, mas grupos de colunas

são uma simples maneira para o utilizador indicar quais colunas são melhor

armazenadas juntas.

Existem duas maneiras de estruturar os dados, sendo elas:

Orientado à linha: cada registo é uma agregação, por exemplo, um cliente com o

Id 1234 e com a família de colunas representando pedaços de dados como perfil,

histórico de encomendas dentro da agregação;

Orientado a colunas: Cada família de colunas define um tipo de registos, por

exemplo perfis de clientes com linhas associadas a registos. Podemos pensar na linha

como um conjunto de registos em todas as famílias de colunas (Sadalage & Fowler,

Fundamentos Teóricos _______________________________________________________________________________

28

2012).

Na imagem seguinte podemos visualizar a estrutura típica destas bases de dados.

Figura 8 - Estrutura típica das column-based databases (Retirado de Sadalage & Fowler, 2012,pag.46)

De acordo com Abadi & Madden (2008), quando se pretende aceder aos dados sobre a

granularidade de uma entidade, o modelo baseado em linhas é o mais indicado, isto tendo

em conta que todos os dados estão armazenados em conjunto. Mas caso se pretenda ter

acesso apenas a alguns atributos de diversos registos, então o modelo baseado em colunas

é o mais indicado. Sendo assim, quando se pretende pesquisar um cargo, adicionar um cargo

ou eliminá- lo usamos o modelo baseado em linhas, caso usemos uma consulta para verificar

o género mais comum no curso de MIEGSI, é preferível utilizar o modelo baseado em

colunas.

Os dados são armazenados de acordo com as suas colunas de forma independente (Liu et

al., 2011). Cada coluna é exclusivamente armazenada em cada tabela, não existindo

relacionamentos (Carniel et al., 2012).

Concluindo, o modelo de dados das column-based databases é mais indicado para

aplicações que trabalhem com grandes quantidades de dados que estejam armazenados em

grandes clusters, como, por exemplo, data warehouses, pois o modelo de dados permite

particionamento eficiente (Han et al., 2011; Hecht & Jablonski, 2011).

2.3.4.3 Graph Databases

Contrariamente às bases de dados relacionais e às key oriented databases, as graph

29

Fundamentos Teóricos _______________________________________________________________________________

databases têm uma excelente gestão de dados fortemente ligados. Deste modo, as aplicações

que têm dados com muitos relacionamentos são ótimas para este tipo de base de dados.

Segundo Hecht & Jablonski (2011), são mais indicadas para “serviços baseados em

localização, representação de conhecimento e problemas de encontrar caminhos nos

sistemas de navegação, sistemas recomendados e todo o tipo de casos que envolva relações

complexas.”

O modelo deste tipo de base de dados baseia-se no conceito de grafo. Tem a sua estrutura

composta por: “nós (são os vértices do grafo), relacionamentos (são as arestas) e

propriedades (ou atributos) dos nós e relacionamentos” (Lóscio et al., 2011).

Toth (2011) ainda destaca que “pode-se armazenar qualquer tipo de dados dentro do

conteúdo”. As principais vantagens deste tipo de base de dados são:

O facto de “não existir tanta replicação de dados como nos outros modelos, facto

que acontece por se aproveitar do relacionamento entre os registros” (Toth, 2011);

“A vantagem de utilização do modelo baseado em grafos fica bastante clara quando

consultas complexas são exigidas pelo utilizador. Comparado ao modelo relacional,

que para estas situações pode ser muito custoso” (Lóscio et al., 2011). Isto porque

quando se percorre um grafo, algoritmos heurísticos são aplicados para otimizar a

busca por valores, identificando qual o melhor caminho entre dois nós, isto sem

haver necessidade de verificar outros nós. Já no modelo relacional estas consultas

obrigavam a construir joins, que caso fossem muito complexos afetavam o

desempenho da consulta;

“Esse modelo também dá suporte ao uso de restrições sobre os dados, como

restrições de identidade e de integridade referencial (Diana & Gerosa, 2010), ao

contrário da maioria dos modelos NoSql que são mais flexíveis;”

“Esse modelo pode tornar consultas rápidas, devido à possibilidade da utilização de

propriedades de grafos, medidas de centralidade (pagerank) e algoritmos de menor

caminho” (Toth, 2011).

Na seguinte figura é possível visualizar um exemplo destas bases de dados, onde várias

pessoas têm relacionamentos entre si, quer de amizade, quer de empregado/patrão.

Fundamentos Teóricos _______________________________________________________________________________

30

Figura 9 - Exemplo das relações numa graph database (Retirado de Sadalage & Fowler, 2012,pag.52)

Sendo assim, as graph databases são indicadas para situações de contexto complexo em

que se conhece a semântica entre os objetos armazenados (Almeida & Brito, 2012).

2.3.4.4 Document-based Databases

Estas bases de dados são organizadas em coleções de documentos, ao contrário das bases

de dados relacionais em que se usam tabelas estruturadas com campos para cada registo.

Também é permitido ao utilizador adicionar vários campos de diferentes tamanhos a um

documento (Leavitt, 2010).

Nestas bases de dados o objetivo é gerir e armazenar documentos. Estes documentos podem

assumir os formatos XML, JSON (Javascript Object Notation) ou BSON (Binary JSON) que

são formatos padrão na troca de dados (Moniruzzaman & Hossain, 2013).

Uma vez que estas bases de dados não possuem um esquema definido para lidar com os

dados faz com que sejam uma boa solução para as típicas aplicações da web 2.0, assim como

para gerir conteúdos associados às redes sociais (Queiroz et al., 2013).

Este tipo de base de dados armazena coleções de documentos, em que um documento

representa “um objeto com um identificador único e um conjunto de campos, que podem

ser strings, listas ou documentos embutidos” (Lóscio et al., 2011).

Diana & Gerosa (2010) referem que este tipo de base de dados “não possui esquema, ou

seja, os documentos armazenados não precisam possuir estrutura em comum”, assim novos

campos podem ser acrescentados a um documento, sem que traga problemas à base de

dados.

O modelo orientado a documentos estende o modelo chave-valor, associando a uma chave

31

Fundamentos Teóricos _______________________________________________________________________________

um documento, por exemplo, documentos JSON (Carniel et al., 2012).

As Document Databases agrupam pares de chave-valor em documentos. A cada documento

é atribuída uma chave especial “ID”, sendo que esta é atribuída a cada um destes

separadamente. Desta forma, é possível tratar dados estruturados complexos como Nested

objects mais convenientemente (Hecht & Jablonski, 2011).

Diversos atributos podem estar contidos dentro de uma única coluna, e, por sua vez, o

número e tipo de atributos armazenados podem variar de registo para registo.

Contrariamente às key-value databases, este tipo de base de dados permite a pesquisa por

chave ou valor, sendo ideais para armazenar e gerir Big data-Size collections de documentos

como:

Documentos de texto;

Mensagens de correio eletrónico;

Documentos XML;

Representações de entidades da base de dados como produto ou consumidor;

Sparse Data (Moniruzzaman & Hossain, 2013).

Como as key value databases, estas não possuem restrições ao nível de esquema, o que

permite guardar novos documentos, com qualquer tipo de atributos, tão facilmente como

adicionar novos atributos aos documentos existentes em tempo real.

É possível efetuar pesquisas por multi atributo em registos que podem ter diferentes tipos

de pares chave-valor, o que as leva a serem uma ótima escolha para a integração de dados,

assim como para tarefas de migração de esquemas (Hecht & Jablonski, 2011).

Dentro de uma coleção, os documentos podem ser vistos de forma sequencial, podem ser

recuperados individualmente utilizando o seu identificador ou efetuar uma consulta

respeitando a sua estrutura de campos. É igualmente possível introduzir um novo

documento a qualquer altura numa coleção (Atzeni et al., 2013).

Cada coleção possui um nome, e as operações individuais referem-se a esta usando o seu

nome. Desta forma inserem objetos para uma coleção específica. De certo modo, as coleções

possuem uma forma ligeira de esquema, isto porque são visíveis tal como as tabelas nas

bases de dados relacionais. Uma forma pode dizer-se ligeira pois por um lado as coleções

não necessitam de ser explícitas, ao contrário do que acontece nas bases de dados

relacionais, onde uma create table é precisa antes de um select. Por outro lado, nas NoSql,

uma nova coleção é iniciada quando um comando refere uma coleção inexistente. E é

igualmente ligeira, pois a sua estrutura interna não é pré-definida (Atzeni et al., 2013).

Cada objeto possui uma chave que é única, os atributos são elementos básicos do modelo,

Fundamentos Teóricos _______________________________________________________________________________

32

correspondendo a valores simples como strings ou inteiros (Han et al., 2011).

O facto de as relações estarem integradas dentro do próprio documento pode originar dados

duplicados, mas isto possibilita uma consulta direta. Desta forma, tendo como base uma

estrutura que tenha uma relação Cliente com Encomendas (um cliente pode ter várias

encomendas), se uma consulta fosse criada para retornar as encomendas do Cliente “X”,

neste tipo de base de dados bastaria obter o documento correspondente ao Cliente “X”, que

este por sua vez já traria os documentos correspondentes às suas encomendas. Já nas bases

de dados relacionais seria necessário fazer uma junção das tabelas Clientes e Encomendas,

o que levaria a uma diminuição de desempenho na sua execução, mais sentida caso as

tabelas tenham alguma dimensão (Almeida & Brito, 2012). Uma outra vantagem de possuir

dados duplicados é que “facilita a distribuição do sistema, já que a quantidade de nós a

serem consultados numa busca envolvendo várias entidades relacionadas é menor caso elas

estejam próximas” (Diana & Gerosa, 2010). Sendo assim, dependendo do contexto, Diana

& Gerosa (2010), referem que “pode criar problemas de consistência no banco de dados,

causados por anomalias de atualização e remoção”, isto pode ser sentido quando um

documento duplicado é atualizado num só documento.

A principal diferença entre as Key value databases e as Document é o facto de nas Key value

as agregações serem opacas para os sistemas e nas Document a estrutura das agregações é

transparente, ou seja, pode ser vista.

Nas key value databases apenas podemos aceder a uma agregação por via de uma chave.

Nas Document Databases podemos submeter consultas à base de dados baseadas nos

campos da agregação, podemos retirar parte de uma agregação em vez de tudo, e a base de

dados pode criar índices baseadas no conteúdo da agregação (Sadalage & Fowler, 2012).

De acordo com Strauch (2010), as bases de dados CouchDB e MongoDB são os principais

representantes desta classe de banco de dados baseada em documentos. (Almeida & Brito,

2012)

33

Fundamentos Teóricos _______________________________________________________________________________

Figura 10 - Exemplo de dois Documentos de uma Document database

Relativamente aos documentos acima apresentados pode-se verificar que são similares mas

têm diferenças no conteúdo. Isto é permitido nas Document Databases. Ainda que a

estrutura de dados possa diferir entre os documentos, estes podem na mesma pertencer à

mesma coleção, ao contrário das bases de dados relacionais em que cada linha na tabela tem

de seguir a mesma estrutura (Sadalage & Fowler, 2012).

2.3.4.4.1 CouchDB

Apache CouchDB é uma Document database open-source (CouchDB, 2011), criada pela

Fundação Apache e está desenvolvida em Erlang, que é uma linguagem de programação

utilizada para aplicações concorrentes e distribuídas. As propriedades ACID são cumpridas

nesta base de dados, fornecendo atualizações serializadas (CouchDB, 2011). É já da sua

natureza distribuído e suporta vários tipos de esquemas de replicação e resolução de

conflitos.

Data Model

CouchDB utiliza uma base de dados formada por uma coleção independente de documentos

em JSON. Estes documentos são compostos por pares de chave/valor. Valores podem ser

do tipo: números, string, boleanos e listas. Estes documentos não possuem qualquer tipo de

esquema e, sendo assim, não têm de seguir nenhuma estrutura, exceto claro, a estrutura

inerente a JSON. Na seguinte imagem pode-se visualizar um exemplo que modela a

informação necessária para descrever um livro.

Fundamentos Teóricos _______________________________________________________________________________

34

Figura 11 - Documento contendo um exemplo de descrição de um livro (Retirado de Silva, 2011,pag.14)

Segundo Queiroz et al. (2013), são atribuídos a cada documento pelo menos dois atributos:

um número de revisão para resolução de conflitos durante atualizações e um identificador

único.

Silva (2011) cita Anderson et al. (2010).que referem que esta base de dados “é um simples

contentor de uma coleção de documentos e não estabelece nenhuma relação obrigatória

entre eles”

Embora o CouchDB não imponha nenhum tipo de relação entre os documentos, é importante

possuir algum tipo de estrutura que retrate como os documentos são organizados. Sendo

assim, o CouchDB fornece um view model.

Segundo Silva (2011), views são métodos de agregar documentos existentes na base de

dados. Já para Queiroz et al. (2013) permitem a filtragem de partes específicas ou criar

índices para acelerar a procura de um documento. Estas não afetam os dados de uma base

de dados, simplesmente mudam a maneira de como os dados são representados, definindo

assim o design da aplicação.

Silva (2011) também refere que “para definir uma view o utilizador deve fornecer uma

função javascript que atua como uma função map da operação mapreduce. Esta função leva

um documento como um argumento e é permitido manipular os dados do documento da

maneira que se desejar. A view resultante é um documento que pode ter múltiplas linhas.”

Na figura anterior foi apresentado um caso de uma coleção de documentos de livros.

Partindo do princípio que é pretendido obter o título de todos os livros que estão

armazenados na base de dados, criamos uma função map correspondente para ser usada na

view como é mostrado na imagem seguinte.

35

Fundamentos Teóricos _______________________________________________________________________________

Figura 12 - Exemplo de uma função utilizada para obter o título de todos os livros armazenados na base de dados

(Retirado de Silva, 2011,pag.14)

Query Model

O CouchDB utiliza uma RESTful HTTP API para efetuar operações CRUD básicas em todos

os dados armazenados e utiliza métodos como, http POST, GET, PUT e DELETE as realizar.

Consultas mais complexas podem ser como views, como se viu anteriormente e o resultado

pode ser lido utilizando esta REST API (Anderson et al., 2010; Silva, 2011).

Replication Model

O CouchDB é um sistema de base de dados distribuído peer-based (CouchDB, 2011),

permite peers para atualização e alteração de dados, sincronizando bidireccionalmente as

mudanças. Portanto, utilizando o master-slave setup, em que as sincronizações são feitas

unilateralmente, ou o master-master setup, em que as mudanças podem acontecer em

qualquer um dos nodos, estes devem ser sincronizados bidireccionalmente.

Para isto acontecer, o CouchDB utiliza uma replicação otimista e tem a capacidade de lidar

com conflitos, que podem acontecer derivado a replicações de alterações. Como já foi

referido anteriormente, um id de revisão é atribuído, isto porque sempre que um documento

é atualizado, a versão antiga é mantida e atribuído à versão atualizada um id de revisão

diferente. Portanto, quando um conflito é detetado, a versão que prevalecer é gravada como

a mais recente e a versão que não prevalecer é também gravada na história do documento.

Isto é realizado de forma consistente em todos os nós. Existe a possibilidade da aplicação

poder escolher lidar com o conflito por ela própria, ignorando uma versão (Anderson et al.,

2010).

Consistency Model

Relativamente à consistência, o CouchDB fornece Eventual Consistency. Como vários

masters são permitidos, as alterações têm a necessidade de serem propagadas aos nodos

restantes, sendo assim não existem bloqueios de escrita. Portanto, até estas alterações se

propagarem de nodo para nodo, a base de dados permanece num estado de inconsistência.

Como são suportados master setups únicos com múltiplos slaves, Strong Consistency pode

Fundamentos Teóricos _______________________________________________________________________________

36

ser alcançada (Anderson et al., 2010).

2.3.4.4.2 MongoDB

O MongoDB é uma Document database open-source escrita na linguagem C++ (10gen,

2011). A companhia 10gen também fornece suporte a esta base de dados. Não possui

qualquer tipo de esquema e gere documentos JSON como o CouchDB. Foca-se no alto

desempenho e desenvolvimento ágil, fornecendo ao programador um conjunto de

caraterísticas para facilmente consultar dados, ao mesmo tempo que escala o sistema.

Data Model

O MongoDB utiliza uma base de dados composta por coleções de documentos no formato

BSON, que é uma versão dos documentos JSON mas binária. Segundo Queiroz et al. (2013),

estas coleções e documentos relembram os conceitos de tabelas e linhas da tecnologia

relacional, mas com a particularidade dos documentos não necessitarem de ter o mesmo

esquema. Sendo assim, os documentos podem conter campos que são diferentes uns dos

outros. Na figura seguinte podemos então visualizar a diferença existente entre os campos.

Figura 13 - Exemplo de um Documento com campos distintos (Retirado de Queiroz et al., 2013,pag.485)

Os documentos contemplados pela base de dados MongoDB estão num “formato chamado

BSON que é muito semelhante ao JSON mas numa representação binária, por razões de

eficiência e por causa de tipos de dados adicionais em comparação com JSON” (Strauch,

2010).

A principal vantagem em utilizar BSON é a eficiência, tanto no espaço como no tempo de

37

Fundamentos Teóricos _______________________________________________________________________________

computação, uma vez que é formato binário (MongoDB, 2011a).

Cada documento possui um identificador único Id, que pode ser dado pelo utilizador quando

um documento é criado ou automaticamente gerado pela base de dados (MongoDB, 2011c).

No campo Id um índice é automaticamente criado, embora outros índices possam ser criados

manualmente com o objetivo das consultas se tornarem mais rápidas (MongoDB, 2011b).

Query Model

O MongoDB suporta consultas dinâmicas sobre todos os documentos existentes numa

coleção. Segundo Silva (2011), “as consultas são expressas como objetos JSON e são

enviadas para o MongoDB por database drivers (normalmente usando o método “find”)”

(MongoDB, 2011e).

Na imagem seguinte pode-se visualizar um exemplo onde uma base de dados é consultada

por todos os livros contendo o título “Flatland”.

Figura 14 - Exemplo de uma consulta sobre todos os livros que contêm o título Flatland (Retirado de Silva, 2011,pag.17)

Como se pode constatar na imagem seguinte, também é possível sorting e contagem de

caraterísticas. Na primeira consulta todos os livros que estão escritos em inglês são

recuperados, ordenando-os pelo seu título. Já na segunda consulta o número de livros

escritos em inglês é recuperado.

Figura 15 - Exemplo de duas consultas efetuadas no MongoDB (Retirado de Silva, 2011,pag.17)

Replication Model

O MongoDB fornece replicação master-slave e replica sets, sendo que os dados são

replicados assincronamente entre servidores. Em ambos os casos, para operações de escrita,

apenas um servidor é usado, enquanto as operações de leitura podem ser redirecionadas para

os servidores slave (MongoDB, 2011d).

Segundo Silva (2011), “uma replica set é um grupo de servidores em que em qualquer ponto

do tempo existe apenas um servidor master, mas o conjunto é capaz de eleger um novo

master, se o master corrente for abaixo.” Dados são replicados através dos servidores do

conjunto.

Consistency Model

O facto de o MongoDB possuir apenas um master ativo, Strong Consistency é possível se

Fundamentos Teóricos _______________________________________________________________________________

38

todas as operações de leitura forem realizadas no master (MongoDB, 2011d).

Se a replicação para os servidores slave for feita assincronamente e o MongoDB não

necessitar de fornecer version concurrency control, a leitura nos servidores escravos será de

Eventual Consistency. O facto de poder existir leitura nos servidores slaves é bom pois assim

pode-se alcançar o balanceamento de carga e, sendo assim, o cliente também pode fazer

com que a escrita seja replicada para servidores slaves. Isto ajuda a lidar com escritas

importantes, em que a Eventual Consistency possa não ser adequada, porque assim

consegue-se flexibilidade de leitura para ler através dos servidores escravos.

2.3.5 Comparação entre os tipos de Bases de Dados NoSql

Nesta secção as bases de dados NoSql são comparadas em diversos aspetos, para perceber

o que cada uma fornece.

2.3.5.1Comparação Geral

De modo a entender melhor os vários tipos de bases de dados, estes irão ser comparados

nos seguintes pontos:

Modelo de Dados: O modelo suportado pelos vários tipos de bases de dados;

Modelo de Transação: Prioridade da base de dados na seleção das trocas baseadas

no teorema CAP;

Licença: O tipo de licença do software;

Índices: Que bases dados suportam índices;

Sharding: Indica que bases de dados possuem sharding automático. Isto é, a

capacidade de automaticamente redistribuir os dados e replicações através dos

servidores quando há mudanças de recursos, como adicionar ou remover servidores

(Indrawan- Santiago, 2012).

39

Fundamentos Teóricos _______________________________________________________________________________

Base de

dados

Modelo de

Dados

Modelo de

Transação

Licença Índice? Sharding?

Cassandra Column-

family

PA Open source Não Sim

CouchDB Document PA Open source Sim Não

DynamoDB Key-value PA Comercial Sim Sim

HBase Column-

family

PC Open source Não Sim

MongoDB Document PA Open source Sim Sim

Neo4j Graph CA Open source Não Não

Riak Key-value PA Open source Sim Sim

Voldemort Key-value PA Open source Sim Sim

Tabela 2 - Comparação entre os tipos de bases de dados NoSql (Adaptado de Indrawan-Santiago, 2012,pag.47)

2.3.5.2 Particionamento, Replicação e Consistência

Particionamento

Como já foi referido anteriormente, a maioria das bases de dados NoSql implementam

algum tipo de particionamento horizontal ou sharding, em que se armazenam conjuntos de

registos em diferentes segmentos que podem estar alocados em diferentes servidores.

Segundo Grolinger et al. (2013), “o modelo de dados é um fator significativo para definir

estratégias para particionamento em bases de dados.”

Existem várias estratégias de particionamento horizontal, mas as mais utilizadas são Range

Partitioning e Consistent Hashing.

Em relação à Range Partitioning, o objetivo é atribuir os dados a partições, localizadas em

diferentes servidores baseados em conjuntos de uma chave de partição. Um servidor tem

como função armazenar e lidar com a leitura/escrita de um específico conjunto de chaves.

Esta estratégia tem como vantagem o processamento efetivo de range queries, isto porque

chaves adjacentes residem no mesmo nodo. No entanto, pode ter desvantagens como hot

spots e load- balancing issues. Por exemplo, se os dados são processados de acordo com as

suas chaves valores, a carga de processamento será bastante concentrada num único servidor

ou em poucos servidores.

Em relação ao Consistent Hashing, o conjunto de dados é representado como um círculo. O

círculo é dividido em conjuntos, igual ao número de nodos disponíveis e cada nodo é

mapeado para um ponto do círculo. Na figura seguinte é possível visualizar o Consistent

Hashing num exemplo com 4 nodos, N1 para N4. Para se determinar o nodo onde um objeto

deve ser alocado o sistema faz hash à chave do objeto e descobre a sua localização no

círculo. Na imagem seguinte pode-se verificar que o objeto “a” está localizado entre o nodo

N4 e N1. De seguida o círculo é percorrido no sentido horário, até que o primeiro nodo seja

Fundamentos Teóricos _______________________________________________________________________________

40

encontrado e, assim, atribui-se o objeto a esse nodo. O objeto “a” presente na seguinte figura

é atribuído ao nodo N1. De acordo com Grolinger et al. (2013), “cada nodo é responsável

pela região do anel entre ele e o seu predecessor, e referem um exemplo onde o nodo N1 é

responsável pelo data range 1, N2 pelo data range 2 e assim sucessivamente.” A localização

de um objeto no Consistent Hashing pode ser calculada rapidamente, não sendo necessário

um serviço de mapeamento como é necessário no Range Partitioning.

Figura 16 - Consistent hashing (Retirado de Grolinger et al., 2013, pag.13)

O Redis e o Memcache não possuem nenhuma estratégia de particionamento, sendo o cliente

que escolhe uma.

Replicação

Além da escalabilidade de leitura/escrita ser aumentada, a replicação também aumenta a

confiança no sistema, na tolerância a falhas e na durabilidade. Existem duas estratégias de

replicação que ressaltam à vista, sendo elas a replicação master–slave e multi-master.

Como já foi referido anteriormente, na replicação master-slave, um único nodo é designado

como master e é o único nodo que pode processar pedidos de escrita. As alterações

realizadas são propagadas do master para os nodos slaves. Bases de dados que utilizam este

tipo de replicação são o Redis, BerkeleyDB, e o HBase.

Já na replicação multi-master, existe a possibilidade de vários nodos processarem pedidos

de escrita, que depois são propagados para os nodos seguintes. Neste tipo de replicação a

direção de propagação pode ocorrer em diferentes direções, ao contrário da replicação

mater/slave. Bases de dados que utilizam este tipo de replicação são o CouchDB e o

Couchbase Server.

As bases de dados, Voldemort, Riak, e Cassandra, utilizam a replicação masterless que é

41

Fundamentos Teóricos _______________________________________________________________________________

similar à replicação multi-master, pois tal como nesta vários nodos aceitam pedidos de

escrita. No sistema de replicação todos os nodos possuem o mesmo papel.

Outro fator importante na replicação e que causa grande impacto nas bases de dados é o

modo como as operações de escrita são propagadas entre os nodos. A sincronização de

réplicas pode ser síncrona ou assíncrona. De acordo com Grolinger et al. (2013), na síncrona

“as alterações são propagadas antes que o sucesso da operação de escrita seja reconhecido

pelo cliente. Isto significa que a replicação síncrona introduz atrasos porque a operação de

escrita é completada apenas depois da alteração da propagação.” Este tipo de replicação é

raramente usada pelas bases de dados NoSql, isto porque pode levar a grandes atrasos no

caso de perda temporária ou degradação da conexão. Já em relação à assíncrona referem

que “o sucesso de uma operação de escrita é reconhecida antes das alterações serem

propagadas para a réplica do nodo”. É uma vantagem porque permite a replicação para

longas distâncias mas pode ser uma desvantagem, pois pode resultar em nodos com cópias

de dados inconsistentes.

A escolha do modelo de replicação é de extrema importância porque tem impacto na

capacidade da base de dados escalar pedidos de leitura e escrita (Grolinger et al., 2013).

Consistência

Esta consistência diz respeito à utilizada no teorema CAP, que está relacionada com a

maneira como os dados são vistos nos nodos do servidor, isto depois das operações de

atualização.

Existem dois modelos de consistência, sendo eles a Strong Consistency e a Eventual

Consistency. Na Strong Consistency é assegurado que quando se confirma pedidos de

escrita, os dados atualizados são visíveis nos pedidos seguintes de leitura.

Já no modelo de Eventual Consistency, que já foi referido anteriormente, as alterações são

eventualmente propagadas através do sistema levando o tempo necessário. Sendo assim,

alguns nodos servidor podem conter dados inconsistentes durante um certo período de

tempo.

A maioria das bases de dados NoSql fornecem Eventual Consistency.

De salientar que o MongoDB pode alcançar Strong Consistency usando duas técnicas

diferentes. Primeiro uma conexão é estabelecida pelo master, mas apenas de leitura. A

segunda opção é estabelecer um parâmetro denominado “Replica Acknowledged”, o qual

tem foco na escrita, este assegura que uma escrita é bem-sucedida em todas as réplicas antes

de ser confirmado. No entanto, a base de dados torna-se num sistema de replicação síncrona

Fundamentos Teóricos _______________________________________________________________________________

42

e o seu desempenho é afetado negativamente.

Tabela 3 - Comparação dos tipos de bases de dados NoSql em termos de particionamento, replicação e consistência

(Retirado de Grolinger et al., 2013,pag.11)

43

Fundamentos Teóricos _______________________________________________________________________________

2.3.6 Considerações Finais

2.3.6.1 Mitos do NoSql

Segundo Toth (2011), foram criados muitos mitos em redor deste tema, e o autor refere

alguns deles:

NoSql é escalável

É bastante referido que a tecnologia NoSql é bastante escalável, mas esta não escala

automaticamente, simplesmente é mais fácil de ser escalada quando comparado com o

modelo de base de dados relacional.

Não precisamos mais de Administradores de base de dados

Possuir um modelo que proporciona um cenário no qual temos escalabilidade facilitada,

então faz sentido dizer que o profissional com o perfil de administrador de base de dados

não seja mais necessário. Falso. É claro que serão sempre necessários administradores pois

existe sempre a necessidade de fazer backups e lidar com a tecnologia.

Económico

É referido por bastantes autores o custo mais reduzido em comparação à tecnologia SQL

devido às licenças envolvidas e ao preço da escalabilidade. Muitas vezes a tecnologia

relacional cumpre todas as necessidades do cliente e pode ter custos ainda menores, isto

porque também existem bases de dados relacionais open source. Como refere o autor, é tudo

uma questão de analisar o tamanho, licenças e necessidade.

2.3.6.2Dificuldades do NoSql no Ambiente Empresarial

Michael Stonebreaker (2011) refere no Blog CACM que de acordo com um recente post no

blog ReadWriteWeb por Audrey Watters, 44% dos utilizadores corporativos interrogados

nunca tinham ouvido falar de NoSql e uns adicionais 17% não tinham interesse. Pela

experiência dialogando com amigos que possuem empresas chegou a algumas conclusões

do porquê das empresas não estarem interessadas no NoSql, que são as seguintes:

Uma delas é não existindo ACID é igual a perda de interesse: ACID é o padrão

utilizado para alterações de conjuntos de dados partilhados. Um sistema que não

suporte transações reais não dá para adaptar a OLTP. O ponto-chave que o autor

concluiu foi que “um conjunto de dados pode ser feito através de transações de um

único registo, caraterística típica da tecnologia NoSql, mas nada garante que no

futuro não irá ser necessário efetuar operações multi registo o que se tornará um

problema.”

Fundamentos Teóricos _______________________________________________________________________________

44

Outra é que a linguagem de consultas de baixo nível está morta: A linguagem

de alto nível SQL mostrou que oferece facilidade de programação para consultas ad

hoc de data warehouse. Já na maioria dos produtos NoSql possuem um interface

algorítmico de record-at-a-time que não interessa às empresas.

E por fim NoSql significa “no Standard”: Caso as empresas possuam bastantes

bases de dados, começam preocupações relativamente à quantidade de interfaces

diferentes que os programadores têm de aprender. Como já foi referido existem

vários produtos NoSql, cada um com um interface diferente, já o Sql oferece um

ambiente padrão, que sendo assim, facilita o seu uso em empresas de grande

dimensão.

2.3.6.3 Criticas sobre a Tecnologia NoSql

Scofield (2009) resolveu responder a algumas críticas sobre a tecnologia NoSql:

“NoSql trata-se apenas de Document Databases, ou key-value stores, ou ...”:

Scofield notou que a maioria dos artigos sobre NoSql apenas referem as Document-

based databases ou as key-value stores, e, às vezes, as column-stores. Ele refere que

bons argumentos podem ser feitos, mas que apenas se referem a um tipo específico

de sistema de armazenamento. Scofield critica esta abordagem de só se referirem a

apenas alguns tipos de bases de dados NoSql pois permite aos “tradicionalistas”

argumentar facilmente contra o movimento NoSql ou contra as diferentes

abordagens desta tecnologia.

“Podemos lidar com NoSql também nas Bases de dados relacionais.”: O autor

refere que diferentes aplicações são boas para coisas diferentes, e faz a seguinte

pergunta “Bases de dados relacionais são ótimas com dados relacionais, então

porque haveríamos de as querer usar para dados NoSql?” É evidente salientar que

cada tecnologia tem o seu propósito.

“NoSql é uma rejeição total das bases de dados relacionais”: Esta frase era

bastante referida há algum tempo atrás na comunidade NoSql, mas cada vez menos

tem sido referida, o que agrada a Scofield (2009) citado por Strauch (2010) que diz

que estamos a avançar para uma abordagem pluralista para guardar os nossos dados,

o que é bom.

45

Análise e Carregamento dos Dados _____________________________________________________________________________

Capítulo 3 – Análise e Carregamento dos

dados

Neste capítulo serão descritos os dados que vão servir como exemplo para testar as bases

de dados e onde foram conseguidos. De seguida, apresenta-se a forma como foram

carregados e referido qualquer tratamento que tenham sofrido.

3.1 Dados para Carregamento

O dataset escolhido envolveu dados sobre aviação comercial fornecidos pela American

Statistical Association 1 baseado nos dados fornecidos pela United Sates Department of

Transportation 2.

O que levou à preferência por este dataset foi o facto de ser bastante extenso, o que é ótimo

para a análise do desempenho das bases de dados.

Os dados provenientes do United States Department of Transportation estão no tipo csv e

são constituidos pelos seguintes dados:

Csv com dados dos aviões

Figura 17 – Extrato do csv aviões

1 http://stat-computing.org/dataexpo/2009/the-data.html 2 http://www.transtats.bts.gov/Fields.asp?Table_ID=236

Análise e carregamentos dos dados _______________________________________________________________________________

46

Csv com dados das companhias aéreas

Csv com dados dos aeroportos

Figura 19 – Extrato do csv aeroportos

Csv com os dados gerais de voos por ano (desde 1995 a 2008)

Figura 20 – Extrato do csv contendo voos de 1995

Será com estes dados que iremos instanciar as bases de dados NoSql e Relacional em análise

nesta dissertação.

Relativamente à Tecnologia Relacional, optou-se por utilizar o SGBD MySQL dado ser o

principal representante desta tecnologia em termos de open-source.

3.2 Carregamento dos dados no MySQL

Para efetuar o estudo comparativo da tecnologia relacional com a não relacional optou-se

pela criação de quatro bases de dados cada uma com número de registos diferentes. A

primeira com cerca de 1 milhão e 500 mil registos dizendo respeito ao csv do ano de 1995,

a segunda com cerca de 5 milhões de registos dizendo respeito aos csv dos anos de 1995,

1996 e 1997, a terceira com cerca de 15 milhões de registos dizendo respeito aos csv de

1995 a 2003 e por último uma base de dados com cerca de 41 milhões de registos com todos

os csv existentes, ou seja, de 1995 a 2008.

Cada base de dados tem o nome tese com o número correspondente da mesma como por

Figura 18 – Extrato do csv companhias aéreas

47

Análise e Carregamento dos Dados _____________________________________________________________________________

exemplo tese1, tese2, tese3 e tese4. Estas foram carregadas da mesma maneira sendo

descrito nos sub-capítulos seguintes o conjunto de passos que foi seguido.

3.2.1 Modelo conceptual de dados

Depois da análise dos dados e conforme os csv disponibilizados pela United State

Department of Transportation foi desenhado o modelo que iria receber o carregamento dos

dados. Este foi pensado de forma a normalizar o máximo de tabelas de modo a seguir as

linhas da tecnologia relacional, permitindo consultas em múltiplas tabelas. Na imagem

seguinte é demonstrado o modelo criado.

Figura 21 - Modelo conceptual de dados

3.2.2 Descrição das Entidades

Relativamente à entidade Airplane, os dados dizem respeito aos dados principais do avião,

sendo descritos na seguinte tabela.

Campo Descrição

Tailnum Chave primária da tabela Avião, com

auto incremento.

Issuedata Data de registo da matrícula.

Status Estado do avião, se está pronto para

viagens ou aguarda registo.

Year Ano do avião. Tabela 4 - Descrição dos atributos da entidade airplane

Relativamente à tabela Airline, os dados dizem respeito às companhias aéreas.

Campo Descrição

idAirline Chave primária da tabela Airplane, com

auto incremento.

Description Sigla da companhia aérea. Tabela 5 - Descrição dos atributos da entidade Airline

Análise e carregamentos dos dados _______________________________________________________________________________

48

Relativamente à tabela Airport, os dados dizem respeito aos aeroportos tanto de origem

como de destino.

Campo Descrição

Idairport Chave primária da tabela Airport, chave

já fornecida no csv com o código do

aeroporto.

airport Nome do aeroporto.

city Cidade.

state Estado.

country País.

latitude Latitude.

longitude Longitude. Tabela 6 - Descrição dos atributos da entidade airport

Relativamente à tabela Aircraft_type, esta foi partida do csv avião e os dados dizem respeito

ao tipo de aeronave.

Campo Descrição

idAircraft_type Chave primária da tabela Aircraft_type,

com auto incremento.

type Tipo de aeronave. Tabela 7 - Descrição dos atributos da entidade aircraft type

Relativamente à tabela Engine_type, esta for partida do csv avião e os dados dizem respeito

aos tipos de motores de avião existentes.

Campo Descrição

idEngine_type Chave primária da tabela Engine_type,

com auto incremento.

type Tipo do motor. Tabela 8 - Descrição dos atributos da entidade engine type

Relativamente à tabela Flight, os dados dizem respeito à informação dos voos realizados.

Campo Descrição

idFlight Chave primária da tabela Flight, com

auto incremento.

Year Ano em questão.

Month Mês em questão.

Dayofmonth Dia do mês em questão, com valores de 1

a 31.

Dayofweek Dia da semana em questão, com valores

de 1 a 7.

Deptime Tempo de partida atual, no formato

hhmm.

CRSDeptime Tempo de partida previsto, no formato

hhmm.

Arrtime Tempo de chegada atual, no formato

49

Análise e Carregamento dos Dados _____________________________________________________________________________

hhmm.

CRSArrtime Tempo de chegada previsto, no formato

hhmm.

Flightnum Número de voo.

ActualElapsedTime Tempo atual de voo em minutos.

CRSElapsedTime Tempo previsto de voo em minutos.

Airtime Tempo de voo em minutos.

ArrDelay Atraso de chegada em minutos.

DepDelay Atraso de partida em minutos.

Distance Distância entre aeroportos em milhas.

TaxiIn Tempo de Taxi in (pronto para o avião

aterrar) em minutos.

TaxiOut Tempo de Taxi out (pronto para o avião

descolar) em minutos.

Cancelled Booleano de cancelamento, 1-sim 0-não.

Diverted Booleano de desvio, 1-sim 0-não. Tabela 9 - Descrição dos atributos da entidade flight

Relativamente à tabela Manufacturer, esta foi partida do csv avião e os dados dizem

respeito aos fabricantes dos modelos de aviões.

Campo Descrição

idManufacturer Chave primária da tabela Manufacturer,

com auto incremento.

Name Nome do fabricante. Tabela 10 - Descrição dos atributos da entidade manufacturer

Relativamente à tabela Model, esta foi partida do csv avião e os dados dizem respeito aos

modelos de avião existentes.

Campo Descrição

idModel Chave primária da tabela Model, com

auto incremento.

Name Nome do modelo. Tabela 11 - Descrição dos atributos da entidade model

Por fim, relativamente à tabela Plane_type, esta foi partida do csv avião e os dados dizem

respeito aos tipos de aviões existentes.

Campo Descrição

idPlane_type Chave primária da tabela Plane_type com

auto incremento.

type Tipo de avião. Tabela 12 - Descrição dos atributos da entidade plane type

3.2.3 Carregamento das tabelas filho

Relativamente às tabelas filho, estas podem ser carregadas diretamente através da

Análise e carregamentos dos dados _______________________________________________________________________________

50

ferramenta import no workbench. Sendo mais rápido o seu carregamento do que nas que

serão apresentadas no tópico seguinte (tabelas pai). As tabelas que foram carregadas desta

maneira foram a Airport e Airline. Na imagem seguinte pode-se verificar um exemplo de

carregamento usando a tabela Airport.

Figura 22 - Import do csv airport

Efetuou-se o mapping com as colunas do csv e estas foram carregadas automaticamente

para os campos pretendidos.

Como estas tabelas já tinham um campo com possibilidade de chave primária a ferramenta

import era suficiente para o carregamento, mas nas restantes como é necessário a criação de

uma chave primária de auto incremento foram carregadas através de consultas. Como estes

campos estão contidos na tabela avião foram selecionados os pretendidos e inseridos nas

tabelas correspondentes, como é possível visualizar no seguinte código.

CREATE TABLE `aircraft_type` (

`idAircraft_type` int(11) NOT NULL AUTO_INCREMENT,

`type` varchar(45) DEFAULT NULL,

PRIMARY KEY (`idAircraft_type`),

UNIQUE KEY `type_UNIQUE` (`type`)

) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

51

Análise e Carregamento dos Dados _____________________________________________________________________________

insert into aircraft_type (type)

select distinct aircraft_type from aviao;

CREATE TABLE `engine_type` (

`idengine_type` int(11) NOT NULL AUTO_INCREMENT,

`type` varchar(45) DEFAULT NULL,

PRIMARY KEY (`idengine_type`),

UNIQUE KEY `type_UNIQUE` (`type`)

) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into engine_type (type)

Select distinct engine_type from aviao;

CREATE TABLE `plane_type` (

`idplane_type` int(11) NOT NULL AUTO_INCREMENT,

`type` varchar(45) DEFAULT NULL,

PRIMARY KEY (`idplane_type`),

UNIQUE KEY `type_UNIQUE` (`type`)

) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Insert into plane_type (type)

Select distinct type from aviao;

CREATE TABLE `manufacturer` (

`idManufacturer` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(45) DEFAULT NULL,

PRIMARY KEY (`idManufacturer`),

UNIQUE KEY `name_UNIQUE` (`name`)

) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Insert into manufacturer (name)

Select distinct manufacturer from aviao;

CREATE TABLE `model` (

`id_model` int(11) NOT NULL AUTO_INCREMENT,

`model` varchar(45) DEFAULT NULL,

PRIMARY KEY (`id_model`)

) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Insert into model (model)

Select distinct model from aviao;

De salientar que também podiam ser carregadas através da ferramenta import do

Workbench, mas neste caso os id’s ficavam com números aleatórios e, sendo assim, optou-

Análise e carregamentos dos dados _______________________________________________________________________________

52

se por utilizar estas queries para ficarem os id’s todos organizados.

3.2.4 Carregamento das tabelas pai

Para garantir que os dados em todas as tabelas condiziam, efetuou-se o carregamento por

inner joins, eliminando assim todos os dados não correspondentes entre si.

Através de vários testes foram construídos uma série de passos para um carregamento

eficiente de todos os dados.

Primeiro criou-se uma tabela avião e uma tabela csv_1995 para carregar os dados de ambos

os csv. Para isso, utilizou-se o load infiles do MySQL conforme está presente no seguinte

código.

“ LOAD DATA LOCAL INFILE 'C:\\1995.csv'

INTO TABLE tese1.csv_1995

FIELDS TERMINATED BY ',' ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 LINES “

De seguida, efetuou-se uma consulta em que o objetivo era retornar todos os aviões que

tinham voos correspondentes na tabela csv_1995 através do tailnum que está contido em

ambas as tabelas, avião e csv_1995, criando-se assim a tabela aviao1.

“ Use tese1;

create table aviao1

(select distinct a.tailnum, a.type, a.manufacturer,

a.issue_data, a.model, a.status, a.aircraft_type,

a.engine_type, a.year, c.uniquecarrier

From aviao a

INNER JOIN csv_1995 c

ON a.tailnum = c.tailnum ) “

Com as tabelas Engine_type, Plane_type, Airline, Manufacturer, Aircraft_type e Model

previamente carregadas, é necessário agora fazer um inner join da tabela aviao1 com estas

conforme o código seguinte, isto também para garantir que todos os aviões têm ligações

com estas tabelas.

“ Use tese1;

create table airplane

(select distinct a.tailnum, a.issue_data, a.status, a.year,

53

Análise e Carregamento dos Dados _____________________________________________________________________________

c.idplane_type, d.idengine_type, e.id_model,

b.idAircraft_type, f.idAirline, g.idManufacturer

From aviao1 a

INNER JOIN aircraft_type b

ON a.aircraft_type = b.type

INNER JOIN plane_type c

ON a.type = c.type

INNER JOIN engine_type d

ON a.engine_type = d.type

INNER JOIN manufacturer g

ON a.manufacturer = g.name

INNER JOIN model e

ON a.model = e.model

INNER JOIN airline f

ON a.uniquecarrier = f.idAirline ) “

Airplane é então a tabela final de avião, definindo-lhe assim uma chave primária, neste caso

o tailnum. Sendo assim, já é possível carregar a tabela de voos final mas, para isso, é

necessário que esta tenha correspondência com o aeroporto de origem e destino e com os

aviões. Para tal efetuou-se um inner join do id_airport com os campos origin e dest na tabela

csv_1995 e do tailnum na tabela Airplane, conforme está presente no seguinte código. Foi

definida também uma chave primária de auto incremento denominada id_flight.

Use tese1;

create table flight (id_voo int auto_increment, primary key

(id_flight))

(select v.year, v.month, v.dayofmonth, v.dayofweek,

v.deptime, v.crsdeptime, v.arrtime, v.crsarrtime,

v.flightnum, v.tailnum, v.actualelapsedtime,

v.crselapsedtime, v.airtime, v.arrdelay, v.depdelay,

v.origin, v.dest, v.distance, v.taxiin, v.taxiout,

v.cancelled, v.cancellation_code, v.diverted,

v.carrierdelay, v.weatherdelay, v.nasdelay, v.securitydelay,

v.lateaircraftdelay

From csv_1995 v

INNER JOIN airport a

ON v.origin = a.idairport

INNER JOIN airport b

ON v.dest = b.idairport

INNER JOIN airplane c

ON v.tailnum = c.tailnum )

Análise e carregamentos dos dados _______________________________________________________________________________

54

3.3 Carregamento de dados no MongoDB

O carregamento dos dados no MongoDB pode ser efetuado de duas formas, ou por

documentos embutidos ou referenciados, cada um tem as suas vantagens e será sempre

privilegiado o melhor desempenho da base de dados.

Os dados foram exportados do MySQL em formato JSON para assim ambas as bases de

dados possuírem o mesmo número de registos.

3.3.1 Estrutura dos Documentos

Foram exportados do MySQL documentos JSON das quatro bases de dados criadas. Foram

então agrupados os dados em três JSON, contendo os dados do Airport, Airplane e Flight.

Posto isto, existem duas maneiras de os carregar para o MongoDB: ou por documentos

embutidos ou referenciados.

Para os referenciados bastava criar três coleções no MongoDB e carregar os respetivos JSON

ficando referenciados pelo id que contém cada documento. O problema é que esta

abordagem é mais indicada para modelos que possuíssem relacionamentos de muitos para

muitos, o que não acontece no modelo que foi criado no MySQL. De referir também que

haveria a necessidade da criação de duas ou mais consultas para retornar o que uma consulta

em Sql consegue realizar.

Sendo assim, foram preferidos os documentos embutidos, nestes com apenas uma consulta

consegue-se ir buscar o que é pretendido e no mesmo documento estarão contidos os dados

de um voo, nomeadamente o aeroporto de origem e destino, bem como o avião associado.

Irá existir uma certa redundância de dados mas um melhor desempenho nas consultas.

Embutir documentos pode-se tornar muito mais complicado do que referenciar, sendo que

na referenciação era apenas necessário criar as coleções e carregar os documentos JSON

através do mongoimport, no outro caso já foi necessário a criação de um programa em java

para embutir o aeroporto de origem e destino e o avião no voo correspondente. No anexo A

é possível consultar o código desenvolvido separado por extratos conforme o seu propósito.

No programa desenvolvido primeiro definiram-se as classes principais que estão presentes

no MongoDB, que fazem correspondência às coleções e cada atributo declarado é um campo

no MongoDB.

Cada classe tem declarado um método, nomeadamente o “toString” que permite retornar

uma string no formato JSON, isto para ser permitido visualizar se os dados estavam a ser

bem carregados. O código correspondente está no anexo A no Extrato de código 1.

55

Análise e Carregamento dos Dados _____________________________________________________________________________

De seguida, foi criada uma classe denominada mongoconnection cujo objetivo era criar uma

conexão válida com o servidor MongoDB e com a base de dados pretendida. O código

correspondente está no anexo A no Extrato de código 2.

Posteriormente foram criadas três classes cujo objetivo é aceder ao MongoDB e recolher os

dados de uma coleção. Através destes dados podemos converter registo a registo os dados

para o tipo de classe respetiva, (Airplane, Airport ou Flight), guardando cada objeto numa

lista. O código correspondente está no anexo A no Extrato de código 3.

Para converter cada registo das coleções recolhidas do MongoDB foi criada uma classe que

possui três métodos, que é responsável por fazer a conversão para cada um dos três tipos de

classes definidas, (Airplane, Airport e Flight). O código correspondente está no anexo A no

Extrato de código 4.

De seguida, criou-se uma classe denominada Flighfinal cujo objetivo era agregar os dados

recolhidos das coleções do MongoDB de modo a ser possível imprimir para o txt o JSON

embutido. O código correspondente está no anexo A no Extrato de código 5.

Por último, criou-se a classe principal que é responsável por executar esta aplicação.

Começou-se por declarar as variáveis do tipo airplanedao, airportdao e flightdao.

Posteriormente recolheram-se todos os elementos da coleção flight, pois é a esta a que se

pretende agrupar o airplane e os airports. Para tal, fez-se uma consulta à coleção flight sem

argumentos, de forma a obter todos os voos. Para cada elemento da lista foi feita uma

consulta à coleção airplane onde se pretendia obter o avião cujo tailnum fosse igual ao

tailnum presente no voo. O mesmo foi feito para o aeroporto de destino e de origem.

Obtendo estes, o sistema está preparado para criar o objeto do tipo flightfinal, guardando-o

numa lista. Percorrendo todos os voos recolhidos o sistema começa a escrever para um txt

previamente criado. O código correspondente está no anexo A no Extrato de código 6.

3.3.2 Carregamento da coleção

Para aceder ao MongoDB é necessário seguir um conjunto de passos. Primeiro temos de

abrir uma conexão à base de dados através da linha de comandos e de seguida noutro

terminal, executar o comando “mongo” na diretoria onde este está alojado. No anexo B está

explicada detalhadamente a instalação e a inicialização desta base de dados.

Depois, através do mongoimport é possível carregar facilmente os dados em JSON para uma

coleção específica.

Na figura seguinte está então um exemplo de um documento constituinte da base de dados

criada.

Análise e carregamentos dos dados _______________________________________________________________________________

56

3.4 Carregamento dos dados no CouchDB

O carregamento nesta base de dados foi efetuado da mesma maneira que no MongoDB,

através de documentos embutidos. E os documentos têm a mesma estrutura que os

documentos inseridos no MongoDB. No anexo C está explicada detalhadamente a instalação

e a inicialização desta base de dados.

Primeiramente foi tentado o carregamento através do bulk_docs mas como os ficheiros a

carregar eram demasiado grandes foi necessário encontrar uma alternativa, alternativa essa

que foi um código em python. Neste código faz-se a conexão à base de dados e lê-se o JSON

linha a linha, inserindo-o na base de dados pretendida. O código utilizado está presente no

anexo D.

Na imagem seguinte é apresentado um exemplo de um documento carregado no couchDB.

Figura 23 - Exemplo de um documento criado no MongoDB

57

Análise e Carregamento dos Dados _____________________________________________________________________________

Figura 24 - Exemplo de um documento criado no CouchDB

De salientar a diferença para o documento no MongoDB, este contém um número de revisão

que em caso de alteração do Document o _id é mantido e é apenas alterado o id de revisão.

59

Benchmarking _____________________________________________________________________________

Capitulo 4 – Benchmarking

Neste capítulo, o objetivo é obter conclusões sobre qual tecnologia de base de dados é mais

indicada para determinada dimensão da base de dados, ou seja, a que tenha melhor

desempenho no que respeita a consultas. A análise será realizada através de consultas nas

várias bases de dados e de gráficos para efetuar comparações.

Para a realização deste benchmark foi utilizado um computador com as seguintes

características:

Processador: Intel(R) Core(TM) i7-4700HQ CPU @ 2.40 GHz;

Memória RAM: 8 gigabytes;

Sistema Operativo: Windows 8.1 x64.

4.1 Consultas MySQL

As consultas foram pensadas e realizadas primeiro no MySQL. O objetivo foi desenvolver

três consultas que fossem aumentando de complexidade.

A primeira, que se pretendia que fosse a mais simples, foi “Selecionar o avião envolvido no

voo com maior atraso no tempo de chegada”. No código seguinte é então apresentada a

consulta 1.

Consulta 1:

select tailnum

from flight

where arrdelay = (Select max(arrdelay) from flight)

Como segunda consulta foi adicionada complexidade juntando algumas tabelas. Nesta

pretende-se “Listar os aviões que têm como fabricante a BOEING e que tenham voos

desviados”. No código seguinte é então apresentada a consulta 2.

Consulta 2:

SELECT distinct a.Tailnum

From airplane a

INNER JOIN manufacturer m

ON a.idManufacturer = m.idManufacturer

INNER JOIN flight v ON a.Tailnum = v.tailnum

Where m.name = 'BOEING' and diverted= “1”

Na terceira consulta o objetivo foi utilizar o maior caminho entre as tabelas, desde o modelo

de avião até ao aeroporto, incluindo também a ida ao aeroporto de origem e destino. Nesta

pretende-se saber “Qual o modelo de avião utilizado nas travessias entre os aeroportos San

Benchmarking _______________________________________________________________________________

60

Francisco International e Philadelphia Intl e que não tenha voos cancelados”

Consulta 3:

Select distinct model

From model as m

INNER JOIN airplane as a

ON M.id_model = a.id_model

INNER JOIN flight as f

ON a.tailnum = f.tailnum

INNER JOIN airport as b

ON f.origin = b.idAirport

INNER JOIN airport as c

ON f.dest = c.idAirport

Where b.airport = 'San Francisco International' and

c.airport = 'Philadelphia Intl’ and cancelled = “0”

4.2 Consultas MongoDB

Pelo facto de terem sido embutidos os documentos, apenas será necessária uma consulta.

Em relação à primeira consulta, ordena-se o arrdelay por ordem descendente e seleciona-se

o primeiro registo.

No seguinte código é possivel então visualizar a consulta efetuada.

db.teste.find({}, {

"tailnum.tailnum": 1}).sort({"arrdelay":-1}).limit(1)

Relativamente à segunda consulta, como os dados do manufacturer e do tailnum estão num

sub-documento e se pretende que não haja repetições dos aviões, é necessário efetuar a

consulta desta forma que é equivalente ao distinct em Sql.

db.runCommand({

"distinct": "teste",

"query": {

"tailnum.manufacturer": "BOEING",

"diverted": "1"

},

"key": "tailnum.tailnum"

});

Relativamente à última consulta também é necessário consultar sub-documentos e retornar

valores únicos, então o código foi realizado da seguinte forma.

db.runCommand({

"distinct": "teste",

"query": {

61

Benchmarking _____________________________________________________________________________

"origin.airport": "San Francisco International",

"dest.airport": "Philadelphia Intl",

“cancelled”: “0”

},

"key": "tailnum.model"

});

4.3 Consultas CouchDB

Para efetuar as consultas no CouchDB é necessária, em primeiro lugar, a criação de uma

view em javascript sobre aquilo que é pretendido consultar e, de seguida, através de um url

consultar a view pretendida.

Na primeira consulta foi criada uma view com os parâmetros tailnum e arrdelay que vão ser

retornados na consulta.

function(doc){

emit([doc.tailnum.tailnum, doc.arrdelay], 1);

}

De seguida, foi criada uma função reduce, isto para retornar o maior valor de arrdelay.

function(keys, values, rereduce) {

var max = 0,

ks = rereduce ? values : keys;

for (var i = 1, l = ks.length; i < l; ++i) {

if (ks[max][0][1] < ks[i][0][1]) max = i;

}

return ks[max];

}

Agora efetua-se uma consulta à view criada e é retornado o maior valor de arrdelay, bem

como o avião associado.

127.0.0.1:5984/tese1/_design/teste1/_view/tese16

O campo tese1 diz respeito à base de dados, o campo teste1 diz respeito ao nome do conjunto

das views e o campo tese 16 diz respeito à view que foi explicada anteriormente.

Na segunda consulta foi criada uma view com os parâmetros manufacturer = “BOEING” e

diverted = “1” que é o que se pretende consultar e como retorno o tailnum.

A view criada foi a seguinte:

function(doc) {

if(doc.tailnum.manufacturer == "BOEING" && doc.diverted ==

1) {

Benchmarking _______________________________________________________________________________

62

emit(doc.tailnum.tailnum, null);

}

}

Como se pretendia que não existissem tailnum repetidos, foi criada a função reduce para

permitir retornar valores únicos.

function(key, values) {

return null;

}

De seguida, fez-se uma querie à view para obter o resultado da consulta.

127.0.0.1:5984/tese1/_design/teste1/_view/tese14?group=true

O valor tese1 é o nome da base de dados, o nome teste1 é o nome do conjunto das views e

o nome tese14 é o nome da view apresentada anteriormente.

Em relação ao group=true, este separa o valor reduce para cada chave única no map, e todos

os valores que partilham a mesma chave são agrupados e reduzidos para um único valor,

eliminando assim os repetidos.

Na terceira consulta a view foi criada com os aeroportos de origem = “San Francisco

International” e destino = “Philadelphia Intl” e com o cancelled = “0” e como retorno o

modelo de avião.

function(doc) {

if(doc.origin.airport == "San Francisco International" &&

doc.dest.airport == "Philadelphia Intl" && doc.cancelled ==

"0") {

emit(doc.tailnum.model, null);

}

}

Como também era pretendido que não houvesse repetição de modelos a mesma função

reduce foi utilizada.

function(key, values) {

return null;

}

A querie feita à view foi a seguinte.

127.0.0.1:5984/tese1/_design/teste1/_view/tese15?group=true

63

Benchmarking _____________________________________________________________________________

4.4 Criação de Índices

Com vista a aumentar o desempenho nas consultas foram criados índices nos campos

utilizados por estas. Relativamente ao MySQL foram criados índices nos campos utilizados

nas três consultas, nomeadamente, cancelled, arrdelay, airport, diverted, model, tailnum e

manufacturer. Na seguinte figura está representado um exemplo da criação de um índice no

MySQL relativamente ao campo airport.

Figura 25 - Criação de um índice no MySQL

Já em relação ao CouchDB, as views criadas já fazem o papel de um índice.

Relativamente ao MongoDB os índices utilizados foram na primeira consulta, simples, e nas

consultas dois e três compound indexes, em que todos os campos são indexados no mesmo

índice.

Para a primeira consulta, foi criado um índice sobre o arrdelay por ordem descendente visto

que na consulta é pretendido o valor maior.

db.teste.createIndex({"arrdelay": -1})

Na segunda consulta foi criado um compound index em todos os campos utilizados nas

consultas.

db.teste.createIndex({"tailnum.tailnum": 1, "tailnum.manufacturer": 1, "diverted":

1})

Na terceira consulta foi criado também um compound index em todos os campos.

db.teste.createIndex({"origin.airport": 1, "dest.airport": 1, "tailnum.model":1,

"cancelled": 1})

Benchmarking _______________________________________________________________________________

64

4.5 Resultados

Agora será analisado o desempenho das duas bases de NoSql (MongoDB e CouchDB) e

Relacional (MySQL). Para tal foram usados vários tamanhos de bases de dados. A BD1

possui um milhão e meio de registos, a BD2 possui quarto milhões e setecentos mil registos,

a BD3 possui cerca de quinze milhões de registos e, por fim, a BD4 possui cerca de quarenta

e um milhões de registos. Posteriormente, por cada consulta será avaliado o desempenho

das três bases de dados em estudo (MongoDB, CouchDB e MySQL).

4.5.1 Consulta 1

No seguinte gráfico estão representados os resultados de desempenho nas três bases de

dados relativamente à consulta 1.

Figura 26 - Comparação de desempenhos na Consulta 1

4.5.2 Consulta 2

No seguinte gráfico estão representados os resultados de desempenho das três bases de

dados relativamente à consulta 2.

65

Benchmarking _____________________________________________________________________________

Figura 27 - Comparação de desempenhos na Consulta 2

4.5.3 Consulta 3

No seguinte gráfico estão representados os resultados de desempenho nas três bases de

dados relativamente à consulta 2.

Figura 28 - Comparação de desempenhos na Consulta 3

4.6 Discussão de Resultados

Relativamente à consulta um, não existem diferenças substanciais entre as três bases de

dados em estudo. Com o aumento da quantidade de registos nota-se um ligeiro aumento de

Benchmarking _______________________________________________________________________________

66

tempo, mas mesmo assim os tempos são bastantes semelhantes entre os vários tamanhos de

base de dados, o que revela um bom desempenho com funções de agregação. De referir

apenas que o CouchDB na base de dados maior demorou quase o dobro do tempo na

consulta comparado com as restantes, mas ainda assim o tempo é bastante reduzido.

Relativamente à consulta dois, os resultados de tempos são ótimos mas o facto de recorrer

a mais de uma tabela começa a afetar o desempenho no MySQL, aumentando o tempo de

consulta conforme o tamanho de dados aumenta. Começa-se a notar também a diferença

para o MongoDB e o CouchDB principalmente na BD4 que aponta para um melhor

desempenho das bases de dados NoSql em estudo, conforme o volume de dados aumenta.

Contudo, os resultados quase que são apresentados instantaneamente nos quatro tamanhos

de bases de dados, o que revela um bom desempenho. Entre o MongoDB e o CouchDB,

nestas consultas, não existem muitas diferenças a nível de desempenho sendo até bastante

semelhantes. A única diferença significativa entre estes foi o facto de no CouchDB ser

necessária a criação de views antes da consulta, sendo este um processo moroso uma vez

que as bases de dados possuíam milhões de registos, mas que se refletiu num bom

desempenho após a criação da view. Relativamente ao MySQL, a diferença chega a ser

notória nas tabelas do gráfico da consulta dois comparativamente às duas bases de dados

NoSQL, notando-se uma perda de desempenho ao nível que o volume de dados aumenta,

enquanto que no MongoDB e no CouchDB os tempos permanecem semelhantes.

De referir que na terceira consulta a mais complexa notou-se uma diferença, pois o facto de

recorrer a bastantes tabelas resultou em tempos muito distintos para a realização da consulta,

principalmente a partir da BD3, a qual possui cerca de quinze milhões de registos.

Com a análise efetuada é possível concluir que a utilização de documentos embutidos no

MongoDB e no CouchDB, onde todos os dados se encontram no mesmo sítio, ao contrário

do MySQL que possui os dados em várias tabelas, leva a um aumento de desempenho.

Também é possível concluir que quanto maior a quantidade de dados, maior é a diferença

de tempos entre o MongoDB e o CouchDB em relação ao MySQL, o que revela que as bases

de dados NoSql são uma boa aposta no que diz respeito a enormes volumes de dados e que

o MySQL para responder ao Big data em que o volume de dados é gigantesco,

provavelmente perderia desempenho comparado com as bases de dados NoSql em estudo.

Relativamente às duas bases de dados NoSql, é de salientar que no MongoDB apenas se

criaram índices que em comparação às views criadas no CouchDB foi um processo mais

rápido, o que revela uma superioridade do MongoDB em relação ao CouchDB.

67

Testes de Carga _____________________________________________________________________________

Capítulo 5 – Testes de Carga

Neste capítulo será comparado o desempenho entre o MySQL e o MongoDB através das

consultas um e três mas com utilizadores a acederem concorrentemente à base de dados,

tendo por base a ferramenta Jmeter. O CouchDB ficou fora desta comparação visto que o

MongoDB possui mais notoriedade e o desempenho nas consultas anteriores foi equivalente,

pelo que seria mais importante analisá-lo neste aspeto. No anexo E está presente o modo

como foram conectadas as bases de dados ao Jmeter e quais os componentes utilizados.

5.1 Base de Dados BD1

Na figura seguinte estão representados os valores de tempos obtidos na consulta 1 com

utilizadores a aceder concorrentemente à base de dados, nomeadamente, dez, vinte e

cinquenta utilizadores.

Figura 29 - Resultado do Teste de carga utilizando a consulta 1

Na figura seguinte estão representados os valores de tempos obtidos na consulta 3 com

utilizadores a aceder concorrentemente à base de dados, nomeadamente, dez, vinte e

cinquenta utilizadores.

Testes de Carga _______________________________________________________________________________

68

Figura 30 - Resultado do Teste de carga utilizando a consulta 3

5.2 Base de dados BD2

Na figura seguinte estão representados os valores de tempos obtidos na consulta 1 com

utilizadores a aceder concorrentemente à base de dados, nomeadamente, dez, vinte e

cinquenta utilizadores.

Figura 31 - Resultado do Teste de carga utilizando a consulta 1

Na figura seguinte estão representados os valores de tempos obtidos na consulta 3 com

utilizadores a aceder concorrentemente à base de dados, nomeadamente, dez, vinte e

cinquenta utilizadores.

69

Testes de Carga _____________________________________________________________________________

Figura 32 - Resultado do Teste de carga utilizando a consulta 3

5.3 Base de dados BD3

Na figura seguinte estão representados os valores de tempos obtidos na consulta 1 com

utilizadores a aceder concorrentemente à base de dados, nomeadamente, dez, vinte e

cinquenta utilizadores.

Figura 33 - Resultado do Teste de carga utilizando a consulta 1

Na figura seguinte estão representados os valores de tempos obtidos na consulta 3 com

utilizadores a aceder concorrentemente à base de dados, nomeadamente, dez, vinte e

cinquenta utilizadores.

Testes de Carga _______________________________________________________________________________

70

Figura 34 - Resultado do Teste de carga utilizando a consulta 3

5.4 Base de dados BD4

Na figura seguinte estão representados os valores de tempos obtidos na consulta 1 com

utilizadores a aceder concorrentemente à base de dados, nomeadamente, dez, vinte e

cinquenta utilizadores.

Figura 35 - Resultado do Teste de carga utilizando a consulta 1

Na figura seguinte estão representados os valores de tempos obtidos na consulta 3 com

utilizadores a aceder concorrentemente à base de dados, nomeadamente, dez, vinte e

cinquenta utilizadores.

71

Testes de Carga _____________________________________________________________________________

Figura 36 - Resultado do Teste de carga utilizando a consulta 3

5.5 Discussão de resultados

Relativamente à consulta um não existem muitas diferenças entre os vários tamanhos de

bases de dados, apenas de salientar que o MongoDB na BD4, que é a base de dados maior,

obteve melhor desempenho que nas restantes que possuem menos dados, apesar da

diferença ser mínima sugere um melhor desempenho com maiores quantidades de dados.

Em comparação com o MySQL notam-se diferenças substanciais nas barras dos gráficos

mas que em relação ao tempo de execução, a diferença entre estas não é muito relevante,

sendo apenas diferenças de décimas.

No que diz respeito à consulta três, que era a consulta mais “pesada”, o MySQL tem um

desempenho bastante inferior ao MongoDB, chegando mesmo a diferenças de dezenas de

segundos. O facto desta consulta ir a múltiplas tabelas prejudica bastante o desempenho do

MySQL em acessos concorrentes à base de dados. A diferença mais substancial é na BD4,

na qual o MongoDB tem um ótimo desempenho com quantidades elevadas de dados e com

o máximo de utilizadores em teste, obtendo mesmo uma diferença de cerca de duzentos

segundos de diferença relativamente ao MySQL. Onde o MySQL se aproximou mais do

MongoDB foi na BD2 e BD3, mas ainda assim com diferenças de alguns segundos.

Concluindo, com operações de agregação e com consultas que não necessitem de recorrer a

muitas tabelas o MySQL revela um bom desempenho, que apesar de ter sido o melhor

desempenho as diferenças para o MongoDB não foram muito elevadas o que revela o

MongoDB como uma boa alternativa. Já na consulta três o MySQL, com o aumento do

volume de dados, vai perdendo cada vez mais desempenho e distancia-se bastante do

Testes de Carga _______________________________________________________________________________

72

MongoDB. Este por sua vez com a BD4, que é a maior base de dados, possui um ótimo

desempenho, mesmo com o máximo de utilizadores testados a acederem concorrentemente

à base de dados, o que o torna bastante atrativo para situações em que com a tecnologia

relacional exista a necessidade de consultar um número elevado de tabelas.

73

Conclusões _____________________________________________________________________________

Capítulo 6 – Conclusões

Neste capítulo são apresentadas as conclusões do trabalho efetuado. Este está dividido em

três secções, nomeadamente, as contribuições do trabalho para o setor em estudo, as

limitações que foram sentidas e o trabalho futuro a ser realizado.

6.1 Contribuições

As bases de dados NoSql estão cada vez mais presentes nas empresas, sendo vistas como

uma alternativa viável para armazenamento de grandes volumes de dados quando a

disponibilidade e a tolerância ao particionamento são as características mais importantes.

Os objetivos propostos para esta dissertação foram atingidos, tendo-se obtido uma

comparação entre as tecnologias relacional e não relacional, bem como entre duas Document

Databases (MongoDB e CouchDB).

É evidenciado que a tecnologia não relacional, nomeadamente as Document Databases,

possui vantagens significativas nas consultas que não utilizam funções de agregação bem

como o facto de serem livres de esquemas, o que as torna numa potente alternativa a ser

utilizada pelas empresas.

Relativamente aos testes de carga, o MongoDB obteve melhor desempenho

comparativamente ao MySQL na consulta que necessitava de percorrer mais tabelas, sendo

que assim, conforme a complexidade dos dados aumenta e mais tabelas, por ventura,

necessitarem de ser criadas e posteriormente consultadas, o desempenho do MySQL irá

agravar-se, contrariamente ao MongoDB, onde o facto de não necessitar de esquemas se

torna bastante vantajoso comparativamente ao MySQL.

A situação de migração da tecnologia relacional para a não relacional deve ser devidamente

analisada, pois quanto maior o volume de dados maiores são os custos de migração e, sendo

assim, as vantagens devem compensar o investimento.

Importa ainda referir que um excerto da presente dissertação foi aprovado em artigo e

apresentado na CAPSI 2015 no ISCTE, contribuindo desta forma para a evidenciação das

diferenças entre as Document Databases e o MySQL.

6.2 Dificuldades

Em todos os trabalhos existem limitações e sendo assim este não foi exceção. A primeira

limitação foi verificada em termos de carregamento de dados, no qual o dataset possuía

bastantes dados inconsistentes pelo que teve de ser devidamente tratado. Era pretendido um

dataset com grande volume de dados e com vários tipos de dados mas foi verificado que era

Conclusões _______________________________________________________________________________

74

algo bastante difícil de ser encontrado.

A segunda limitação identificada foi o facto de se lidar com milhões de registos, o que

requeria um servidor potente, pelo que o carregamento foi um processo bastante moroso.

A terceira e última limitação identificada foi que para embutir documentos, o facto de estes

serem complexos e com bastantes campos, a sua criação através do programa em java foi

bastante lenta, sendo que foram gerados documentos de seiscentos mil em seiscentos mil,

para este não crashar e parar.

6.3 Trabalho futuro

No desenvolvimento desta dissertação vários caminhos podiam ter sido tomados, os quais

identificam possibilidades que ficaram por investigar. Estas oportunidades complementam

o trabalho realizado pelo que devem ser ponderadas.

No que diz respeito à escalabilidade, pode ser analisado o desempenho das bases de dados

relacionais e não relacionais com os servidores distribuídos por várias máquinas e assim

efetuar comparações e verificar se são compensatórias as vantagens das bases de dados

NoSql neste ponto. Nessa comparação podem também ser incluídos testes de carga com

vários utilizadores a aceder simultaneamente à base de dados, quer para consultar ou inserir

dados, e verificar como esta se comporta. Também se poderia incluir a análise de

desempenho relativamente a updates com os testes de carga referidos anteriormente.

75

Referências Bibliográficas _____________________________________________________________________________

Referências Bibliográficas

10gen. (2011). MongoDB. Retrieved from http://www.MongoDB.org/

Abadi, D. J., & Madden, S. (2008). Query Execution in Column-Oriented Database

Systems.

Massachusetts Institute of Technology.

Abramova, V., Bernardino, J., & Pedro, F. (2014). Experimental Evaluation of NoSql

Databases.

International Journal of Database Management Systems (IJDMS), 6(3), 1–16.

Alexandre, J., & Cavique, L. (2013). NoSql no suporte à análise de grande volume de dados.

Revista de Ciencias de Computação, 8, 37 – 48. Retrieved from

http://repositorioaberto.uab.pt/handle/10400.2/3091

Almeida, R. C. De, & Brito, P. F. De. (2012). Utilização da Classe de Banco de Dados

NOSQL como Solução para Manipulação de Diversas Estruturas de Dados. Palmas.

Anderson, J. C., Lehnardt, J., & Slater, N. (2010). CouchDB: The Definitive Guide. (O. M.

Inc., Ed.).

Apache CouchDB. (2011). Retrieved from http://CouchDB.apache.org/

Atzeni, P., Bugiotti, F., & Rossi, L. (2013). Uniform access to NoSql systems. Information

Systems, 43, 117–133. doi:10.1016/j.is.2013.05.002

Baltzan, P., & Phillips, A. (2012). Business driven information systems (3a edição.). Basso,

C., & Padua, R. de. (2014). O Uso de Big Data nas Universidades. Seminário de Iniciação

Científica, 94. Retrieved from

http://editora.unoesc.edu.br/index.php/siepe/article/view/5567

Bell, C., Kindahl, M., & Thalmann, L. (2010). MySQL High Availability. (A. Oram, Ed.)

(1o edition.). O’Reilly Media, Inc.

Bock, D. B., & Schrage, J. F. (2002). Denormalization guidelines for base and transaction

tables.

ACM SIGCSE Bulletin, 34, 129. doi:10.1145/820127.820184

Bonnet, L., Laurent, A., Sala, M., Laurent, B., & Sicard, N. (2011). Reduce, you say: What

NoSql can do for data aggregation and BI in large repositories. Proceedings - International

Workshop on Database and Expert Systems Applications, DEXA, 483–488.

doi:10.1109/DEXA.2011.71

Brewer, E. (2000). Towards Robust Distributed Systems. In Proceedings of the nineteenth

annual ACM symposium on Principles of distributed computing (Vol. 19, pp. 1–12).

doi:10.1145/343477.343502

Cardoso, R. (2012). Bases de Dados NoSql. Instituto Superior de Engenharia do Porto.

Referências Bibliográficas _______________________________________________________________________________

76

Carniel, A. C., Sá, A. D. A., Henrique, V., Brisighello, P., Ribeiro, M. X., Bueno, R., Ciferri,

R. R. (2012). Análise Experimental de Bases de Dados Relacionais e NoSql no

Processamento de Consultas sobre Data Warehouse. Brazilian Symposium on Databases -

Short Paper, d, 113–120. Retrieved from

http://data.ime.usp.br/sbbd2012/artigos/pdfs/sbbd_shp_15.pdf

Castro, J., & Batista, E. (2013). Comparação entre Banco de Dados Relacionais e Não-

Relacionais – MySQL x NoSql. Revista Network Technologies Faculdades Network –

Revista Da Faculdade de Sistema de Informação, Ano 7, No, 111.

Cattell, R. (2011). Scalable SQL and NoSql data stores. ACM SIGMOD Record, 39(4), 12.

doi:10.1145/1978915.1978919

Clarck, B. (2009). NoSql: If Only It Was That Easy. Retrieved February 11, 2015, from

https://markedaspertinent.wordpress.com/2009/08/04/NoSql-if-only-it-was-that-easy/

Coronel, C., Morris, S., & Rob, P. (2013). Database Systems: Design, Implementation and

Management. Management (p. 692).

D., M., & Kelly, A. (2013). Making Sense of NoSql: A guide for managers and the rest of

us.

Date, C. J. (2004). Introdução a Sistemas de Bancos de Dados. (E. Campus, Ed.) (8a

edição.).

Dean, J., & Ghemawat, S. (2004). MapReduce: Simplied Data Processing on Large

Clusters.

Proceedings of 6th Symposium on Operating Systems Design and Implementation, 137–

149. doi:10.1145/1327452.1327492

DeCandia, G., Hastorun, D., Jampani, M., Kakulapati, G., Lakshman, A., Pilchin, A.,

Vogels, W. (2007). Dynamo : Amazon’s Highly Available Key-value Store. ACM SIGOPS

Operating Systems Review, 41, 205–220. doi:10.1145/1323293.1294281

Diana, M. De, & Gerosa, M. A. (2010). NoSql na Web 2.0: Um estudo comparativo de

bancos Não-Relacionais para Armazenamento de Dados na Web 2.0. WTDBD 2010-IX

Workshop de Teses E Dissertações em Bancos de Dados. Retrieved from

http://www.lbd.dcc.ufmg.br/colecoes/wtdbd/2010/sbbd_wtd_12.pdf

Dimitrov, M. (2010). NoSql Databases. Ontotext. Retrieved from

http://pt.slideshare.net/marin_dimitrov/NoSql-databases-3584443

Ferreira, L. (2012). Bridging the gap between SQL and NoSql. Universidade do Minho.

Forbes, D. (2010). Getting Real about NoSql and the SQL-Isn’t-Scalable Lie. Retrieved from

https://dennisforbes.ca/index.php/2010/03/02/getting-real-about-NoSql-and-the-Sql-isnt-

scalable-lie/

Frozza, A. A., Schuch, E. M., Ohana, G., & Catarina, B. (2011). POSTGRESQL X

MONGODB: Comparação dos Recursos para Manipulação de Dados Geográficos.

77

Referências Bibliográficas _____________________________________________________________________________

Gilbert, S., & Lynch, N. (2002). Brewer’s conjecture and the feasibility of consistent,

available, partition-tolerant web services. ACM SIGACT News, 33, 51.

doi:10.1145/564585.564601

Grolinger, K., Higashino, W. a, Tiwari, A., & Capretz, M. A. (2013). Data management in

cloud environments: NoSql and NewSQL data stores. Journal of Cloud Computing:

Advances, Systems and Applications, 2, 22. doi:10.1186/2192-113X-2-22

Guimarães, T., Nakai, A., & Vieira, L. (2013). Banco de dados NoSql para integração de

bases de dados de gases de efeito estufa. Mostra de Estagiários e Bolsistas da Embrapa

Informática Agropecuária, 9., 2013, Campinas. Brasília, DF: Embrapa, 2013. Retrieved

from http://www.alice.cnptia.embrapa.br/bitstream/doc/981973/1/NoSql.pdf

Han, J., Haihong, E., Le, G., & Du, J. (2011). Survey on NoSql database. Proceedings - 2011

6th International Conference on Pervasive Computing and Applications, ICPCA 2011, 363–

366. doi:10.1109/ICPCA.2011.6106531

Hecht, R., & Jablonski, S. (2011). NoSql evaluation: A use case oriented survey. 2011

International Conference on Cloud and Service Computing, 336–341.

doi:10.1109/CSC.2011.6138544

Imielinski, T., & Lipski, W. (1982). A systematic approach to relational database. In ACM

SIGMOD international conference on Management of data (pp. 8–14). Retrieved from

http://dl.acm.org/citation.cfm?id=582356&dl=ACM&coll=DL&CFID=478886163&CFT

OKE N=69157666

Indrawan-Santiago, M. (2012). Database research: Are we at a crossroad? Reflection on

NoSql. Proceedings of the 2012 15th International Conference on Network-Based

Information Systems, NBIS 2012, 45–51. doi:10.1109/NBiS.2012.95

Jacobs, A. (2009). The Pathologies of Big data. ACM Queue, 7(6). Retrieved from

http://queue.acm.org/detail.cfm?id=1563874

James Manyika, Michael Chui, Brad Brown, Jacques Bughin, Richard Dobbs, Charles

Roxburgh, A. H. B. (2011). Big data: The next frontier for innovation, competition, and

productivity. McKinsey Global Institute, (June), 156. doi:10.1080/01443610903114527

Leavitt, N. (2010). Will NoSql Databases Live Up to Their Promise? Computer, 43(2), 12–

14. doi:10.1109/MC.2010.58

Lee, K. K. Y., Tang, W. C., & Choi, K. S. (2013). Alternatives to relational database:

Comparison of NoSql and XML approaches for clinical data storage. Computer Methods

and Programs in Biomedicine, 110(1), 99–109. doi:10.1016/j.cmpb.2012.10.018

Liu, Z., He, B., Hsiao, H., & Chen, Y. (2011). Efficient and scalable data evolution with

column oriented databases. … Conference on Extending Database, 105 – 116.

doi:10.1145/1951365.1951380

Lóscio, B. F., Oliveira, H. R. De, & Pontes, J. C. D. S. (2011). NoSql no desenvolvimento

de aplicações Web colaborativas, 1 – 17. Retrieved from

Referências Bibliográficas _______________________________________________________________________________

78

http://www.addlabs.uff.br/sbsc_site/SBSC2011_NoSql.pdf

Mattar, F. N. (1994). Pesquisa de Marketing.

MongoDB. (2011a). BSON. Retrieved February 11, 2015, from

http://blog.MongoDB.org/post/114440717/bson

MongoDB. (2011b). Data Models. Retrieved February 11, 2015, from

http://docs.MongoDB.org/manual/data-modeling/

MongoDB. (2011c). ObjectId. Retrieved February 11, 2015, from

http://docs.MongoDB.org/manual/reference/object-id/

MongoDB. (2011d). Replication. Retrieved February 11, 2015, from

http://docs.MongoDB.org/manual/replication/

MongoDB. (2011e). SQL to MongoDB Mapping Chart. Retrieved February 11, 2015, from

http://docs.MongoDB.org/manual/reference/Sql-comparison/

Moniruzzaman, A., & Hossain, S. (2013). NoSql database: New era of databases for Big

data analytics-classification, characteristics and comparison. arXiv Preprint

arXiv:1307.0191, 6(4), 1–14. Retrieved from http://arxiv.org/abs/1307.0191

Parikh, J. (2013). Facebook Newsroom : A new Datacenter for Iowa. Retrieved February

11, 2015, from http://newsroom.fb.com/

Piovesan, A., & Temporini, E. R. (1995). Pesquisa exploratória: procedimento

metodológico para o estudo de fatores humanos no campo da saúde pública. Revista de

Saúde Pública, 29 (011), 318 – 325. doi:10.1590/S0034-89101995000400010

Pozzani, G. (2013). Introduction to NOSQL. NoSql Seminar. NoSql Seminar. Retrieved

from http://www.cs.tut.fi/~tjm/seminars/NoSql2012/NoSql-Intro.pdf

Pritchett, D. (2008). Base: an Acid Alternative. Queue, 6(June 2008), 48–55.

doi:10.1145/1394127.1394128

Purcell, B. (2013). The emergence of “Big data” technology and analytics. Journal of

Technology Research, 1 – 7.

Queiroz, G. R. De, Miguel, A., Monteiro, V., & Câmara, G. (2013). Bancos de Dados

Geográficos e Sistemas NoSql : Onde Estamos e para Onde vamos, Geographic Databases

and NoSql : Accomplishments and Future Directions. Revista Brasileira de Cartografia,

479–492.

Redmond, E., & Wilson, J. R. (2012). Seven Databases in Seven Weeks. North (p. 347).

Révillion, A. S. P. (2001). A Utilização de Pesquisas Exploratórias na Área de Marketing.

XXV

Encontro Da ANPAD, 1 – 15.

Richardson. (1989). Pesquisa social: métodos e técnicas. São Paulo. Rodrigues, W. (2007).

79

Referências Bibliográficas _____________________________________________________________________________

Metodologia científica. doi:10.1038/140260c0

Rybiński, H. (1987). On First-Order-Logic Databases. ACM Transactions on Database

Systems.

Retrieved from http://dl.acm.org/citation.cfm?id=27630 Sadalage, P. J., & Fowler, M.

(2012). NoSql Distilled (p. 192).

Sampieri, Collado, & Lucio. (1991). Metodología de la investigación. Mexico.

Schram, A., & Anderson, K. M. (2012). MySQL to NoSql. Proceedings of the 3rd Annual

Conference on Systems, Programming, and Applications: Software for Humanity -

SPLASH ’12, 191. doi:10.1145/2384716.2384773

Scofield, B. (2009). NoSql Misconceptions. Retrieved from http://viget.com/extend/NoSql-

misconceptions

Shawrtz, B., Zaitsev, P., & Tkachenco, V. (2012). High Performance MySQL. (A. Oram,

Ed.) (3ord Editi.). O’Reilly Media, Inc.

Silberschartz, A., Korth, H., & Sudarshan, S. (1999). Sistemas de Banco de Dados.

Silva, C. A. R. F. O. Da. (2011). Data modeling with NoSql : how, when and why. Faculdade

de Engenharia da Universidade do Porto. Retrieved from http://hdl.handle.net/10216/61586

Sousa, P. (2010). O teorema CAP. Retrieved February 26, 2015, from

https://unrealps.wordpress.com/2010/12/28/o-teorema-cap/

Stonebraker, M. (2009). The “NoSql” Discussion has Nothing to Do With SQL. Retrieved

from http://cacm.acm.org/blogs/blog-cacm/50678-the-NoSql-discussion-has-nothing-to-

do-with- Sql/fulltext

Stonebraker, M. (2010). SQL databases v. NoSql databases. Communications of the ACM,

53(4), 10. doi:10.1145/1721654.1721659

Stonebraker, M. (2011). Stonebraker on NoSql and enterprises. Communications of the

ACM, 54(8), 10. doi:10.1145/1978542.1978546

Strauch, C. (2010). NoSql Databases (p. 120). Stuttgart. Tiwari, S. (2011). Professional

NoSql.

Tauro, J. M., Aravindh, S., Shreeharsha, A. B. (2012). Comparative Study of the New

Generation, Agile, Scalable, High Performance NOSQL Databases. International Journal of

Computer Applications, 48(20), 1–4. doi:10.5120/7461-0336

Toth, R. (2012). Abordagem NoSql – uma real alternativa. Dcomp.sor.ufscar.br, 1–6.

Retrieved from http://www.dcomp.sor.ufscar.br/verdi/topicosCloud/NoSql_artigo.pdf

Toth, R. M. (2011). Abordagem NoSql- Uma real Alternativa (pp. 1 – 6). Sorocaba.

Retrieved from http://www2.sor.ufscar.br/verdi/topicosCloud/NoSql_artigo.pdf

Vieira, M., Figueiredo, J., Liberatti, G., & Viebrantz, A. (2012). Bancos de Dados NoSql:

Referências Bibliográficas _______________________________________________________________________________

80

conceitos, ferramentas, linguagens e estudos de casos no contexto de Big data. Simpósio

Brasileiro DE Banco de Dados, (1), 1 – 30. Retrieved from

http://data.ime.usp.br/sbbd2012/artigos/pdfs/sbbd_min_01.pdf

Vogels, W. (2009). Eventually Consistent. Communications of the Acm, 52, 14.

doi:10.1145/1466443.1466448

Warden, P. (2011). Big data Glossary. (M. Loukides, Ed.) (p. 56). O’Reilly Media, Inc.

White, T. (2012). Hadoop: The definitive guide. Online (Vol. 54, p. 258). doi:citeulike-

article- id:4882841

81

Anexos _____________________________________________________________________________

Anexos

83

Anexos _____________________________________________________________________________

Anexo A

Extrato de Código 1 package dissertacao.Classes;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.List;

/**

*

* @author Gon

*/

public class Airplane {

public String tailnum;

public String issue_data;

public String year;

public String status;

public String airline;

public String engine_type;

public String type;

public String aircraft_type;

public String model;

public String manufacturer;

public Object id;

// get & set

@Override

public String toString()

{

String s = "{" +

"'tailnum':'" + tailnum + "'" +

", 'issue_data':'" + issue_data + "'" +

", 'year_airplane':" + year +

", 'status':'" + status + "'" +

", 'airline':'" + airline + "'" +

", 'engine_type':'" + engine_type + "'" +

", 'type':'" + type + "'" +

", 'aircraft_type':'" + aircraft_type + "'"

+

", 'model':'" + model + "'" +

", 'manufacturer':'" + manufacturer + "'" +

"}";

return s;

}

package dissertacao.Classes;

/**

Anexos _______________________________________________________________________________

84

*

* @author Gon

*/

public class Airport {

public Object idAirport;

public String airport;

public Object city;

public Object state;

public Object country;

public Object latitude;

public Object longitude;

public Object id;

// get & set

@Override

public String toString()

{

String s = "{" +

"'idAirport':'" + idAirport + "'" +

", 'airport':'" + airport + "'" +

", 'city':'" + city + "'" +

", 'state':'" + state + "'" +

", 'country':'" + country + "'" +

", 'latitude':'" + latitude + "'" +

", 'longitude':'" + longitude + "'" +

"}";

return s;

}

}

package dissertacao.Classes;

/**

*

* @author Gon

*/

public class Flight {

public Object id_flight;

public Object month;

public Object year;

public Object dayofmonth;

public Object dayofweek;

public Object deptime;

public Object crsdeptime;

public Object arrtime;

public Object crsarrtime;

85

Anexos _____________________________________________________________________________

public Object flightnum;

public Object id;

public Object tailnum;

public Object actualelapsedtime;

public Object crselapsedtime;

public Object airtime;

public Object arrdelay;

public Object depdeplay;

public Object origin;

public Object dest;

public Object distance;

public Object taxiin;

public Object taxiout;

public Object cancelled;

public Object diverted;

public Airplane airplane;

public Airport airport;

// get & set

@Override

public String toString()

{

return "Flight{" +

" _id='" + id + "'" +

", id_flight='" + id_flight.toString() + "'"

+

", month='" + month.toString() + "'" +

", year='" + year + "'" +

", dayofmonth='" + dayofmonth + "'" +

", dayofweek='" + dayofweek + "'" +

", deptime='" + deptime + "'" +

", crsdeptime='" + crsdeptime + "'" +

", arrtime='" + arrtime + "'" +

", crsarrtime='" + crsarrtime + "'" +

", arrdelay='" + arrdelay + "'" +

", depdeplay='" + depdeplay + "'" +

", airtime='" + airtime + "'" +

", actualelapsedtime='" + actualelapsedtime

+ "'" +

", crselapsedtime='" + crselapsedtime + "'"

+

", flightnum='" + flightnum + "'" +

", tailnum='" + tailnum + "'" +

", origin='" + origin + "'" +

", dest='" + dest + "'" +

", distance='" + distance + "'" +

", taxiin='" + taxiin + "'" +

", taxiout='" + taxiout.toString() + "'" +

", cancelled='" + cancelled + "'" +

", diverted='" + diverted + "'" +

", airport=" + airport.toString() +

", airplane=" + airplane.toString() +

Anexos _______________________________________________________________________________

86

'}';

}

}

Extrato de código 2

package dissertacao;

import com.MongoDB.DB;

import com.MongoDB.MongoClient;

import java.net.UnknownHostException;

/**

*

* @author Gon

*/

class MongoConnection {

private static final String HOST = "127.0.0.1";

private static final int PORT = 27017;

private static final String db_name = "tese4";

private static MongoConnection uniqInstance;

private static int mongoInstance = 1;

private MongoClient mongo;

private DB db;

private MongoConnection(){

// contrutor private para ser usado pela variavel

criada acima

}

public static synchronized MongoConnection getInstance()

{

if(uniqInstance == null)

{

uniqInstance = new MongoConnection();

}

return uniqInstance;

}

// garante um unico objeto mongo

public DB getDB()

{

if(mongo == null)

{

try{

mongo = new MongoClient(HOST, PORT);

db = mongo.getDB(db_name);

System.out.println("Mongo: " +

87

Anexos _____________________________________________________________________________

mongoInstance++);

}

catch(UnknownError e)

{

e.printStackTrace();

}

}

return db;

}

}

Extrato de código 3

package dissertacao;

import com.MongoDB.DBCollection;

import com.MongoDB.DBCursor;

import com.MongoDB.DBObject;

import dissertacao.Classes.AirplaneConverter;

import dissertacao.Classes.Flight;

import java.util.ArrayList;

import java.util.List;

/**

*

* @author Gon

*/

public class FlightDao {

private DBCollection db;

public FlightDao()

{

this.db =

MongoConnection.getInstance().getDB().getCollection("Flight"

);

System.out.println(db);

}

public List<Flight> findFlight(DBObject dbo) {

ArrayList<Flight> avioes = new ArrayList<Flight>();

DBCursor cursor = db.find(dbo);

long i = 0;

while (cursor.hasNext()){

if(i > 40800000 && i < 41400001)

{

avioes.add(AirplaneConverter.converterParaFlight(cursor.next

()));

}

else if(i > 41400001)

Anexos _______________________________________________________________________________

88

{

System.out.println("brekou");

break;

}

else

{

cursor.next();

}

i += 1;

}

return avioes;

}

}

package dissertacao;

import com.MongoDB.DBCollection;

import com.MongoDB.connection.Connection;

import com.MongoDB.DBCursor;

import com.MongoDB.DBObject;

import com.MongoDB.Mongo;

import dissertacao.Classes.Airplane;

import dissertacao.Classes.AirplaneConverter;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.List;

/**

*

* @author Gon

*/

public class AirplaneDao implements IAirplaneDao<Airplane>{

private DBCollection db;

public AirplaneDao()

{

this.db =

MongoConnection.getInstance().getDB().getCollection("Airplan

e");

System.out.println(db);

}

public List<Airplane> findAirplanes(DBObject dbo) {

ArrayList<Airplane> avioes = new

ArrayList<Airplane>();

DBCursor cursor = db.find(dbo);

while (cursor.hasNext()){

89

Anexos _____________________________________________________________________________

avioes.add(AirplaneConverter.converterParaAirplane(cursor.ne

xt()));

}

return avioes;

}

}

package dissertacao;

import com.MongoDB.DBCollection;

import com.MongoDB.DBCursor;

import com.MongoDB.DBObject;

import dissertacao.Classes.Airplane;

import dissertacao.Classes.AirplaneConverter;

import dissertacao.Classes.Airport;

import java.util.ArrayList;

import java.util.List;

/**

*

* @author Gon

*/

public class AirportDao {

private DBCollection db;

public AirportDao()

{

this.db =

MongoConnection.getInstance().getDB().getCollection("Airport

");

System.out.println(db);

}

public List<Airport> findAirport(DBObject dbo) {

ArrayList<Airport> avioes = new

ArrayList<Airport>();

DBCursor cursor = db.find(dbo);

while (cursor.hasNext()){

avioes.add(AirplaneConverter.converterParaAirport(cursor.nex

t()));

}

return avioes;

}

}

Anexos _______________________________________________________________________________

90

Extrato de código 4

package dissertacao.Classes;

import com.MongoDB.DBObject;

/**

*

* @author Gon

*/

public class AirplaneConverter {

public static Airplane converterParaAirplane(DBObject

dbo)

{

Airplane aviao = new Airplane();

aviao.id = dbo.get("_id");

aviao.year = (String) dbo.get("year");

aviao.year = aviao.year.replace("\r", "");

aviao.status = (String) dbo.get("status");

aviao.aircraft_type = (String)

dbo.get("aircraft_type");

aviao.airline = (String) dbo.get("airline");

aviao.engine_type = (String)dbo.get("engine_type");

aviao.issue_data = (String)dbo.get("issue_data");

aviao.manufacturer =

(String)dbo.get("manufacturer");

aviao.model = (String)dbo.get("model");

aviao.tailnum = (String)dbo.get("tailnum");

aviao.type =(String)dbo.get("type");

return aviao;

}

public static Airport converterParaAirport(DBObject dbo)

{

Airport aviao = new Airport();

aviao.id = dbo.get("_id");

aviao.idAirport = dbo.get("idairport");

String x = "" + dbo.get("airport");

aviao.airport = x.replace("'", "");

aviao.city = dbo.get("city");

aviao.country = dbo.get("country");

aviao.latitude = dbo.get("latitude");

aviao.longitude = dbo.get("longitude");

aviao.state = dbo.get("state");

return aviao;

}

public static Flight converterParaFlight(DBObject dbo)

{

Flight aviao = new Flight();

aviao.id = dbo.get("_id");

aviao.year = dbo.get("year");

91

Anexos _____________________________________________________________________________

aviao.actualelapsedtime =

dbo.get("actualelapsedtime");

aviao.airtime = dbo.get("airtime");

aviao.arrdelay = dbo.get("arrdelay");

aviao.cancelled = (String)dbo.get("cancelled");

aviao.arrtime = dbo.get("arrtime");

aviao.crsarrtime = dbo.get("crsarrtime");

aviao.crsdeptime = dbo.get("crsdeptime");

aviao.crselapsedtime =dbo.get("crselapsedtime");

aviao.dayofmonth =dbo.get("dayofmonth");

aviao.dayofweek =dbo.get("dayofweek");

aviao.depdeplay =dbo.get("depdelay");

aviao.deptime =dbo.get("deptime");

aviao.dest =dbo.get("dest");

aviao.origin =dbo.get("origin");

aviao.taxiin =dbo.get("taxiin");

aviao.taxiout =dbo.get("taxiout");

aviao.distance =dbo.get("distance");

aviao.diverted =dbo.get("diverted");

aviao.flightnum =dbo.get("flightnum");

aviao.tailnum =dbo.get("tailnum");

aviao.id_flight = dbo.get("id_flight");

aviao.month = dbo.get("month");

return aviao;

}

}

Extrato de código 5

package dissertacao;

import dissertacao.Classes.Airplane;

import dissertacao.Classes.Airport;

/**

*

* @author Gon

*/

class FlightFinal {

public Object id_flight;

public Object month;

public Object year;

public Object dayofmonth;

public Object dayofweek;

public Object deptime;

public Object crsdeptime;

public Object arrtime;

public Object crsarrtime;

public Object flightnum;

public Object id;

public Airplane tailnum;

Anexos _______________________________________________________________________________

92

public Object actualelapsedtime;

public Object crselapsedtime;

public Object airtime;

public Object arrdelay;

public Object depdeplay;

public Airport origin;

public Airport dest;

public Object distance;

public Object taxiin;

public Object taxiout;

public Object cancelled;

public Object diverted;

// get & set

@Override

public String toString()

{

String s = "{" +

" '_id':'" + id + "'" +

", 'id_flight':" + id_flight.toString() +

", 'month':" + month.toString() +

", 'year':" + year +

", 'dayofmonth':" + dayofmonth +

", 'dayofweek':" + dayofweek +

", 'deptime':" + deptime +

", 'crsdeptime':" + crsdeptime +

", 'arrtime':" + arrtime +

", 'crsarrtime':" + crsarrtime +

", 'arrdelay':" + arrdelay +

", 'depdeplay':" + depdeplay +

", 'airtime':" + airtime +

", 'actualelapsedtime':" + actualelapsedtime

+

", 'crselapsedtime':" + crselapsedtime +

", 'flightnum':'" + flightnum + "'" +

", 'origin':" + origin.toString() +

", 'dest':" + dest.toString()+

", 'distance':" + distance +

", 'taxiin':" + taxiin +

", 'taxiout':" + taxiout +

", 'cancelled':'" + cancelled + "'" +

", 'diverted':'" + diverted + "'" +

", 'tailnum':" + tailnum.toString() +

"}";

return s;

}

}

93

Anexos _____________________________________________________________________________

Extrato de código 6

package dissertacao;

import com.MongoDB.DBObject;

import com.MongoDB.QueryBuilder;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

/**

*

* @author Gon

*/

public class Dissertacao {

private AirplaneDao dao = new AirplaneDao();

private AirportDao dao1 = new AirportDao();

private AirportDao dao3 = new AirportDao();

private FlightDao dao2 = new FlightDao();

/**

* @param args the command line arguments

*/

public static void main(String[] args) throws

IOException {

AirplaneDao dao = new AirplaneDao();

AirportDao dao1 = new AirportDao();

AirportDao dao3 = new AirportDao();

FlightDao dao2 = new FlightDao();

long count = 40800001;

DBObject query = QueryBuilder

.start()

.get();

List<dissertacao.Classes.Flight> voos =

dao2.findFlight(query);

List<FlightFinal> lista = new

ArrayList<FlightFinal>();

String s = "";

try

{

for(dissertacao.Classes.Flight voo : voos)

{

DBObject query1 = QueryBuilder

.start("tailnum")

.is(voo.tailnum)

Anexos _______________________________________________________________________________

94

.get();

List<dissertacao.Classes.Airplane> aviao =

dao.findAirplanes(query1);

DBObject query2 = QueryBuilder

.start("idairport")

.is(voo.origin)

.get();

List<dissertacao.Classes.Airport> aeroporto

= dao1.findAirport(query2);

DBObject query3 = QueryBuilder

.start("idairport")

.is(voo.dest)

.get();

List<dissertacao.Classes.Airport> aeroporto1

= dao3.findAirport(query3);

FlightFinal vooFinal;

vooFinal = new FlightFinal();

vooFinal.id = count;

vooFinal.id_flight = voo.id_flight;

vooFinal.year = voo.year;

vooFinal.month = voo.month;

vooFinal.actualelapsedtime =

voo.actualelapsedtime;

vooFinal.airtime = voo.airtime;

vooFinal.arrdelay = voo.arrdelay;

vooFinal.cancelled = voo.cancelled;

vooFinal.arrtime = voo.arrtime;

vooFinal.crsarrtime = voo.crsarrtime;

vooFinal.crsdeptime = voo.crsdeptime;

vooFinal.crselapsedtime =

voo.crselapsedtime;

vooFinal.dayofmonth = voo.dayofmonth;

vooFinal.dayofweek = voo.dayofweek;

vooFinal.depdeplay = voo.depdeplay;

vooFinal.deptime = voo.deptime;

vooFinal.taxiin = voo.taxiin;

vooFinal.taxiout = voo.taxiout;

vooFinal.origin = aeroporto.get(0);

vooFinal.dest = aeroporto1.get(0);

vooFinal.distance = voo.distance;

vooFinal.diverted = voo.diverted;

vooFinal.flightnum = voo.flightnum;

vooFinal.tailnum = aviao.get(0);

lista.add(vooFinal);

System.out.println(vooFinal.toString());

count+=1;

}

95

Anexos _____________________________________________________________________________

}catch(Exception e)

{

System.out.println(e.toString());

}

BufferedWriter out = new BufferedWriter(new

FileWriter("C:\\teste6\\teste46.txt"));

for(FlightFinal fs : lista)

{

out.write(fs.toString());

}

out.close();

}

}

97

Anexos _____________________________________________________________________________

Anexo B

No site oficial do MongoDB, selecionar download e escolher a versão indicada na imagem

abaixo, isto porque é a mais completa.

Figura 37 - Download do MongoDB

De seguida clica-se no instalador e a instalação começa.

Figura 38 - Instalação do MongoDB

Escolhe-se a opção complete para instalar todas as caraterísticas que a base de dados possui.

Anexos _______________________________________________________________________________

98

Figura 39 - Setup type da instalação do MongoDB

De seguida cria-se uma pasta na diretoria C: com o nome data e uma pasta dentro desta com

o nome db, isto para corrigir o erro hotfix que não deixaria a base de dados arrancar.

Figura 40 - Correção do erro hotfix

De seguida abrir o terminal da linha de comandos e mudar a diretoria para a que contém a

base de dados MongoDB.

99

Anexos _____________________________________________________________________________

Figura 41 - Mudança para a diretoria do MongoDB

De seguida executa-se o comando mongod para dar início à aplicação.

Figura 42 - Execução do comando "mongod"

A base de dados irá correr, e deixa-se esta janela aberta para não encerrar a aplicação.

Anexos _______________________________________________________________________________

100

Figura 43 - Inicialização do MongoDB

De seguida noutro terminal da linha de comandos, muda-se a diretoria para a base de dados

MongoDB e corre-se o comando “mongo” e está pronta a utilizar.

Figura 44 - Execução do comando "mongo"

101

Anexos _____________________________________________________________________________

Anexo C

Acede-se ao site CouchDB.apache.org e efetua-se o download para a versão Windows.

Figura 45 - Download do CouchDB

Executa-se o instalador.

Figura 46 - Instalação do CouchDB

E seleciona-se a diretoria onde será instalado.

Anexos _______________________________________________________________________________

102

Figura 47 - Seleção da diretoria

De seguida localiza-se o ficheiro local.ini e altera-se a password e o user para os

pretendidos, neste caso foi alterado para gon = 1234.

Figura 48 - Alteração das credenciais do CouchDB

Posto isto, inicia-se o CouchDB clicando no ficheiro Start CouchDB e este encontra-se

iniciado.

Neste trabalho é pretendido o acesso às bases de dados através da linha de comandos, sendo

assim houve a necessidade da instalação do Curl que é uma ferramenta da linha de

comandos para transferir dados através de URL´s.

Para pôr a funcionar o curl, basta efetuar o download3, de seguida copiar o executável para

a diretoria C:\Windows\System32.

Agora executa-se o comando “curl http://127.0.0.1:5984/” e fica-se ligado ao CouchDB.

3http://curl.haxx.se/download.html

103

Anexos _____________________________________________________________________________

Figura 49 - Execução do CouchDB através do curl

Como o CouchDB não retornava os tempos de consulta automaticamente como o MySQl e

o MongoDB foi necessário arranjar uma alternativa pois saber o tempo com exatidão era

uma prioridade. Sendo assim uma opção viável era através do curl, saber o tempo que

demorava a retornar o url da consulta à view.

Primeiro foi necessário a criação de um txt com o seguinte código4.

\n

time_namelookup: %{time_namelookup}\n

time_connect: %{time_connect}\n

time_appconnect: %{time_appconnect}\n

time_pretransfer: %{time_pretransfer}\n

time_redirect: %{time_redirect}\n

time_starttransfer: %{time_starttransfer}\n

----------\n

time_total: %{time_total}\n

\n

De seguida executava-se o seguinte comando na linha de comandos apenas alterando o url

conforme a consulta pretendida.

curl -w "@curl-format.txt" -o /dev/null -s

http://127.0.0.1:5984/tese4/_design/teste4/_view/tese44?grou

p=true

4 https://josephscott.org/archives/2011/10/timing-details-with-curl/

105

Anexos _____________________________________________________________________________

Anexo D

import sys

import glob

import errno,time,os

import CouchDB,simplejson

import json

from pprint import pprint

couch = CouchDB.Server() # Assuming localhost:5984

couch.resource.credentials = ("gon", "1234")

# If your CouchDB server is running elsewhere, set it up

like this:

# couch = CouchDB.Server('http://localhost:5984/')

db = couch['tese3']

path = "C:\gon\*.json"

#dirPath = 'C:/Users/VijayKumar/Desktop/CouchDB_Python'

files = glob.glob(path)

for file1 in files:

#dirs = os.listdir( dirPath )

file2 = glob.glob(file1)

for name in file2:

try:

with open(name) as f:

for line in f:

data = json.loads(line)

db.save(data)

pprint(data)

json_data.close()

except IOError as exc:

if exc.errno != errno.EISDIR:

raise

107

Anexos _____________________________________________________________________________

Anexo E Primeiro efetua-se o download do jmeter no site official

http://jmeter.apache.org/download_jmeter.cgi. A versão instalada foi a mais recente que é a

2.13. Tem como requisito o java6 ou superior.

Figura 50 - Download do Jmeter

Posto isto basta instalar o programa e para corre-lo vai-se à diretoria bin do jmeter e executa-

se o batch jmeter em modo administrador.

Figura 51 - Inicialização do Jmeter

Com tudo já instalado e a funcionar corretamente procede-se então à configuração.

MongoDB

Relativamente ao MongoDB, primeiro cria-se um thread group onde o objetivo é gerar a

carga pretendida. No campo number of threads define-se o número de utilizadores a testar

nomeadamente 10, 20, 50. No campo Ramp-Up period define-se o período em segundos

para inicializar um novo utilizador. E no loop count define-se o número de iterações.

Anexos _______________________________________________________________________________

108

Figura 52 - Criação do Thread Group

De seguida cria-se um config element do tipo MongoDB Source Config, é aqui que se faz a

configuração à base de dados através do servidor, neste caso o localhost.

Figura 53 - Criação do config element para o MongoDB

De seguida cria-se uma sampler do tipo MongoDB script e é neste que se define a base de

dados a efetuar o teste, neste caso a tese4 com cerca de 41 milhões de registos, e a consulta

109

Anexos _____________________________________________________________________________

a ser efetuada.

Figura 54 - Criação da sampler para o MongoDB

Por fim cria-se um listener para ser possível visualizar os resultados do teste. O escolhido

foi o summary report, onde é possível visualizar o tempo médio, máximo e mínimo e a

percentagem de erro caso ocorra.

Figura 55 - Criação do Listener

Anexos _______________________________________________________________________________

110

Mysql

Relativamente ao MySQL é utilizado o mesmo thread group e listener que o MongoDB.

Apenas muda a forma de conexão à base de dados e a consulta efetuada.

Relativamente ao config element foi selecionado o jdbc connection, e para configurar a

conexão à base de dados MySQL é necessário o preenchimento dos campos de uma forma

especifica. Nomeadamente no database url em que se define o servidor da base de dados e

a base de dados a utilizar. De seguida o JDBC driver class que é o valor que o jmeter

disponibiliza nos tutoriais para conetar ao MySQL. Por fim basta definir o utilizador e

password.

Figura 56 - Criação do Config Element para o MySQL

Por fim o último ponto distinto do MongoDB é a sampler que foi escolhido o tipo JDBC

request. Nesta é definida a consulta a testar.

111

Anexos _____________________________________________________________________________

Figura 57 - Criação da Sampler para o MySQL

Tendo tudo definido basta correr e esperar os resultados no listener.


Recommended