apresentação cassandra

Post on 25-Jun-2015

2.002 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Compreendendo o Modelo de dados

Apache Cassandra

Alunos:

ARCANJO GABRIEL 096096

PEDRO BRAGANICK 096123

RICHIELY BATISTA 100930

Sistemas Distribuídos

Roteiro:

- O modelo de dados

- Keyspaces

- Column families

- Indexes

- Técnicas conceituais

- Alguns comandos CQL

- Collections – set list map

- Estudo de caso - Twissandra

O modelo de dados

NoSQL - Not only SQL

CQL - Cassandra Query Language - Usado

para distribuir dados em larga escala.

Escalabilidade;

Performance;

Consistência.

A definição do modelo visa as consultas que se

quer otimizar.

Devemos exaltar o NoSQL e minimizar o Modelo de dados Relacional?

R.: De forma alguma !

"Cassandra thinks about data the way we think about data. Most of us

think about data in rows and columns. So does Cassandra."

Quais respostas vou obter? - SQL

Quais perguntas poderei fazer? - NoSQL

Consultas de forma sequencial no tempo em determinados intervalos.

"Quantas pessoas estrangeiras passaram pelos aeroportos

brasileiros no período da Copa do Mundo?"

Modelo Relacional vs NoSQL

-Escalonamento

-Consistência

-Disponibilidade

• Acesso rápido a dados (desde que você possa manter tudo na memória);

• Rápida replicação de dados / distribuídos por vários nós;

• Esquema flexível (você pode adicionar novas colunas instantaneamente);

Esquema de RDBM x Keyspace Repositório dos dados

Column Family

Em JavaScript Object Notacion (JSON):

Musican: ColumnFamily 1

carlos: Rowkey

email: carlos@inf.com, ColumnName:Value

instrument: bass ColumnName:Value

george: Rowkey

email: george@inf.com ColumnName:Value

Band: ColumnFamily 2

george: Rowkey

fone: 1234 - 4567 ColumnName:Value

Column Family

Análogo as tabelas no modelo relacional?

Super Column (1.2 não suporta - usa

composite column)

Quando uma linha de uma família de colunas contém uma

coleção de pares nome/valor, a família de super coluna

detém subcolunas, onde subcolunas são denominados

grupos de colunas.

"Um mapa cujas chaves são

os nomes das colunas e

os valores são as colunas."

Row

Podem possuir diferentes colunas;

Não precisam ser congruentes: podem

possuir quantidades diferentes de instâncias.

Indexação

Um índice é uma estrutura de dados que permite a

consulta rápida e eficiente de dados correspondentes a

uma determinada condição.

-Índices Primários

-Índices Alternativos

Índice Primário

Em Cassandra, o índice primário, para uma família de

coluna, é o índice de suas chaves de linhas. (Row Key)

Users = {

"edanuff" : {

Rowkey

email: "ed@anuff.com"

}

}

Índice Secundário

Índices secundários em Cassandra referem-se a índices

em valores de coluna (para distingui-los a partir do índice

principal linha de chave para uma família de coluna).

Índice Secundário é um índice alternativo pois não utiliza

de chave de linha (Rowkey).

Não é recomendado para valores de alta cardinalidade (ou seja, timestamps,

datas de nascimento, keyworlds, etc)

Requer pelo menos uma comparação de igualdade em uma consulta - não

eficiente para: menor que / maior que / intervalo de consultas

Você realmente precisa do SQL?

• Select

Suponha que exista Column Family departamentos

e funcionários com relações um-para-muitos,

respectivamente. São elas Emps e Deps . Em Emps há ID

dos empregados utilizados como chaves e há Nome, Data

de nascimento e cidade. Em deps chaves são ID do

departamento e única coluna é Nome.

select * from EMPS onde Data de nascimento = '12/10/1990' ???

• Select

Solução:

Adicionar uma Column Family DataNasc_emps em

que a chave é uma data e o nome das colunas são IDs

dos empregados que nasceram na data, essas colunas

não precisam ser preenchidas podendo ser vazias

representadas por um '-'. Para responder a consulta

precisamos apenas recuperar todas as colunas para a

chave '12/10/1990', lembrando que sempre que um

empregado for acrescentado ou excluído DataNasc_emps precisa ser atualizada.

• Join

Como fazer a consulta:

select * from Emps e, d Deps onde e.dep_id = d.dep_id ???

• Join

Solução:

Basta criarmos uma Column Family Dept_emps

onde as chaves serão os IDs de departamento e as

colunas serão os IDs dos empregados. Assim a consulta

poderia ser facilmente realizada retornando as colunas de

cada chave.

• Group by

select count(*) from Emps group by cidade ????

• Group by

Solução:

Basicamente será feito a mesma coisa do Select,

criando uma nova Column Family Cidade_emps tendo

como chave uma cidade e IDs dos empregados como

colunas. Neste caso você vai contar o número de

