haddop, mapreduce e spark - folivetti.github.io · hds externos conectados por rede....
TRANSCRIPT
Haddop, MapReduce e Spark
Fabrıcio Olivetti de Franca
Universidade Federal do ABC
Topicos
1. Conceitos Basicos
2. MapReduce
3. Spark
4. Transformacoes Basicas
5. Acoes Basicas
1
Conceitos Basicos
Hadoop
Como vimos na aula inicial, muitas bases de dados de interesse pratico
necessitam de mais espaco do que os maiores HDs podem suportar.
Uma solucao inicial e dividir os dados em varios HDs.
2
Hadoop
Exemplo: log de requisicoes http em um servidor de paginas de internet.
Dado um computador central que fara o gerenciamento das requisicoes e
HDs externos conectados por rede.
Operacionalizacao: um HD e escolhido para armazenar o log atual. Ao
atingir 98% da capacidade, outro HD e escolhido.
3
Hadoop
Quantos problemas voces conseguem enumerar?
• Se um HD falha, perdemos aqueles dados para sempre.
• Se um HD falha, perdemos as amostras de todo um perıodo, criando
um vies estatıstico.
• Se a comunicacao com o HD atual falhar, o que fazer?
• Se o computador central falhar?
4
Hadoop
Quantos problemas voces conseguem enumerar?
• Se um HD falha, perdemos aqueles dados para sempre.
• Se um HD falha, perdemos as amostras de todo um perıodo, criando
um vies estatıstico.
• Se a comunicacao com o HD atual falhar, o que fazer?
• Se o computador central falhar?
4
Hadoop
Quantos problemas voces conseguem enumerar?
• Se um HD falha, perdemos aqueles dados para sempre.
• Se um HD falha, perdemos as amostras de todo um perıodo, criando
um vies estatıstico.
• Se a comunicacao com o HD atual falhar, o que fazer?
• Se o computador central falhar?
4
Hadoop
Quantos problemas voces conseguem enumerar?
• Se um HD falha, perdemos aqueles dados para sempre.
• Se um HD falha, perdemos as amostras de todo um perıodo, criando
um vies estatıstico.
• Se a comunicacao com o HD atual falhar, o que fazer?
• Se o computador central falhar?
4
Hadoop
Quantos problemas voces conseguem enumerar?
• Se um HD falha, perdemos aqueles dados para sempre.
• Se um HD falha, perdemos as amostras de todo um perıodo, criando
um vies estatıstico.
• Se a comunicacao com o HD atual falhar, o que fazer?
• Se o computador central falhar?
4
Hadoop Distributed File System
Criado para tratar essas questoes de confiabilidade ao mesmo tempo que
minimiza custos.
• Suporta arquivos muito grandes e gerencia milhares de nos ao
mesmo tempo.
• Assume a possibilidade de lidar com hardware de baixo custo.
• Duplicacao de arquivos para lidar com falhas.
• Deteccao de falhas para previnir possibilidade de perdas.
• Computacao otimizada: o processamento e feito onde os dados
residem.
• Executa em maquinas e sistemas heterogeneos.
5
Arquitetura Geral
• Distribuıdo com um pouco de centralizacao.
• Nos principais: principais maquinas com poder alto de
processamento e armazenamento.
• Nos principais gerenciam o envio e recebimento de tarefas de
processamento para os outros nos (TaskTracker).
• Nos principais gerenciam os locais onde os dados devem residir,
dados mais utilizados estao mais proximos (DataNode).
• Nos centrais mantem um mapa dos arquivos e diretorios do sistema
distribuıdo (NameNode).
6
Arquitetura Geral
• Nos centrais envia as tarefas para os nos principais (JobTracker).
• Pensado em leituras frequentes de lotes de arquivos.
• Escrita de arquivo e custosa, geralmente Write-Once, Read-Many.
• Escrito em Java com suporte a Python.
7
NameNode
• Armazena os metadados tıpicos de um sistema de arquivo.
• Apenas um servidor armazenando o NameNode, ele deve ser o mais
importante, estavel e seguro.
• Cuida da criacao de replicas de blocos sempre que ocorre falha em
um DataNode.
8
DataNode
• Armazena os dados de arquivos.
• Suporta qualquer sistema de arquivo (FAT, NTFS, ext, etc.).
• Notifica o NameNode sobre os blocks que ele possui (ao substituir
um NameNode ele requisita tal informacao).
• Arquivos sao armazenados em blocos de 64MB por padrao.
• Envia um relatorio periodico ao NameNode.
• Envio de dados inteligente, tem preferencia pelo envio aos
DataNodes mais proximos.
9
Estrategias de Armazenamento
• O NameNode replica cada bloco de arquivo 2 vezes em um rack
local e uma vez em outro rack.
• Replicas adicionais podem ser distribuıdos aleatoriamente para
outros nos.
• Ao requisitar um certo bloco, esse e recuperado do no mais proximo
ao cliente.
• Em caso de falha (falta de relatorio periodico), o NameNode escolhe
outros DataNodes para replicar.
• Otimiza o balanceamento do armazenamento e comunicacao de rede.
10
Estrategias de Corretude
• Usa CRC32 para validar os dados.
• Calcula checksum para cada 512 bytes de dados, DataNode
armazena o crc.
• Cliente recebe os dados e seus respectivos checksums.
• Em caso de falha de verificacao, cliente reporta e recebe de outra
replica.
11
Comandos basicos
• hadoop dfs -mkdir /diretorio
• hadoop dfs -cat /diretorio/arquivo.txt
• hadoop dfs -rm /diretorio/arquivo.txt
Conta com interface Web: http://host:port/dfshealth.jsp
12
Exercıcio
Supondo um cluster com 4 racks e 100 nos por rack, supondo tambem a
probabilidade de falha de um no e de 1%.
Calcule a probabilidade de perda irreparavel de um bloco de dados nas
configuracoes padroes.
P(ni = falha ) = 0.01
P(n nos falharam ) =
(400
n
)· 0.01n · 0.99n
P(perda de dados | nnosfalharam) =
(n3
)(4003
)P(perda de dados) =
400∑n=3
(400
n
)· 0.01n · 0.99n ·
(n3
)(4003
)
13
Exercıcio
Supondo um cluster com 4 racks e 100 nos por rack, supondo tambem a
probabilidade de falha de um no e de 1%.
Calcule a probabilidade de perda irreparavel de um bloco de dados nas
configuracoes padroes.
P(ni = falha ) = 0.01
P(n nos falharam ) =
(400
n
)· 0.01n · 0.99n
P(perda de dados | nnosfalharam) =
(n3
)(4003
)P(perda de dados) =
400∑n=3
(400
n
)· 0.01n · 0.99n ·
(n3
)(4003
)13
MapReduce
Modelo MapReduce
Modelo de programacao distribuıda.
Dean, Jeffrey, and Sanjay Ghemawat. ”MapReduce: simplified data
processing on large clusters.”Communications of the ACM 51.1 (2008):
107-113.
Ideias: Unix pipeline e basico de Programacao Funcional:
cat input | grep | sort | uniq -c | cat > output
input > map > shuffle & sort > reduce > output
Trabalha com stream de dados.
14
Modelo MapReduce
Modelo de programacao distribuıda.
Dean, Jeffrey, and Sanjay Ghemawat. ”MapReduce: simplified data
processing on large clusters.”Communications of the ACM 51.1 (2008):
107-113.
Ideias: Unix pipeline e basico de Programacao Funcional:
cat input | grep | sort | uniq -c | cat > output
input > map > shuffle & sort > reduce > output
Trabalha com stream de dados.
14
MapReduce
Figura 1: Fonte: UT Dallas.
15
Modelo MapReduce
• Balanceamento de carga otimizado.
• Recuperacao rapida de falhas.
• Possibilidade de reprocessar em caso de falhas.
• Processamento duplicado em caso de lentidao.
• Otimizacoes locais.
16
Word Count
• Mapper
• Entrada: linhas de texto
• Saıda: chave = palavra, valor = 1
• Reducer
• Entrada: chave = palavra, valor = lista de contagens
• Saıda: chave = palavra, valor = soma
17
MapReduce
Figura 2: Fonte: UT Dallas.
18
MapReduce
mapper :: Token -> (Token, Integer)
reducer :: [(Token, [Integer])] -> [(Token, Integer)]
mapper token = (token, 1)
reducer xs = map (\ (k,vs) -> (k, sum vs)) xs
19
Combiners
Uma forma de minimizar a carga dos Reducers, gerando uma avaliacao
parcial em cada no.
E executado localmente, geralmente e igual ao proprio reducer.
20
Modelo MapReduce
• Funciona bem para programas pequenos e manipulacoes simples dos
dados.
• Aplicacoes de larga escala sao difıceis de serem implementadas.
• Problema de performance.
21
Exercıcio
No exemplo de contagem de palavras, o que deve ser feito entre o
mapper e o reducer feito em Haskell para que ele funcione?
DICA
Considere a saıda do mapper e a entrada do reducer:
mapper :: Token -> (Token, Integer)
reducer :: [(Token, [Integer])] -> [(Token, Integer)]
22
Exercıcio
No exemplo de contagem de palavras, o que deve ser feito entre o
mapper e o reducer feito em Haskell para que ele funcione?
DICA
Considere a saıda do mapper e a entrada do reducer:
mapper :: Token -> (Token, Integer)
reducer :: [(Token, [Integer])] -> [(Token, Integer)]
22
Spark
Spark: Alem do MapReduce
De tal forma a facilitar o desenvolvimento de aplicacoes e generalizacao
de tarefas comuns no MapReduce, foi criada a plataforma Spark.
• Mais eficiente: computacao distribuıda + multithreading.
• Linguagem estendida.
• Compartilhamento de Dados mais rapido.
• Arvore de processamento.
• Suporte a Scala, Java, Python, R.
23
Resilient Distributed Dataset: RDD
Abstracao principal do Spark:
• A base de dados e um objeto.
• Aplica operacoes nesses objetos, como metodos
• Pode estar armazenado em Hadoop, sistema de arquivo comum ou
ate na memoria (transparente).
• Transformacoes (paralelas) e Acoes (saıda de dados).
• Refaz operacoes em caso de falhas.
24
Operacoes em uma RDD
Transformacoes f :: RDD -> RDD:
• Avaliacao Preguicosa.
• Ex.: map, reduce, filter.
• RDDs podem ser de listas de valores ou lista de tuplas chave-valor
[(K, V)].
Acoes f :: RDD -> a:
• Gera computacao.
• Ex.: count, saveAsTextFile, collect.
25
Directed Acyclic Graph: DAG
No MapReduce do Hadoop, cada operacao Map-Reduce e independente
uma da outra, mesmo quando as tarefas estao interligadas.
Considere o problema de retornar a contagem de palavras ordenadas pela
frequencia:
mapper1 :: Linha -> [(Palavra, Integer)]
reducer1 :: [(Palavra, [Integer])] -> [(Palavra, Integer)]
mapper2 :: (Palavra, Integer) -> [(Integer, Palavra)]
reducer2 :: [(Integer, [Palavra])] -> [(Integer, [Palavra])]
Qual a definicao das funcoes mapper2 e reducer2?
26
Directed Acyclic Graph: DAG
Primeiro, o Hadoop ira completar TODA a tarefa MapReduce1. Somente
apos a conclusao e escrita do arquivo de saıda (escrita custa caro!), a
tarefa MapReduce2 iniciara, para entao gerar a resposta.
27
Directed Acyclic Graph: DAG
No Spark, e feito um grafo direcionado e acıclico (arvore) de
processamento que interliga as tarefas de MapReduce (ou outras
transformacoes) para gerar o menor numero de escritas possıveis.
28
Directed Acyclic Graph: DAG
Uma vez que a RDD e imutavel e as transformacoes devem ser puras, e
possıvel fazer a composicao dessas funcoes sem introduzir efeitos
inesperados.
29
Transformacoes Basicas
Criando uma RDD
Uma RDD pode ser criada a partir de uma colecao em memoria ou um
arquivo existente no sistema de arquivos (distribuıdos ou nao) 1.
listaComidas = [’bife’, ’alface’, ’arroz’]
comidasRDD = sc.parallelize(listaComidas, 2)
textoRDD = sc.textFile(nomeArquivo, 2)
O segundo parametro e a quantidade de particoes por no local. O ideal e
criar cerca de 2 particoes por core (Porque?)
1os comandos seguem a sintaxe Pyspark
30
MapReduce
Similar ao map e fold do Haskell:
# [Linha] -> [Int] -> [Int] -> Int
textoRDD.map(lambda linha: length(linha))
.reduce(lambda (l1, l2): l1 + l2)
Nota: reduce e uma acao, e portanto forca o processamento.
31
reduceByKey
Parecido com o procedimento que fizemos ate entao no Haskell: aplica
uma funcao no resultado de groupByKey . sortByKey:
# [Linha] -> [(Palavra, Int)] -> [(Palavra,[Int])]
# -> [(Palavra, Int)]
textoRDD.map(lambda linha: [(w,1) for w in linha.split()])
.reduceByKey(lambda f1,f2: f1+f2)
32
groupByKey
Retorna o resultado de groupByKey . sortByKey apos um map:
# [Linha] -> [(Palavra, Int)] -> [(Palavra,[Int])]
textoRDD.map(lambda linha: [(w,1) for w in linha.split()])
.groupByKey()
33
filter
Similar ao Haskell, remove da RDD todos os elementos que retorna falso
para a funcao passada como parametro:
# [Linha] -> [(Palavra, Int)] -> [(Palavra,[Int])]
textoRDD.map(lambda linha: [(w,1) for w in linha.split()])
.reduceByKey(lambda f1,f2: f1+f2)
.filter(lambda (w, f): f > 3)
34
join
Une a RDD de tuplas com outra RDD de tuplas dado que as chaves sao
do mesmo tipo:
# [(Palavra, Int)] -> [(Palavra, Int)]
# -> [(Palavra, (Int, Int))]
freqPalavraRDD.join(idfPalavraRDD)
35
cartesian
Une duas RDDs atraves de um produto cartesiano de seus elementos:
# [(Palavra, Int)] -> [(Palavra, Int)]
# -> [(Palavra, Int), (Palavra, Int)]
freqPalavraRDD.cartesian(freqPalavraRDD)
36
Pipelines de processamento
Conforme mencionado anteriormente, o retorno das transformacoes do
Spark sao intencoes de computacao, a sequencia de transformacoes
formam um pipeline de processamento a ser computado quando
necessario.
pipeline1 = RDD.transforma1()
.transforma2()
.transforma3()
pipeline2 = pipeline1.transforma1()
.transforma2()
pipeline3 = pipeline1.transforma1(pipeline2)
.transforma2()
Dessa forma, o Spark consegue otimizar o processamento e evitar
redundancias.
37
Acoes Basicas
Acoes Basicas
• .collect(): retorna a RDD em memoria.
• .first(): retorna o primeiro elemento da RDD.
• .take(n): retorna os n primeiros elementos da RDD.
38
Atividade 02
Complete o Laboratorio Pre-processamento no Spark
39