apresentação cassandra
TRANSCRIPT
![Page 1: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/1.jpg)
Compreendendo o Modelo de dados
Apache Cassandra
![Page 2: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/2.jpg)
Alunos:
ARCANJO GABRIEL 096096
PEDRO BRAGANICK 096123
RICHIELY BATISTA 100930
Sistemas Distribuídos
![Page 3: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/3.jpg)
Roteiro:
- O modelo de dados
- Keyspaces
- Column families
- Indexes
- Técnicas conceituais
- Alguns comandos CQL
- Collections – set list map
- Estudo de caso - Twissandra
![Page 4: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/4.jpg)
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.
![Page 5: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/5.jpg)
![Page 6: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/6.jpg)
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?"
![Page 7: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/7.jpg)
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);
![Page 8: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/8.jpg)
Esquema de RDBM x Keyspace Repositório dos dados
![Page 9: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/9.jpg)
Column Family
Em JavaScript Object Notacion (JSON):
Musican: ColumnFamily 1
carlos: Rowkey
email: [email protected], ColumnName:Value
instrument: bass ColumnName:Value
george: Rowkey
email: [email protected] ColumnName:Value
Band: ColumnFamily 2
george: Rowkey
fone: 1234 - 4567 ColumnName:Value
![Page 10: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/10.jpg)
Column Family
Análogo as tabelas no modelo relacional?
![Page 11: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/11.jpg)
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."
![Page 12: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/12.jpg)
![Page 13: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/13.jpg)
Row
Podem possuir diferentes colunas;
Não precisam ser congruentes: podem
possuir quantidades diferentes de instâncias.
![Page 14: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/14.jpg)
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
![Page 15: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/15.jpg)
Í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: "[email protected]"
}
}
![Page 16: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/16.jpg)
Í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
![Page 17: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/17.jpg)
![Page 18: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/18.jpg)
Você realmente precisa do SQL?
![Page 19: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/19.jpg)
• 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' ???
![Page 20: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/20.jpg)
• 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.
![Page 21: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/21.jpg)
• Join
Como fazer a consulta:
select * from Emps e, d Deps onde e.dep_id = d.dep_id ???
![Page 22: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/22.jpg)
• 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.
![Page 23: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/23.jpg)
• Group by
select count(*) from Emps group by cidade ????
![Page 24: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/24.jpg)
• 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.
![Page 25: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/25.jpg)
• 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.
![Page 26: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/26.jpg)
Mais sobre o que há de novo no Cassandra-
1.2?
*Collections*
![Page 27: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/27.jpg)
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>
);
![Page 28: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/28.jpg)
Colletions - Set
Insertion
INSERT INTO users (user_id, first_name, last_name,
emails) VALUES('user', 'User', 'User', {'[email protected]',
'[email protected]'});
Update
UPDATE users
SET emails = emails + {'[email protected]'} WHERE user_id
= 'user';
![Page 29: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/29.jpg)
Colletions - Set
Remove
UPDATE users
SET emails = emails - {'[email protected]'} WHERE user_id =
'user';
Retrieval
SELECT user_id, emails FROM users WHERE user_id =
'user';
![Page 30: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/30.jpg)
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';
![Page 31: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/31.jpg)
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';
![Page 32: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/32.jpg)
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>;
![Page 33: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/33.jpg)
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';
![Page 34: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/34.jpg)
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';
![Page 35: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/35.jpg)
Comandos CQL - Cassandra
![Page 36: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/36.jpg)
![Page 37: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/37.jpg)
Técnicas conceituais
Denormalização
Agregação
Agregação atômica
Chaves enumeráveis
![Page 38: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/38.jpg)
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.
![Page 39: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/39.jpg)
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.
![Page 40: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/40.jpg)
![Page 41: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/41.jpg)
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).
![Page 42: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/42.jpg)
Agregação Atômica
![Page 43: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/43.jpg)
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.
![Page 44: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/44.jpg)
Uma modelagem, itte r (Twissandra)! https://github.com/twissandra/twissandra
Usuários
Tweets
Followings
Followers
UserLine
TimeLine
![Page 45: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/45.jpg)
![Page 46: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/46.jpg)
![Page 47: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/47.jpg)
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.
![Page 48: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/48.jpg)
Quem segue 'alice'?
![Page 49: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/49.jpg)
Quem é seguido por 'alice'?
![Page 50: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/50.jpg)
UserLine
![Page 51: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/51.jpg)
TimeLine
![Page 52: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/52.jpg)
Atualização nas
CF's de User/TimeLine.
Você como desenvolvedor tem que
fazer isso.
Um novo tweet de 'bob'
![Page 53: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/53.jpg)
Disposição e Consulta de tweets
![Page 54: Apresentação cassandra](https://reader033.vdocuments.us/reader033/viewer/2022052601/558b2139d8b42a432e8b4593/html5/thumbnails/54.jpg)
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