empregados recuperados. Ou pode ter uma coluna count

com o número de empregados pré-calculados.

• Order by

Os registros podem ser ordenados pela chave

usando o

OrderPreservingPartitioner. Para manter os dados

ordenados você pode usar o automaticamente ordenação

por nomes de coluna.

Mais sobre o que há de novo no Cassandra-

1.2?

*Collections*

Colletions - Set

Um Set armazena um grupo de elementos que são

retornados na ordem de classificação, quando consultada.

A coluna de tipo consiste conjunto de desordenado de

valores únicos.

CREATE TABLE users (

user_id text PRIMARY KEY,

first_name text,

last_name text,

emails set<text>

);

Colletions - Set

Insertion

INSERT INTO users (user_id, first_name, last_name,

emails) VALUES('user', 'User', 'User', {'u@user.com',

'user@gmail.com'});

Update

UPDATE users

SET emails = emails + {'uu1@uu1.org'} WHERE user_id

= 'user';

Colletions - Set

Remove

UPDATE users

SET emails = emails - {'uu1@uu1.org'} WHERE user_id =

'user';

Retrieval

SELECT user_id, emails FROM users WHERE user_id =

'user';

Colletions - List

Quando a ordem dos elementos é considerada, o que

pode não ser a ordem natural ditada pelo tipo de

elementos, usar uma lista. Além disso, use uma lista

quando você precisa armazenar mesmo valor várias

vezes. Os valores da lista são retornados de acordo com o

índice, já no Set é retornado em ordem alfabética.

Insertion

ALTER TABLE users ADD top_cidades list<text>;

UPDATE users SET top_cidades = [ 'goiania', 'recife' ]

WHERE user_id = 'user';

Colletions - List

Addition

UPDATE users

SET top_cidades = [ 'sao paulo' ] + top_cidades WHERE

user_id = 'user';

Delete

UPDATE users

SET top_cidades = top_cidades - ['recife'] WHERE

user_id = 'user';

Colletions - Map

Como o seu nome indica, um mapa mapeia uma coisa a

outra. Um mapa é um par de chaves únicas chave e

valores. Um caso de uso para o tipo mapa é armazenar

informações timestamp relacionado em perfis de usuários.

Insertion

ALTER TABLE users ADD todo map<timestamp,

reminder_text>;

Colletions - Map

Modification and replacement

UPDATE users

SET todo =

{ '2012-9-24' : 'entrou em goiania',

'2012-10-2 12:00' : 'saiu de goiania' }

WHERE user_id = 'user';

UPDATE users SET todo['2012-10-2 12:00'] = 'ficou em

goiania' WHERE user_id = 'user';

Colletions - Map

Usando TTL

UPDATE users USING TTL <computed_ttl>

SET todo['2012-10-1'] = 'precisa sair' WHERE user_id =

'user';

Delete

DELETE todo['2012-9-24'] FROM users WHERE user_id =

'user';

Comandos CQL - Cassandra

Técnicas conceituais

Denormalização

Agregação

Agregação atômica

Chaves enumeráveis

Denormalização

Cópia do mesmo dado em múltiplas tabelas.

Otimizar/simplificar as consultas.

Conseguir os resultados em um só lugar.

Dados estão altamente sendo modificados,

logo caso você queria fazer uma retenção nos

dados que são modificáveis pode perder a

integridade do banco.

Agragação-Composição

Representação do tipo todo-parte.

Se usado junto com a denormalização pode

ter um grande impacto em performance e

consistência.

Agragação Atômica

Permite armazenar uma entidade inteira em

um documento, e atualizar de forma atômica.

Minimizar o comportamento transacional:

*Grande processamento de dados a todo

momento (insert, update, delete).

Agregação Atômica

Chaves enumeráveis

Apesar de ser dispendiosa uma ordenação,

seu uso é de grande benefício.

Ex.: E-mail

• Ordem das mensagens, através de qualquer

ID conhecido.

Varredura de e-mails - backward ou forward.

Uma modelagem, itte r (Twissandra)! https://github.com/twissandra/twissandra

Usuários

Tweets

Followings

Followers

UserLine

TimeLine

Pesquisando Dados no Twissandra:

Quem esta seguindo um usuário?

›  A quem segue um usuário?

›  Mostrar os meus tweets.

›  UserLine.

Mostrar os tweets de todos que eu estou

seguindo.

›  TimeLine.

Quem segue 'alice'?

Quem é seguido por 'alice'?

UserLine

TimeLine

Atualização nas

CF's de User/TimeLine.

Você como desenvolvedor tem que

fazer isso.

Um novo tweet de 'bob'

Disposição e Consulta de tweets

Conclusão

Modelar bem o esquema para se obter

consultas otimizadas;

Não se perder durante o projeto;

Atender as necessidades:

Escalabilidade

Disponibilidade

Alto desempenho

top related