Apresentação cassandra
-
Upload
richiely-batista -
Category
Documents
-
view
2.002 -
download
0
Transcript of Apresentação cassandra
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: [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
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: "[email protected]"
}
}
Í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', {'[email protected]',
'[email protected]'});
Update
UPDATE users
SET emails = emails + {'[email protected]'} WHERE user_id
= 'user';
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';
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