Compreendendo o Modelo de dados
       Apache Cassandra
Sistemas Distribuídos


Alunos:
     ARCANJO GABRIEL          096096
     PEDRO BRAGANICK          096123
     RICHIELY BATISTA         100930
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
Um novo tweet de 'bob'




        Atualização nas
     CF's de User/TimeLine.
Você como desenvolvedor tem que
           fazer isso.
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

Apresentação cassandra

  • 1.
    Compreendendo o Modelode dados Apache Cassandra
  • 2.
    Sistemas Distribuídos Alunos: ARCANJO GABRIEL 096096 PEDRO BRAGANICK 096123 RICHIELY BATISTA 100930
  • 3.
    Roteiro: -O modelo de dados - Keyspaces - Column families - Indexes - Técnicas conceituais - Alguns comandos CQL - Collections – set list map - Estudo de caso - Twissandra
  • 4.
    O modelo dedados 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.
  • 6.
    Devemos exaltar oNoSQL 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?"
  • 7.
    Modelo Relacional vsNoSQL -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);
  • 8.
    Esquema de RDBMx Keyspace Repositório dos dados
  • 9.
    Column Family Em JavaScriptObject 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
  • 10.
    Column Family Análogo astabelas no modelo relacional?
  • 11.
    Super Column (1.2nã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."
  • 13.
    Row Podempossuir diferentes colunas; Não precisam ser congruentes: podem possuir quantidades diferentes de instâncias.
  • 14.
    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
  • 15.
    Í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" } }
  • 16.
    Índice Secundário Índices secundáriosem 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
  • 18.
  • 19.
    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' ???
  • 20.
    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.
  • 21.
    Join Como fazer a consulta: select * from Emps e, d Deps onde e.dep_id = d.dep_id ???
  • 22.
    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.
  • 23.
    Group by select count(*) from Emps group by cidade ????
  • 24.
    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.
  • 25.
    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.
  • 26.
    Mais sobre oque há de novo no Cassandra- 1.2? *Collections*
  • 27.
    Colletions - Set UmSet 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> );
  • 28.
    Colletions - Set Insertion INSERTINTO 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';
  • 29.
    Colletions - Set Remove UPDATEusers SET emails = emails - {'uu1@uu1.org'} WHERE user_id = 'user'; Retrieval SELECT user_id, emails FROM users WHERE user_id = 'user';
  • 30.
    Colletions - List Quandoa 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';
  • 31.
    Colletions - List Addition UPDATEusers SET top_cidades = [ 'sao paulo' ] + top_cidades WHERE user_id = 'user'; Delete UPDATE users SET top_cidades = top_cidades - ['recife'] WHERE user_id = 'user';
  • 32.
    Colletions - Map Comoo 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>;
  • 33.
    Colletions - Map Modificationand 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';
  • 34.
    Colletions - Map UsandoTTL 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';
  • 35.
    Comandos CQL -Cassandra
  • 37.
  • 38.
    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.
  • 39.
    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.
  • 41.
    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).
  • 42.
  • 43.
    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.
  • 44.
    Uma modelagem, itte r (Twissandra)! https://github.com/twissandra/twissandra Usuários Tweets Followings Followers UserLine TimeLine
  • 47.
    Pesquisando Dados noTwissandra: 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.
  • 48.
  • 49.
    Quem é seguidopor 'alice'?
  • 50.
  • 51.
  • 52.
    Um novo tweetde 'bob' Atualização nas CF's de User/TimeLine. Você como desenvolvedor tem que fazer isso.
  • 53.
  • 54.
    Conclusão Modelar bem oesquema para se obter consultas otimizadas; Não se perder durante o projeto; Atender as necessidades: Escalabilidade Disponibilidade Alto desempenho