Big Data
André Claudino
https://www.linkedin.com/in/andreclaudino/
https://github.com/andreclaudino
http://t.me/aclaudino
PhD. Física Computacional
(Física Matemática com IA simbólica)
time: IA Front
Interajam!
Bases de dados
Bases regulares
- Pensados para leitura e escrita
- Muitas leituras concorrentes de poucos dados
- Podem ter um ou mais nós
BAses de Big Data
- Mais leitura que escrita
- Leituras e operações de muitos dados
- Precisa de muitos nós
- Arquitetura mestre-trabalhador
Arquitetura
Worker
Réplica
Worker
Réplica
Worker
Réplica
Worker
Réplica
(...)
bases regulares
Worker
Dados
Worker
Dados
Worker
Dados
Worker
Dados
RW
R
R
R
replica set
- Um nó de escrita vários de leitura
- Nós têm suas cópias de dados
- O Acesso é feito no réplica set, não num único nó
Arquitetura
Worker
trabalhador
Worker
Worker
Worker
(...)
Big Data
Worker
Dados distribuídos
- Todo o acesso é feito pelo nó mestre
- Dados estão num sistema distribuído
- Nó mestre delega pros trabalhador
- Trabalhadores só falam com o mestre
Worker
mestre
trabalhador
trabalhador
trabalhador
Consistência
Disponibilidade
(Availability)
Tolerância
-
Consistência:
Acesso sempre ao dado mais recente
-
Disponibilidade:
A base deve estar disponível durante operações
-
Tolerância:
Deve continuar funcionando mesmo que parte dos nós caia.
CT
TD
CD
Teorema CAP
- É possível ter dois ao mesmo tempo, mas não três
Map-Reduce
Processamento
Mapeadores
- Transformam elementos de uma lista de forma independente
- Facilmente escaláveis
- Usados para transformações de linha
- Mantém a dimensão
- Podem ser compostos
(f \circ g)(a) = f(g(a))
def mapper(person: Person): String = {
return person.name
}
Redutores
- Agregam listas num só elemento
- Reduzem a dimensão em 1
- Não podem ser compostos:
(f \circ g)(a) \not = f(g(a))
def menorIdade(idade1: Int, idade2: Int): Int = {
return min(idade1, idade2)
}
val idadesFuncionarios =
Seq(18, 23, 50, 20, 28,
18, 51, 50, 15)
val menorIdade =
idadesFuncionarios
.reduce(menorIdade)
print(menorIdade)
// 18
Map-Reduce
Compõe etapas de mapeadores com etapas de redutores.
Nome | Nascimento | Setor |
---|---|---|
Estela | 20/03/2000 | Dev |
Mário | 30/09/1987 | Infra |
Breno | 11/01/1986 | Dev |
Flávia | 10/10/2001 | DB |
Joaquim | 28/02/1997 | Infra |
// Maior e menor idades dos funcionários
def calculaIdade(pessoa: Pessoa): Int = {...}
val funcionarios: Seq[Pessoa] = Seq(...)
val idades = funcionarios
.map(calculaIdade)
val menorIdade = idades.reduce(min)
val maiorIDade = idades.reduce(max)
Map-Reduce
Compõe etapas de mapeadores com etapas de redutores.
Nome | Nascimento | Setor |
---|---|---|
Estela | 20/03/2000 | Dev |
Mário | 30/09/1987 | Infra |
Breno | 11/01/1986 | Dev |
Flávia | 10/10/2001 | DB |
Joaquim | 28/02/1997 | Infra |
// Conta funcionários no setor específico
def contaFuncionarios(funcionarios:Seq[Pessoas],
setor: String): Int = {
return
funcionarios
.map(functionario => {
if(funcionario.setor == setor)
return 1
else
return 0
})
.reduce(sum)
}
Map-Reduce
Versões ocultas
// Operações map
val texto = "Um simples texto, totalmente normal"
val textoCaixaAlta = toUpperCase(texto)
// UM SIMPLES TEXTO, TOTALMENTE NORMAL
val comAcentos = "têxto com palávras chêias de acêntos"
val semAcentos = StringUtils.stripAccents(String input)
// texto com palavras cheias de acentos
val listaDeCoisas: Seq[Coisas] = Seq({...})
listaDeCoisas.count()
val listaDeNumeros: Seq[Int] = Seq({...})
listaDeNumeros.max()
listaDeNumeros.min()
listaDeStrings = Seq("Luke", "eu", "sou", "seu", "pai")
listaDeStrings.mkString(",")
// Luke,eu,sou,seu,pai
- Nó mestre delega ações aos trabalhadores
- Trabalhadores operam mapeadores em partes dos dados delegada pelo mestre
- Nós escolhidos, operam redulção e salvam
Map-Reduce
Arquitetura
- Mapeadores podem ser executados de forma independente, nos trabalhadores, compostos ou não, lendo partes dos dados.
- Em casos de falhas no nó, apenas o mapeador falho reinicia
- Escalar implica em adicionar mais nós
Map-Reduce
Trabalhadores
- Cada nó é responsável por parte dos dados
- Os dados devem ser acessíveis por todos os nós
- Preferencialmente, entrada deve estar organizada em vários arquivos e partições
- Preferencialmente, se for de um banco, deve estar organizada em colunas
- Saída será feita por cada processo, então existem vários arquivos
Map-Reduce
Dados
Map-Reduce
Dados
├── domain=brasil.elpais.com
│ ├── data=2019-07-06
│ │ └── hora=22
│ │ └── 7127bcb8c3f6570bb98c23f94dc0d0f2.json
│ ├── data=2019-07-08
│ │ ├── hora=10
│ │ │ └── c9b3e4b269bdb1d3778283a2a0280eca.json
│ │ ├── hora=18
│ │ │ └── 1b17b38eba151a4dfc0519800ce30d87.json
│ │ └── hora=21
│ │ └── 46e0b542c2911c3a79aaf8076a8e1bb0.json
│ ├── data=2019-07-15
│ │ ├── hora=11
│ │ │ └── 28f3ab3d518727b6484d8f2cb86206a2.json
│ │ ├── hora=12
│ │ │ └── a4a684a04bcfcfc51ccb9fa6fe2d4eb5.json
│ │ ├── hora=14
│ │ │ └── 4dfb6dcf40d39e89fe59ac037ab10774.json
│ │ ├── hora=17
│ │ │ └── e3a3e62c9ed402657447405e680fb8ef.json
│ │ ├── hora=21
│ │ │ └── ed49ac957183b66b85d6e283ee124579.json
- Muitos arquivos
- Organizados em partições
- Informação vem não só do arquivo, mas da estrutura onde estão
Big Data
By André Claudino
Big Data
- 94