TRANSCRIÇÃO · CC BY 3.0

MIT 6.824 Aula 1: Sistemas Distribuídos & MapReduce

Tradução automática para o português do Brasil. Gerada e salva em 2026-10-23. Pode conter erros; confira os termos e as citações na versão em inglês e no vídeo original. Os horários são os mesmos da fonte. A transcrição original em inglês está disponível abaixo.

MIT 6.824 Aula 1: por que sistemas distribuídos são construídos, como os laboratórios funcionam, tolerância a falhas e consistência, e uma passagem pelo MapReduce do Google.

MIT 6.824: Sistemas Distribuídos · Publicado em · 1 h 20 min · Inglês · Licença: CC BY 3.0 · Fonte: assistir no YouTube

Fonte da transcrição: reconhecimento automático de fala no Vidleaf (pode conter erros). Pontuação por IA adicionada pelo Vidleaf; redação original e âncoras de timestamp mantidas. A transcrição original está disponível abaixo.

Resumo gerado por IA

A aula introdutória de sistemas distribuídos do MIT explica por que as aplicações usam computadores cooperantes e por que isso cria problemas de projeto difíceis. Desempenho, tolerância a falhas e distribuição física motivam o campo, enquanto concorrência e falhas parciais complicam a implementação. A aula descreve o curso e os laboratórios, depois desenvolve ideias sobre armazenamento, replicação, escalabilidade e consistência. O MapReduce do Google serve como estudo de caso, conectando funções simples de map e reduce com a infraestrutura necessária para distribuir o trabalho e mover dados. As seções com carimbos de data/hora permitem acompanhar a transição de compensações gerais de projeto para os exemplos concretos de contagem de palavras e rede.

Pontos-chave

  • [0:17] Sistemas distribuídos coordenam computadores em rede para realizar uma tarefa coerente.
  • [42:39] Escolhas de consistência afetam o que um leitor pode observar e o custo de coordenação entre réplicas.
  • [46:53] MapReduce conecta as ideias de projeto da aula com uma estrutura para grandes computações distribuídas.

Gerado a partir da transcrição. Verifique as passagens vinculadas em relação ao vídeo original. Resumo e pontos-chave revisados pelo Vidleaf em 2026-10-21.

Visão geral completa

Esta aula abre um curso de sistemas distribuídos definindo um sistema distribuído como computadores cooperantes que se comunicam por uma rede para completar uma tarefa coerente, e motivando o campo por meio de desempenho via paralelismo, tolerância a falhas, distribuição física e segurança. Argumenta que problemas solucionáveis em um único computador devem ser resolvidos dessa forma, e que sistemas distribuídos são difíceis por causa da execução concorrente e de falhas parciais. O instrutor apresenta a logística do curso: um site do curso com laboratórios, cronograma e um Piazza; aulas de Robert Morris com quatro TAs; um artigo para quase toda aula; duas provas; quatro laboratórios de programação que progridem do MapReduce para replicação baseada em Raft, um servidor de valores-chave replicado e tolerante a falhas, e sharding; e um projeto final opcional que pode substituir um dos laboratórios. Os laboratórios são avaliados pelo número de testes fornecidos que passam, sem testes ocultos, e os alunos são aconselhados a começar cedo e usar os horários de atendimento dos TAs e o Piazza. O curso cobre infraestrutura para aplicações — armazenamento, comunicação e computação — com armazenamento como foco principal, e um objetivo recorrente de abstrações que escondem a natureza distribuída desses sistemas. A aula então cobre ideias de implementação como chamada de procedimento remoto, threads e locks, e desafios de projeto incluindo escalabilidade (onde o banco de dados se torna o gargalo após aproximadamente 10, 20 ou 100 servidores web), tolerância a falhas em escala, armazenamento não volátil, replicação e consistência, observando que consistência forte é cara e que réplicas devem ter probabilidade de falha independente e não correlacionada. Explica que as réplicas são colocadas distantes umas das outras, mas a viagem da luz significa que a comunicação transcontinental pode levar milissegundos ou dezenas de milissegundos, então as pessoas frequentemente constroem sistemas mais fracos que apenas atualizam ou consultam a cópia mais próxima. MapReduce é apresentado como estudo de caso: construído pelo Google com um artigo 2004 para computações enormes em terabytes de dados, permitindo que não especialistas escrevam apenas funções map e reduce, com uma arquitetura mestre e trabalhador, entrada e saída em arquivos no GFS, e um exemplo de contagem de palavras. Como os servidores GFS e os trabalhadores MapReduce rodavam nas mesmas máquinas, os maps podiam ler a entrada do disco local por padrão, mas o shuffle movia cada pedaço de dados pela rede, o que era a parte cara. O palestrante observa que as redes de data centers modernas têm muito mais throughput, que o Google supostamente parou de usar o MapReduce alguns anos atrás, e que o MapReduce posterior não tentava mais executar maps onde os dados estavam armazenados; o segmento termina anunciando um laboratório envolvendo um MapReduce um tanto simplificado.

Resumos de capítulos com carimbos de tempo

Sistemas Distribuídos: Definição e Motivações

  • [0:17] Um sistema distribuído é um conjunto de computadores cooperantes que se comunicam por uma rede para realizar alguma tarefa coerente.
  • [0:32] Estudos de caso do curso incluem armazenamento para grandes sites, computações de big data como MapReduce e compartilhamento de arquivos ponto a ponto.
  • [1:10] Se um problema pode possivelmente ser resolvido em um único computador, você deve fazê-lo dessa forma, já que sistemas distribuídos não são mais simples.
  • [1:40] Uma razão para construir sistemas distribuídos é obter alto desempenho por meio de paralelismo em muitas CPUs, memórias e braços de disco.
  • [1:54] Outra razão é a tolerância a falhas, por exemplo, ter dois computadores fazendo exatamente a mesma coisa para que um possa assumir se o outro falhar.
  • [2:11] Alguns problemas são naturalmente espalhados no espaço, como transferências interbancárias entre computadores na cidade de Nova York e Londres.
  • [2:38] Uma razão final é a segurança: dividir a computação entre computadores para que código não confiável ou com bugs fique isolado e só se comunique por um protocolo de rede estreitamente definido.
  • [3:20] A maior parte do curso se concentra em desempenho e tolerância a falhas, embora segurança e distribuição física frequentemente entrem pelas restrições do estudo de caso.
  • [3:32] Sistemas distribuídos são difíceis em parte porque a execução concorrente em vários computadores traz interações complexas e problemas estranhos dependentes de tempo.
  • [4:12] Eles também são difíceis porque múltiplas peças mais uma rede permitem falhas parciais, onde algumas peças param de funcionar enquanto outras continuam, ou a rede está quebrada ou não confiável.
  • [4:49] É complicado obter um speedup de mil vezes com mil computadores, e um projeto cuidadoso é frequentemente necessário para obter o desempenho que você sente que merece.

Por que fazer o curso de Sistemas Distribuídos

  • [5:31] Vale a pena fazer o curso porque os problemas e soluções são tecnicamente interessantes e difíceis.
  • [5:41] Alguns problemas têm soluções muito boas conhecidas de outros problemas, mas essas soluções não são tão boas aqui.
  • [5:46] Sistemas distribuídos são usados por muitos sistemas do mundo real, frequentemente grandes sites com vastos números de computadores.
  • [6:02] Quando o curso começou, sistemas distribuídos eram algo de uma curiosidade acadêmica, usados às vezes em pequena escala.
  • [6:13] Impulsionados particularmente pela ascensão de sites gigantes, os sistemas distribuídos se tornaram uma parte seriamente importante da infraestrutura de computação nos últimos 20 anos.
  • [6:36] Muita atenção tem sido dada a eles, mas ainda restam bastantes problemas não resolvidos para estudantes de pós-graduação ou interessados em pesquisa.
  • [6:49] O curso é adequado para pessoas que gostam de construir coisas, por meio de uma sequência de laboratórios que constrói sistemas distribuídos bastante realistas focados em desempenho e tolerância a falhas.

Estrutura do Curso e Logística

  • [7:17] O site do curso é encontrável via Google e hospeda tarefas de laboratório, cronograma do curso e um Piazza para perguntas e respostas.
  • [7:33] Robert Morris dá as aulas, e quatro TAs mantêm horários de atendimento e são especialistas em resolver os laboratórios.
  • [7:59] Os componentes do curso incluem aulas, um artigo para quase toda aula, duas provas, laboratórios de programação e um projeto final opcional que pode substituir um dos laboratórios.
  • [8:35] As aulas cobrem grandes ideias em sistemas distribuídos, com algumas aulas sobre programação de laboratório, e muitas são estudos de caso de artigos descrevendo soluções reais para problemas reais.
  • [9:05] As aulas são gravadas em vídeo e o instrutor espera publicá-las online para revisão ou para aqueles que não estão presentes.
  • [9:18] Há um artigo para ler por semana, principalmente artigos de pesquisa, alguns clássicos como MapReduce e alguns mais recentes.
  • [9:43] As aulas extraem problemas e ideias básicas dos artigos, às vezes cobrem detalhes de implementação, e dedicam tempo a avaliações de tolerância a falhas e desempenho.
  • [10:15] Os alunos devem ler os artigos antes da aula, já que as aulas não podem explicar todo o conteúdo dos artigos e refletir sobre eles; a classe visa ensinar leitura rápida e eficiente de artigos.
  • [10:50] Para cada artigo, os alunos devem enviar uma resposta e uma pergunta no site até a meia-noite da noite anterior, o que também dá ao instrutor material para preparar as aulas.
  • [11:21] Há uma prova intermediária em sala de aula por volta da última aula antes do recesso de primavera e uma prova final durante a semana de provas finais, com foco principalmente em artigos e laboratórios.
  • [11:48] Provas antigas e soluções de 20 anos estão disponíveis como preparação para a prova, e as perguntas inevitavelmente se assemelham às de anos anteriores.
  • [12:12] Há quatro laboratórios de programação; o primeiro, um laboratório simples de MapReduce, vence na sexta-feira da próxima semana.

Sequência de laboratórios, projetos e avaliação

  • [12:38] O laboratório 2 usa a técnica Raft para, em teoria, tornar qualquer sistema tolerante a falhas replicando-o, com o Raft gerenciando a replicação e a comutação automática quando um servidor replicado falha.
  • [13:07] O laboratório 3 usa a implementação Raft para construir um servidor de valores-chave replicado e tolerante a falhas.
  • [13:22] O laboratório 4 clona o servidor de valores-chave replicado em vários grupos independentes e divide os dados entre eles para speedup paralelo, movendo pedaços de dados entre servidores à medida que entram e saem.
  • [14:02] Sharding significa dividir ou particionar dados entre vários servidores para obter speedup paralelo.
  • [14:13] Em vez do laboratório 4, os alunos podem fazer seu próprio projeto sobre uma ideia de sistema distribuído, construindo algo e medindo se funcionou.
  • [14:36] Os projetos devem ser feitos em equipes de duas ou três pessoas, e a ideia do projeto deve ser enviada aos instrutores para aprovação e possível orientação.
  • [15:03] Os alunos de projeto devem fazer trabalho de design, construir um sistema real, demonstrá-lo no último dia de aula e entregar um breve relatório escrito.
  • [15:40] As notas dos laboratórios são baseadas em quantos testes passam; todos os testes são fornecidos, então não há testes ocultos, e passar em todos os testes localmente provavelmente significa uma nota máxima.
  • [16:18] Depurar os laboratórios pode consumir muito tempo porque sistemas distribuídos têm muita concorrência e comunicação, então os alunos devem começar cedo e usar os horários de atendimento dos monitores e o Piazza.

Curso sobre Infraestrutura de Aplicações

  • [17:34] Este curso trata de infraestrutura para aplicações.
  • [17:38] O curso se divide entre aplicações escritas por outros (o cliente) e a infraestrutura sendo estudada.
  • [17:49] As aplicações usarão a infraestrutura discutida neste curso.
  • [18:05] Os tipos comuns de infraestrutura são armazenamento, comunicação e computação.
  • [18:15] O curso cobrirá sistemas que fornecem todos os três tipos de infraestrutura.

Foco do Curso: Armazenamento, Computação, Comunicação

  • [18:23] O armazenamento será o foco principal porque é uma abstração bem definida e útil.
  • [18:31] As abstrações de armazenamento geralmente são bastante diretas, então as pessoas sabem muito sobre construir armazenamento distribuído replicado, tolerante a falhas e de alto desempenho.
  • [18:45] O curso também cobrirá sistemas de computação como o MapReduce.
  • [18:53] A comunicação será abordada principalmente como uma ferramenta necessária para construir sistemas distribuídos, já que o curso é majoritariamente um consumidor de comunicação.
  • [19:11] Aprender sobre os próprios sistemas de comunicação é mais o tópico de 6829.
  • [19:24] Para armazenamento e computação, grande parte do objetivo é descobrir abstrações que simplifiquem a interface para que as aplicações sejam fáceis de construir em cima.
  • [19:41] Isso significa construir abstrações que escondam a natureza distribuída desses sistemas.
  • [19:50] O sonho, raramente alcançado plenamente, é uma interface que pareça para uma aplicação um sistema de armazenamento não distribuído, como um sistema de arquivos.
  • [20:37] O curso está apenas parcialmente lá: abstrações para armazenamento ou computação distribuídos raramente se comportam exatamente como a versão não distribuída.

Tópicos de Implementação em Sistemas Distribuídos

  • [21:11] Um tópico geral recorrente nos sistemas abordados é a implementação.
  • [21:27] A chamada de procedimento remoto é uma ferramenta comum para aprender a construir esses sistemas, e seu objetivo é mascarar a comunicação sobre uma rede não confiável.
  • [21:45] Threads são outro tópico de implementação: uma técnica de programação para aproveitar computadores multi-core e, mais importante para a turma, uma forma de estruturar operações concorrentes que, esperançosamente, simplifica a visão do programador.
  • [22:08] Como threads serão usadas bastante, a turma também precisará dedicar tempo ao controle de concorrência no nível de implementação, como locks.
  • [22:22] Essas ideias de implementação serão mencionadas em muitos artigos, mas aparecerão de forma significativa nos laboratórios, onde os alunos constroem sistemas distribuídos.

Escalabilidade e Gargalos em Sistemas Distribuídos

  • [23:03] O objetivo de alto nível dos sistemas distribuídos costuma ser o ganho de velocidade escalável.
  • [23:17] Escalabilidade significa que dobrar os computadores pode reduzir o tempo pela metade ou dobrar a vazão.
  • [23:58] Escalar por um fator para obter esse fator a mais de vazão é um enorme ganho.
  • [24:17] Comprar computadores com dinheiro é mais barato do que pagar programadores para reestruturar o software em busca de desempenho.
  • [25:10] É necessário um design cuidadoso para realmente obter o desempenho correspondente de muitos computadores.
  • [26:27] Um primeiro passo típico é comprar mais servidores web e dividir os usuários entre eles.
  • [27:18] Essa escalabilidade raramente é infinita; após 10, 20 ou 100 servidores web, o banco de dados se torna um gargalo.
  • [27:51] Adicionar servidores web move o gargalo dos servidores web para o banco de dados.
  • [28:01] Nesse ponto, quase certamente será necessário trabalho de design, já que refatorar um único banco de dados raramente é simples.

Escalando Horizontalmente e Tolerância a Falhas

  • [28:15] Dados ordenados em um único banco de dados podem ser refatorados para serem divididos entre vários bancos de dados.
  • [28:24] Essa refatoração costuma dar bastante trabalho e é desajeitada, mas muitas pessoas realmente precisam fazê-la.
  • [28:31] O curso mostrará muitos exemplos em que o sistema distribuído discutido é um sistema de armazenamento.
  • [28:39] Esses exemplos vêm de autores que executavam algo como um grande site que ficou sem recursos em um único banco de dados ou servidores de armazenamento.
  • [28:49] Sistemas que escalam dessa forma são desejáveis, mas é difícil ou exige trabalho de design levar essa ideia infinitamente longe.
  • [29:09] Tolerância a falhas é outro grande tópico que surge com frequência.

Tolerância a Falhas em Escala

  • [29:23] Um único computador e seu SO podem frequentemente ficar no ar por anos, e a energia predial aparentemente é confiável.
  • [29:46] Com milhares de computadores, mesmo que cada um fique no ar cerca de um ano, mil máquinas significam aproximadamente três falhas por dia.
  • [30:01] Grandes sistemas distribuídos transformam problemas de tolerância a falhas muito raros em falhas que acontecem o tempo todo.
  • [30:14] Em um sistema com mil computadores, quase certamente sempre há algo quebrado, incluindo máquinas travadas ou executando incorretamente.
  • [30:25] Com muitos cabos de rede e switches, sempre há algum problema de cabo ou switch em algum lugar do sistema do tamanho de um prédio.
  • [30:58] Mascarar falhas e a capacidade de perceber falhas devem ser incorporados ao design porque falhas estão sempre presentes.
  • [31:10] A infraestrutura deve esconder ou mascarar falhas dos programadores de aplicações para que cada um não precise de uma história complicada para cada tipo de falha.
  • [31:45] Uma noção comum de tolerância a falhas é a disponibilidade: sob certos tipos de falhas, não todos, o sistema continua fornecendo serviço íntegro.
  • [32:21] Um serviço replicado com duas cópias pode continuar operando se uma réplica falhar, mas não se ambas falharem.
  • [32:56] Recuperabilidade é um requisito mais fraco que disponibilidade: o serviço pode parar de responder e aguardar reparo, depois continuar como se nada tivesse dado errado.
  • [33:38] Sistemas recuperáveis normalmente precisam salvar seus dados mais recentes em disco para que possam ser recuperados após a energia voltar.
  • [33:52] Sistemas disponíveis geralmente são especificados para funcionar até que ocorra algum número de falhas, então param, e continuam corretamente uma vez que o suficiente seja reparado.

Abordagens para Resolver Problemas

  • [34:35] O palestrante destaca o que adora ouvir e gostaria de obter.
  • [34:40] Múltiplas abordagens para resolver esses problemas serão apresentadas, incluindo o maior martelo.

Ferramentas de Tolerância a Falhas: Armazenamento e Replicação

  • [34:49] Armazenamento não volátil é uma das ferramentas mais importantes do departamento para tolerância a falhas.
  • [34:54] Após uma queda ou falha de energia, armazenamento não volátil como discos rígidos, flash ou SSDs pode armazenar um checkpoint ou log do estado do sistema.
  • [35:15] Quando a energia é restaurada, o sistema pode ler seu estado mais recente do disco rígido e continuar a partir dali.
  • [35:28] Gerenciar armazenamento não volátil surge muito porque tende a ser caro atualizar.
  • [35:35] Grande parte da construção de sistemas tolerantes a falhas de alto desempenho envolve maneiras inteligentes de evitar escrever em armazenamento não volátil demais.
  • [35:50] Escrever em armazenamento não volátil tradicionalmente significava mover um braço de disco e esperar um prato girar, ambos agonizantemente lentos na escala de microprocessadores de 3 gigahertz.
  • [36:05] Flash é bem melhor, mas ainda requer muita reflexão para obter bom desempenho dele.
  • [36:12] Replicação é a outra grande ferramenta para tolerância a falhas, e gerenciar cópias replicadas é complicado.
  • [36:33] O problema chave em qualquer sistema replicado é que as duas réplicas acidentalmente sairão de sincronia e deixarão de ser réplicas.
  • [36:50] O laboratório 2 trata de gerenciar cópias replicadas para tolerância a falhas, o que é bastante complexo.

Consistência em Sistemas Distribuídos de Chave-Valor

  • [37:16] Um sistema de armazenamento chave-valor distribuído suporta operações put e get em uma tabela de chaves e valores.
  • [38:08] Programadores de aplicações precisam de uma especificação descrevendo o que put e get significam, caso contrário escrever aplicações é difícil.
  • [38:37] Consistência é interessante em sistemas distribuídos porque, para desempenho e tolerância a falhas, frequentemente mantemos mais de uma cópia dos dados.
  • [38:53] Em um sistema de servidor único não distribuído, muitas vezes não há relativamente ambiguidade sobre o que put e get significam.
  • [39:16] Com replicação ou cache, muitas versões de um par chave-valor podem estar flutuando por aí.
  • [40:19] Se um cliente falhar após atualizar uma réplica mas antes de atualizar a segunda, uma réplica contém 21 e a outra ainda contém 20.
  • [40:39] Um get subsequente pode retornar 21 ou 20 dependendo de com qual servidor ele fala, e uma cópia desatualizada pode ser exposta algum dia.
  • [41:28] Por causa desse perigo de replicação, as regras sobre puts e gets precisam ser escritas.
  • [41:37] Existem muitas definições possíveis de consistência; consistência forte geralmente é definida como get retornando o valor colocado pelo put concluído mais recentemente.
  • [42:02] Também é muito útil construir sistemas fracamente consistentes que não garantem que get veja o valor escrito pelo put mais recente.

Trade-offs entre Consistência Fraca e Forte

  • [42:39] Com consistência fraca, um leitor pode não ver um put e pode ver valores antigos por um período ilimitado de tempo.
  • [42:54] Consistência forte significa que as leituras têm garantia de ver a escrita mais recente, mas é uma especificação muito cara de implementar.
  • [43:19] Consistência forte com múltiplas cópias significa que o escritor, o leitor ou ambos devem consultar todas as cópias, o que é muita comunicação para ler um valor.
  • [43:53] Para evitar comunicação, especialmente quando as réplicas estão distantes, as pessoas constroem sistemas fracos que podem permitir leituras desatualizadas de valores antigos.
  • [44:23] Para tolerância a falhas, as réplicas devem ter probabilidade de falha independente e não correlacionada, então colocar ambas as réplicas no mesmo rack provavelmente é uma má ideia.
  • [44:57] As pessoas gostariam de colocar as réplicas o mais distantes possível, como em cidades diferentes, para que um terremoto dificilmente destrua ambas.
  • [45:24] A velocidade da luz significa que comunicar com um data center do outro lado do continente pode levar na ordem de milissegundos ou dezenas de milissegundos.
  • [45:48] Consistência forte pode exigir esperar 10, 20 ou 30 milissegundos para falar com ambas as cópias, desperdiçando muitas instruções potenciais.
  • [46:12] As pessoas frequentemente constroem sistemas muito mais fracos nos quais você só pode atualizar ou apenas consultar a cópia mais próxima.

MapReduce como estudo de caso

  • [46:53] MapReduce é um estudo de caso detalhado que ilustra a maioria das ideias discutidas.
  • [47:06] MapReduce foi originalmente projetado, construído e usado pelo Google, com o artigo datando de 2004.
  • [47:15] O Google enfrentava computações enormes em terabytes de dados, como indexar a web ou analisar a estrutura de links para encontrar páginas importantes.
  • [47:53] Ordenar todo o conteúdo da web em um único computador teria levado semanas, meses ou anos.
  • [48:02] O Google queria executar computações gigantes em milhares de computadores para que os trabalhos terminassem rapidamente.
  • [48:25] Por um tempo, engenheiros escreveram software sob medida para distribuir computações por muitos computadores.
  • [49:49] Eles queriam um framework que tornasse fácil para não especialistas escrever e executar computações distribuídas gigantes.
  • [50:04] O programador escreve apenas uma função map simples e uma função reduce simples sem saber sobre distribuição.
  • [50:28] A entrada é dividida em pedaços ou arquivos, e o framework executa a função map em cada arquivo de entrada em paralelo.
  • [51:31] Uma função map recebe um arquivo como entrada e produz uma lista de pares chave-valor como saída.
  • [51:45] Em um exemplo de contagem de palavras, a função map emite cada palavra como a chave e um como o valor.

Execução de Trabalhos MapReduce e Terminologia

  • [52:20] As tarefas de map emitem pares chave-valor como A:1 e B:1 para cada palavra encontrada em sua entrada.
  • [52:52] Executar todos os maps sobre todos os arquivos de entrada produz a saída intermediária, um conjunto de pares chave-valor por map.
  • [53:06] O framework MapReduce coleta todas as instâncias de cada chave de todos os maps e as entrega a uma chamada da função reduce definida pelo programador.
  • [53:35] Coletar chaves como B requer movimento real de dados porque elas foram produzidas por diferentes invocações de map em computadores diferentes.
  • [54:05] O framework organiza uma chamada de reduce para cada chave que ocorreu em qualquer saída de map.
  • [54:17] No exemplo de contagem de palavras, cada reduce apenas conta o número de itens passados a ele, já que cada valor é mais um.
  • [55:07] A computação inteira é chamada de job, e qualquer invocação de map ou reduce é chamada de task.

Exemplo de contagem de palavras no MapReduce

  • [55:27] O exemplo de contagem de palavras ilustra como são as funções map e reduce.
  • [55:40] A função map recebe uma chave e um valor como argumentos e é escrita em uma linguagem de programação comum como C++ ou Java.
  • [55:53] A função map para contagem de palavras divide o valor, que é o conteúdo do arquivo de entrada, em palavras.
  • [56:30] Para cada palavra, a função map emite a palavra como chave e a string um como valor.
  • [56:51] Uma função map de contagem de palavras no MapReduce poderia literalmente ser assim simples.
  • [57:00] A função map não sabe nada sobre distribuição, múltiplos computadores ou mover dados pela rede.
  • [57:18] Reduce é chamada com uma chave e um vetor de todos os valores que os maps produziram para aquela chave.
  • [57:37] Para contagem de palavras, a chave é a palavra e os valores são todos uns; apenas a contagem importa.
  • [57:44] Reduce emite o comprimento do array como o valor de saída final para a chave.
  • [58:00] As funções reduce no MapReduce são extremamente simples e não exigem conhecimento de tolerância a falhas.

Encadeamento de jobs MapReduce e seus limites

  • [58:34] Você pode alimentar a saída dos reducers em outro job MapReduce.
  • [58:51] É rotina entre usuários de MapReduce encadear jobs para análise multi-estágio ou algoritmos iterativos.
  • [59:08] PageRank, que o Google usa para estimar a importância de páginas web, é um algoritmo iterativo que converge gradualmente.
  • [59:25] Implementar PageRank no MapReduce requer executar o job várias vezes, com cada saída usada como entrada para outro job.
  • [59:50] Você precisa configurar a função reduce para produzir dados no formato exigido para o próximo job MapReduce.
  • [1:00:07] Uma deficiência do MapReduce é que ele funciona bem apenas quando o algoritmo é facilmente expressável como map, shuffle por chave, depois reduce.
  • [1:00:30] Cada map deve ser completamente independente e uma função puramente funcional que olha apenas para seus argumentos.
  • [1:00:46] Muitas pessoas querem pipelines mais longos com muitos tipos de processamento, que devem ser remendados a partir de múltiplos jobs MapReduce distintos.
  • [1:00:59] Sistemas mais avançados discutidos posteriormente no curso são melhores em permitir que você especifique um pipeline completo e faça otimização.

MapReduce: Visão do Programador vs. do Framework

  • [1:01:39] Do ponto de vista do programador, MapReduce é apenas sobre map e reduce.
  • [1:01:43] Do ponto de vista do framework, é sobre os processos worker e servidores worker que fazem parte do framework MapReduce, entre muitas outras coisas.
  • [1:02:00] A organização do framework importa muito, e a visão do programador é as partes distribuídas removidas.

Arquitetura de emissão e workers do MapReduce

  • [1:02:31] Há duas questões separadas: o que acontece com os dados emitidos e onde as funções são executadas.
  • [1:02:51] No mundo real há uma grande coleção de servidores worker mais um único servidor master organizando a computação, como mostrado na figura um do artigo.
  • [1:03:16] O master sabe o número de arquivos de entrada (por exemplo, 5,000) e distribui invocações de map para diferentes workers.
  • [1:03:39] O processo worker implementa emit, e cada vez que map chama emit o worker escreve os dados em arquivos no seu disco local.
  • [1:04:27] No final da fase de map, cada máquina worker mantém a saída de quaisquer maps que rodaram nela.
  • [1:04:40] Os workers do MapReduce então movem dados para onde são necessários para os reduces.
  • [1:05:13] Antes de um reduce poder rodar, o worker de reduce tipicamente deve contatar todos os outros servidores e buscar todas as instâncias da chave pela qual é responsável.
  • [1:05:48] Uma vez que o worker de reduce coletou todos esses dados, ele pode chamar reduce, que chama reduce emit.

GFS e armazenamento de entrada do MapReduce

  • [1:06:17] O palestrante ainda não havia mencionado onde os dados de entrada e saída vivem.
  • [1:06:22] Tanto a entrada quanto a saída vivem em arquivos.
  • [1:06:27] Ler qualquer pedaço de entrada em qualquer servidor worker requer um sistema de arquivos de rede para armazenar os dados de entrada.
  • [1:06:41] O artigo discute o GFS, o Google File System.
  • [1:06:49] O GFS é um sistema de arquivos de cluster que roda exatamente nos mesmos servidores worker que rodam o MapReduce.
  • [1:07:03] O GFS automaticamente divide qualquer arquivo grande armazenado nele entre muitos servidores em pedaços de 64 megabytes.
  • [1:07:10] 10 terabytes de conteúdos de páginas web rastreadas escritos no GFS, mesmo como um único arquivo grande, são automaticamente divididos em pedaços de 64 kilobytes distribuídos uniformemente por todos os servidores GFS.
  • [1:07:35] Para um job MapReduce que toma toda a web rastreada como entrada, os dados já estão divididos uniformemente por todos os servidores, então com mil servidores mil workers de map cada um lê um milésimo da entrada em paralelo de mil servidores de arquivos GFS.

Gargalo de rede do MapReduce e acesso a dados do GFS

  • [1:08:21] A questão é se o Google executa o GFS e o MapReduce em conjuntos separados de máquinas físicas.
  • [1:08:48] A resposta sobre o que a seta entre GFS e MapReduce envolve mudou ao longo dos anos à medida que os sistemas do Google evoluíram.
  • [1:08:58] No caso mais geral, arquivos grandes são armazenados em um sistema de arquivos de rede como o GFS, que é um pouco como o AFS.
  • [1:09:18] O worker do MapReduce pode ter que falar pela rede com o servidor ou servidores GFS corretos para buscar sua entrada.
  • [1:09:36] Essa abordagem de busca pela rede foi eventualmente como o MapReduce realmente funcionou, mas isso significa muita comunicação de rede.
  • [1:10:05] No mundo de 2004 deste artigo, o gargalo mais restritivo em seu sistema MapReduce era a taxa de transferência da rede.
  • [1:10:43] Todos os switches Ethernet de rack falavam com um único switch Ethernet raiz, então pelo menos metade do tempo a comunicação passava por ele.
  • [1:11:17] Dividir a taxa de transferência total do switch raiz por aproximadamente 2,000 servidores dava a cada máquina apenas 50 megabits por segundo.
  • [1:11:50] Esses 50 megabits por segundo eram um limite tremendo comparado à velocidade de disco e CPU, então o design usava truques para evitar usar a rede.

Localidade de dados do GFS e MapReduce

  • [1:12:14] Servidores GFS e workers MapReduce rodavam no mesmo conjunto de mil máquinas.
  • [1:12:28] Quando o master dividia o trabalho de map, ele determinava a partir do GFS qual servidor mantinha cada arquivo de entrada no disco local.
  • [1:12:50] O master enviava cada map para um arquivo de entrada para o software MapReduce na mesma máquina.
  • [1:12:57] Por padrão a leitura era local do disco e não envolvia a rede.
  • [1:13:03] Dependendo de falhas ou carga nem sempre conseguia fazer isso, mas quase todos os maps rodavam na máquina que armazenava os dados, economizando tempo movendo dados de entrada pela rede.
  • [1:13:22] A saída do map é armazenada no disco local da máquina que executa o map, então armazenar a saída não requer comunicação de rede.

Shuffle do MapReduce e custo de rede

  • [1:13:54] Produzir saída em alguma máquina requer comunicação de rede.
  • [1:14:06] O shuffle move chaves de serem armazenadas por linha na máquina que executou o map para serem armazenadas por coluna na máquina responsável pelo reduce.
  • [1:14:21] O artigo chama essa transformação de armazenamento por linha para armazenamento por coluna de shuffle.
  • [1:14:27] O shuffle exigia mover cada pedaço de dados pela rede do map que o produziu para o reduce que precisava dele.
  • [1:14:32] Esse movimento de rede era a parte cara do MapReduce.
  • [1:14:51] Um reduce mais streaming é imaginável, mas o palestrante não pensou nisso a fundo e não sabe se seria viável.
  • [1:15:01] O objetivo número um deles era tornar fácil programar para pessoas que não tinham ideia do que estava acontecendo no sistema.
  • [1:15:16] Uma versão streaming da especificação da função reduce provavelmente não pareceria tão simples assim.

Sucessores modernos do MapReduce

  • [1:15:36] As pessoas se tornaram mais sofisticadas com os sucessores modernos do MapReduce.
  • [1:15:39] Esses sucessores frequentemente processam fluxos de dados em vez de usar uma abordagem em lote.
  • [1:15:48] O MapReduce é uma abordagem em lote porque espera até que todos os dados estejam disponíveis antes de processar.
  • [1:15:55] Abordagens em lote exigem uma noção de entradas finitas.
  • [1:15:59] Sistemas modernos frequentemente usam fluxos e podem tirar vantagem de algumas eficiências disso.

Shuffle e tráfego de rede de saída do MapReduce

  • [1:16:12] O estágio de shuffle é onde todo o tráfego de rede acontece e pode envolver uma quantidade vasta de dados.
  • [1:16:24] Para uma ordenação, o tamanho da saída é igual ao tamanho da entrada, então ordenar 10 terabytes move 10 terabytes pela rede.
  • [1:16:40] Isso é muito dado para muitos, embora não todos, jobs MapReduce, e alguns estágios podem reduzir significativamente os dados.
  • [1:16:49] As pessoas frequentemente queriam alimentar a saída do reduce em outro job MapReduce.
  • [1:16:56] A saída do reduce pode ser enorme, como para ordenação ou indexação web, por exemplo, 10 terabytes de saída para 10 terabytes de entrada.
  • [1:17:04] A saída do reduce também era armazenada no GFS, com o framework reunindo pares chave-valor em arquivos gigantes.
  • [1:17:24] Outra rodada de comunicação de rede era necessária para levar a saída de cada reduce ao servidor GFS que a armazenava.
  • [1:17:48] Como o GFS mantém duas ou três cópias para tolerância a falhas, uma cópia deve sempre ser escrita pela rede para um servidor diferente.

Redes modernas de data center e MapReduce

  • [1:18:16] O arranjo de rede com raiz única era um fator limitante para muitas tarefas desejadas de data center.
  • [1:18:22] As redes modernas de data center são muito mais rápidas na raiz do que este design anterior.
  • [1:18:28] Uma rede moderna típica de data center tem muitos switches raiz em vez de um único switch raiz, com cada switch de rack conectado a cada switch raiz replicado e o tráfego dividido entre eles.
  • [1:18:49] Portanto, as redes modernas de data center têm muito mais taxa de transferência de rede.
  • [1:18:52] O Google supostamente parou de usar o MapReduce alguns anos atrás.
  • [1:19:01] Antes disso, o MapReduce moderno não tentava mais executar maps na mesma máquina onde os dados estavam armazenados e ficava feliz em carregar dados de qualquer lugar, assumindo que a rede era extremamente rápida.

Conclusão do MapReduce e laboratório

  • [1:19:16] O tempo para MapReduce acabou, e há um laboratório.
  • [1:19:21] O laboratório no final da próxima semana envolve escrever um MapReduce um tanto simplificado.
  • [1:19:30] O instrutor diz para se divertir e até quinta-feira.

[0:01] Certo, vamos começar. Este é 6824, sistemas distribuídos. Um, obrigado. Então eu gostaria de começar com apenas uma breve explicação do que eu penso que é um sistema distribuído. Obrigado. O núcleo disso é um conjunto de computadores cooperantes que estão se comunicando uns com os outros pela rede para realizar alguma tarefa coerente. Os tipos de exemplos que vamos focar nesta aula são coisas como armazenamento para grandes sites, ou computações de big data como MapReduce, Um, E também coisas um tanto mais exóticas como compartilhamento de arquivos peer-to-peer.

[0:43] Esses são todos apenas exemplos dos tipos de estudos de caso que veremos. Hum, e a razão pela qual tudo isso é importante é que muita infraestrutura crítica por aí é construída a partir de sistemas distribuídos. Infraestrutura que exige mais de um computador para realizar seu trabalho ou que, por natureza, precisa ser espalhada fisicamente. Hum. Então, as razões pelas quais as pessoas constroem essas coisas, Primeiro, antes mesmo de eu falar sobre sistemas distribuídos, só quero lembrar que se você está projetando um sistema, você precisa resolver algum problema, se você puder possivelmente resolvê-lo, em um único computador.

[1:17] você sabe, sem construir um sistema distribuído, você deveria fazer dessa forma. E há muitos, muitos trabalhos que você pode realizar em um único computador, e é sempre mais fácil. Então, sistemas distribuídos, você deveria tentar tudo o mais antes de tentar construir sistemas distribuídos, porque eles não são mais simples. Então, a razão pela qual as pessoas são levadas a usar muitos computadores cooperando é que elas precisam obter alto desempenho. E a maneira de pensar sobre isso é que elas querem alcançar algum tipo de paralelismo. Muitas CPUs, muitas memórias, muitos braços de disco se movendo em paralelo.

[1:54] Outra razão pela qual as pessoas constroem essas coisas é para poder tolerar falhas. Uau. . ter dois computadores fazendo exatamente a mesma coisa. Se um deles falhar, você pode mudar para o outro. Outra é que alguns problemas são simplesmente naturalmente espalhados no espaço. Hum, você quer fazer transferências interbancárias de dinheiro ou algo assim. O Banco A tem este computador na cidade de Nova York, e o Banco B tem este computador em Londres.

[2:25] você sabe, você simplesmente precisa ter alguma forma de eles se comunicarem e cooperarem para realizar isso. Então, há algumas razões naturais, digamos, físicas, para sistemas que são inerentemente distribuídos fisicamente, E a razão final pela qual as pessoas constroem essas coisas é para alcançar algum tipo de objetivo de segurança. Então, muitas vezes, se há algum código em que você não confia, ou você precisa interagir com alguém, eles podem ser maliciosos ou talvez o código deles tenha bugs. Então você não quer ter que confiar nele. Você pode querer dividir a computação para que, suas coisas rodem naquele computador, minhas coisas rodem neste computador, e eles só conversem entre si.

[3:03] para algum tipo de protocolo de rede restrito, estreitamente definido. Então podemos estar preocupados com segurança, E isso é alcançado dividindo as coisas em vários computadores para que possam ser isolados. Hum. A maior parte deste curso será sobre desempenho e tolerância a falhas, embora as outras duas muitas vezes se infiltrem por meio das restrições nos estudos de caso que veremos. Hum, você sabe, todos os sistemas distribuídos desses problemas são, porque têm muitas partes e as partes executam concorrentemente, porque há vários computadores.

[3:42] Você tem todos os problemas que surgem com programação concorrente, todas as interações complexas e coisas estranhas dependentes de tempo. E isso é parte do que torna os sistemas distribuídos difíceis. Outra coisa que torna... os sistemas distribuídos difíceis é que, novamente, você tem várias peças mais uma rede. você pode ter padrões de falha muito inesperados, isto é, se você tem um único computador, geralmente é o caso de o computador funcionar ou talvez travar ou sofrer uma falha de energia ou algo assim. Mas ele basicamente funciona ou não funciona.

[4:12] Sistemas distribuídos compostos por muitos computadores, você pode ter falhas parciais. Isto é, algumas peças param de funcionar, outras peças continuam funcionando. Ou talvez os computadores estejam funcionando, mas alguma parte da rede esteja quebrada ou não confiável. hum Então falhas parciais é outra razão pela qual uh... sistemas distribuídos são difíceis. Então esses são tipos de desafios básicos. Tchau. Obrigado. Obrigado.

[4:44] Tchau. Legendas pela comunidade Amara.org Obrigado. Obrigado. E uma razão final pela qual é difícil é que, você sabe, a razão original para construir um sistema distribuído é frequentemente obter maior desempenho. obter o desempenho de 1,000 computadores, ou de 1,000 braços de disco. Mas na verdade é muito complicado obter esse ganho de velocidade de mil vezes com mil computadores. Muitas vezes há muitos obstáculos jogados no seu caminho. Hum, Olá.

[5:15] Obrigado. Obrigado. Muitas vezes é preciso um pouco de design cuidadoso para... fazer o sistema realmente lhe dar o desempenho que você sente que merece. Então resolver esses problemas, é claro, pode ser tudo sobre, você sabe, abordar essas questões. Hum, A razão para fazer o curso é porque muitas vezes os problemas e as soluções são bastante interessantes tecnicamente e são problemas difíceis. Para alguns desses problemas, há soluções muito boas conhecidas; para outros problemas, elas não são tão boas, não.

[5:46] Sistemas distribuídos são usados por muitos sistemas do mundo real por aí, grandes sites frequentemente envolvidos. você sabe, vastos números de computadores que são, você sabe, montados como sistemas distribuídos. Quando comecei a ensinar este curso, Era. sistemas distribuídos eram algo de uma curiosidade acadêmica. Você sabe, as pessoas pensavam: 'Oh, você sabe, em pequena escala, eles eram usados às vezes, e as pessoas sentiam que, oh, algum dia eles seriam... poderiam ser importantes. mas agora, particularmente impulsionados pelo surgimento de sites gigantes.

[6:17] que têm, você sabe, vastas quantidades de dados e armazéns inteiros cheios de computadores, sistemas distribuídos nos últimos 20 anos tornaram-se uma parte muito séria da infraestrutura de computação. Ok. Isso significa que tem havido muita atenção voltada para eles, muitos problemas foram resolvidos, mas ainda há bastantes problemas não resolvidos. Então, se você é um estudante de pós-graduação ou está interessado em pesquisa, há muitos problemas ainda a serem resolvidos em sistemas distribuídos. Você poderia investigar essa pesquisa.

[6:49] E, finalmente, se você gosta de construir coisas, esta é uma boa disciplina porque tem uma sequência de laboratórios na qual você construirá alguns sistemas distribuídos bastante realistas focados em desempenho e tolerância a falhas. Então você terá muita prática construindo sistemas distribuídos e fazendo-os funcionar. Certo. Deixe-me falar um pouco sobre a estrutura do curso antes de começar o conteúdo técnico de verdade. Você deve conseguir encontrar o site do curso.

[7:20] usando o Google. E no site do curso estão as tarefas de laboratório, o cronograma do curso, e também um link para um Piazza onde você pode postar perguntas e obter respostas. Hum, A equipe do curso, eu sou Robert Morris, darei as aulas. Também tenho quatro monitores. Vocês querem se levantar e mostrar seus rostos? Hum, Obrigado. Os monitores são especialistas, em particular, em resolver os laboratórios. Eles terão horários de atendimento, então se você tiver perguntas sobre os laboratórios, deve ir aos horários de atendimento.

[7:54] ou você pode postar perguntas no Piazza. Hum, Obrigado. O curso tem alguns componentes importantes. Hum, Um são as aulas. Há um artigo para quase toda aula. Obrigado. Obrigado. Há dois exames. Obrigado. Obrigado. Obrigado. Tchau. Há os laboratórios, laboratórios de programação, e Hum, há um projeto final opcional que você pode fazer em vez de um dos laboratórios.

[8:27] Obrigado. Legendas pela comunidade Amara.org As aulas serão sobre grandes ideias em sistemas distribuídos. Também haverá algumas aulas mais sobre coisas de programação de laboratório. Muitas das aulas serão ocupadas por estudos de caso, grande parte da maneira como eu tento trazer o conteúdo de sistemas distribuídos é olhando para artigos, alguns acadêmicos, alguns escritos por pessoas da indústria, descrevendo soluções reais para problemas reais.

[9:04] Hum, Essas aulas na verdade seriam gravadas em vídeo. e espero postá-las online para que você, se não estiver aqui, ou quiser revisar as aulas, possa assistir às aulas em vídeo. Amém. Os artigos, novamente, há um para ler por semana. A maioria deles são artigos de pesquisa. Alguns deles são artigos clássicos. Como o artigo de hoje, que espero que alguns de vocês tenham lido, sobre MapReduce. É um artigo antigo, mas foi o começo, estimulou uma quantidade enorme de trabalho interessante, tanto acadêmico quanto no mundo real. Então alguns são clássicos e alguns são artigos mais recentes.

[9:38] falando sobre pesquisa mais atualizada, com o que as pessoas estão preocupadas atualmente. E a partir dos artigos, esperarei extrair quais são os problemas básicos, quais ideias as pessoas tiveram que podem ou não ser úteis para resolver problemas de sistemas distribuídos. Hum, Veremos às vezes detalhes de implementação em alguns desses artigos. Porque muito disso tem a ver com a construção real de sistemas baseados em software. E também vamos passar um certo tempo olhando avaliações. pessoas avaliando quão tolerantes a falhas são seus sistemas medindo-os ou pessoas medindo quanto desempenho ou se obtiveram melhoria de desempenho.

[10:14] Hum, Então espero que todos vocês leiam os artigos antes de vir para a aula. As aulas são... talvez não façam tanto sentido se você ainda não leu a aula, porque não há tempo suficiente para explicar todo o conteúdo do artigo e ter uma reflexão interessante sobre o que o artigo significa. aula online você realmente precisa ler os artigos antes de vir para a aula e espero que uma das coisas que você aprenda nesta aula é como ler um artigo de forma rápida e eficiente, e pular as partes que talvez não sejam tão importantes, focar em extrair as ideias importantes.

[10:50] No site, há para cada link do cronograma, uma pergunta. que você deve enviar uma resposta para cada artigo. Acho que as respostas devem ser entregues à meia-noite. E também pedimos que você envie uma pergunta que tenha sobre o artigo. Hum, para o site, tanto para me dar algo para pensar enquanto preparo a aula, quanto, se eu tiver tempo, tentarei responder pelo menos algumas das perguntas por e-mail. E a pergunta e a resposta para cada artigo devem ser entregues à meia-noite. da noite anterior.

[11:21] Há dois exames, há um exame de meio de semestre em sala de aula, acho que na última aula antes do, uh, recesso de primavera. Hum, e há um exame final durante a semana de exames finais no final do semestre. Os exames se concentrarão principalmente nos artigos e nos laboratórios. e provavelmente a melhor maneira de se preparar para eles, além de assistir às aulas e ler os artigos. hum, uma boa maneira de se preparar para os exames é olhar exames antigos.

[11:52] 20 anos de exames antigos e soluções. E então você olha para eles e tem uma ideia do tipo de perguntas que eu gosto de fazer. E, de fato, porque lemos muitos dos mesmos artigos, inevitavelmente, faço perguntas a cada ano que não podem deixar de se assemelhar a perguntas feitas em anos anteriores. Obrigado. Os laboratórios, há quatro laboratórios de programação. O primeiro deles deve ser entregue na sexta-feira da próxima semana. hum Eles são...

[12:23] Obrigado. O laboratório um é um... Obrigado. Um laboratório simples de MapReduce. para implementar sua própria versão do artigo. que discutirei em alguns minutos. Hum, Laboratório dois. envolve usar uma técnica chamada raft para obter tolerância a falhas, para, digamos, permitir, em teoria, que qualquer sistema se torne tolerante a falhas replicando-o e tendo esta técnica raft gerenciar a replicação e gerenciar uma espécie de comutação automática se houver uma falha, se um dos servidores replicados falhar.

[12:59] Então este é o RAF para tolerância a falhas. Hum. Obrigado. Legendas pela comunidade Amara.org *beijo* No laboratório três, você usará sua implementação do raft para construir um servidor de chave-valor tolerante a falhas. Obrigado. Amém. Obrigado. Ele será replicado e tolerante a falhas. E no laboratório quatro, você pegará seu servidor de chave-valor replicado e o clonará em vários grupos independentes. e você dividirá os dados Hum, no seu sistema de armazenamento de chave-valor entre todos esses grupos replicados individuais para obter aceleração paralela.

[13:37] executando vários grupos replicados em paralelo e você também será responsável por mover os vários pedaços de dados entre diferentes servidores à medida que eles entram e saem. sem deixar cair nenhuma bola. o que é frequentemente chamado de serviço de chave-valor fragmentado. Tchau. Tchau. você O sharding refere-se a dividir os dados, particionar os dados. entre vários servidores para obter aceleração paralela.

[14:10] hum Obrigado. Se quiser, em vez de fazer o laboratório quatro, Você pode fazer um projeto de sua escolha. E a ideia aqui é se você tem alguma ideia para um sistema distribuído, você sabe, no estilo de... alguns dos sistemas distribuídos que discutimos na aula, se você tem sua própria ideia que deseja seguir, e gostaria de construir algo e medir se funcionou Explore sua ideia. você pode fazer um projeto. Hum, E então para um projeto, você escolherá alguns colegas de equipe porque exigimos que os projetos sejam feitos em equipes de duas ou três pessoas.

[14:45] Nam. Então, como alguns colegas de equipe e envie sua ideia de projeto para nós e pensaremos sobre isso e diremos sim ou não e talvez lhe daremos alguns conselhos. hum, E então se você prosseguir e fizer, se dissermos sim, e você quiser fazer um projeto, você faz isso em vez do Laboratório 4, e é feito. no final do semestre. Você sabe, você... você deve fazer algum trabalho de design e construir um sistema real, e então no último dia de aula, você demonstrará seu sistema. bem como entregar um breve... tipo de relatório escrito para nós sobre o que você construiu. E eu postei no site algumas ideias que podem ou não ser úteis para você, para estimular pensamentos sobre quais projetos você pode construir, mas realmente os melhores projetos são aqueles em que você tem uma boa ideia para o projeto. E a ideia é que se você quiser fazer um projeto, você deve escolher uma ideia que esteja mais ou menos na mesma linha dos sistemas que estamos discutindo nesta aula.

[15:40] Ok, de volta aos laboratórios. As notas dos laboratórios que damos a você, você entrega o código do laboratório, e executamos alguns testes contra ele, Você é avaliado com base em quantos testes você passa. Damos a você todos os testes que usamos, então não há testes ocultos. Então, Se você influenciar o laboratório e ele passar de forma confiável em todos os testes, então as chances são boas, a menos que haja algo engraçado acontecendo, o que às vezes acontece. As chances são boas de que se seu código passar em todos os testes quando você o executar, ele passará em todos os testes quando nós o executarmos. e você obterá uma pontuação total. Então, esperançosamente, não haverá mistério sobre qual pontuação você provavelmente obterá.

[16:13] nos laboratórios. Hum, Deixe-me avisar que depurar esses laboratórios pode consumir tempo. Porque eles são sistemas distribuídos, e têm muita concorrência e comunicação, Hum, erros meio estranhos e difíceis de depurar podem surgir. Você realmente deve começar os laboratórios cedo. Não os deixe. Muitos problemas se você deixar os laboratórios para o último momento. Você tem que começar cedo. Se você tiver-- problemas, por favor venha ao horário de atendimento dos monitores.

[16:44] e por favor sinta-se à vontade para fazer perguntas. sobre os laboratórios no Piazza. E, de fato, espero que se você souber a resposta, você também responda às perguntas das pessoas no Piazza. Tudo bem. Alguma pergunta sobre a mecânica do curso? Sim? Tchau. Sim. Obrigado. Então a pergunta é: como essas coisas entram na nota? Eu esqueci, mas está tudo no...

[17:18] Está no site sob-- alguma coisa. Hum. Acho que os laboratórios são o componente mais importante. Obrigado. Ok. Obrigado. Hum... Tudo bem, então este é um curso sobre infraestrutura. para aplicações. E ao longo deste curso, haverá uma espécie de divisão na forma como falo sobre as coisas entre aplicações, que são meio que outras pessoas, o cliente, alguém escreve.

[17:49] As aplicações usarão a infraestrutura que estamos considerando neste curso. E então os tipos de infraestrutura que tendem a surgir muito. Obrigado. Obrigado. são armazenamento Obrigado. comunicação Obrigado. e computação. E falaremos sobre sistemas que fornecem todos esses três tipos de infraestrutura.

[18:19] Hum, o armazenamento Acontece que o armazenamento será aquele em que mais nos concentraremos porque é uma abstração muito bem definida e útil. E obrigado. abstrações geralmente bastante diretas. Então as pessoas sabem muito sobre como usar e construir sistemas de armazenamento e como construir implementações distribuídas replicadas, tolerantes a falhas e de alto desempenho de armazenamento. Também falaremos sobre alguns de nossos sistemas de computação, como o MapReduce hoje.

[18:50] é um sistema de computação. Hum, E falaremos um pouco sobre comunicação, mas principalmente do ponto de vista de uma ferramenta que precisamos usar para construir sistemas distribuídos. Como computadores têm que conversar entre si, por uma rede, você sabe, talvez você precise de confiabilidade ou algo assim. E então falaremos um pouco, mas na verdade somos principalmente... consumidores de comunicação. Hum, Se você quiser aprender sobre sistemas de comunicação ou como eles funcionam, esse é mais o tópico de 6829. Então, para armazenamento e computação, Muito do nosso objetivo é ser capaz de descobrir abstrações, Hum, maneiras de simplificar a interface para esses, infraestrutura distribuída de armazenamento e computação, para que seja fácil construir aplicações em cima dela.

[19:41] E o que isso realmente significa é que precisamos, gostaríamos de ser capazes de construir abstrações que escondam a natureza distribuída desses. desses sistemas. Então o sonho, que raramente é totalmente alcançado, mas o sonho seria ser capaz de construir uma interface, Que pareça para uma aplicação como se fosse um sistema de armazenamento não distribuído, como um sistema de arquivos ou algo que todo mundo já sabe programar e tem um modelo de semântica bastante simples. Adoraríamos ser capazes de construir interfaces que pareçam e ajam exatamente como sistemas de armazenamento e computação não distribuídos, mas que sejam na verdade-- você sabe, vastos, extremamente de alto desempenho, tolerantes a falhas, sistemas distribuídos por baixo.

[20:23] Hum. Então adoraríamos ter abstrações. Obrigado. Legendas pela comunidade Amara.org Obrigado. E como você verá ao longo do curso, estamos meio que, você sabe, apenas parte do caminho até lá. É raro encontrar uma abstração para uma versão distribuída de armazenamento ou computação que tenha comportamento simples, que se comporte exatamente como Hum, a versão não distribuída de armazenamento que todos entendem. As pessoas estão ficando melhores nisso e...

[20:54] hum Vamos tentar estudar as maneiras pelas quais as pessoas aprenderam sobre. construir tais abstrações. Ok. Que tipo de, que tipo de, Tópicos aparecem quando consideramos essas abstrações. O primeiro, o primeiro tópico, tópico geral que veremos muito é que em muitos dos sistemas que analisamos, têm a ver com implementação. Obrigado. hum Então, por exemplo, o tipo de ferramentas que você vê muito para as maneiras pelas quais as pessoas aprendem a construir esses sistemas são coisas como chamada de procedimento remoto, cujo objetivo é mascarar o fato de que estamos nos comunicando por uma rede não confiável.

[21:38] hum Outro tipo de tópico de implementação que veremos muito é threads. que são uma técnica de programação, que nos permite aproveitar computadores multi-core, mas talvez mais importante para esta aula, Threads são uma maneira de estruturar operações concorrentes. de uma forma que, esperançosamente, simplifica a visão do programador sobre essas operações concorrentes. Hum, E porque vamos usar threads muito, acontece que também precisaremos, apenas do ponto de vista de implementação, gastar um certo tempo pensando em controle de concorrência, coisas como locks.

[22:18] Hum. você Obrigado. E o principal lugar onde essas ideias de implementação surgirão na aula, serão abordadas em muitos dos artigos, mas você vai encarar tudo isso de frente de forma significativa nos laboratórios. Você precisa construir distribuidores. você sabe, fazer a programação para sistemas distribuídos. Estas são como muitas das ferramentas importantes além da programação comum, Hum, Estas são algumas das ferramentas críticas que você precisará usar. Estou de volta. para construir sistemas distribuídos.

[22:50] Outro grande tópico que surge em todos os artigos sobre os quais vamos falar é desempenho. Obrigado. Tchau. Obrigado. Obrigado. Hum, Normalmente o objetivo de alto nível de construir um sistema distribuído é obter o que as pessoas chamam de aceleração escalável. Então vamos buscar escalabilidade. E o que quero dizer com escalabilidade ou aceleração escalável é que Se eu tenho algum problema que estou resolvendo com um computador, e compro um segundo computador para me ajudar a executar meu problema.

[23:30] Se agora posso resolver o problema na metade do tempo, ou talvez resolver o dobro de instâncias do problema. você sabe, por minuto. em dois computadores como eu tinha em um, então Isso é um exemplo de escalabilidade. Mais ou menos. duas vezes os computadores ou recursos, hum, me dá duas vezes o desempenho ou throughput. E este é um martelo enorme. Se você puder construir um sistema que realmente tenha esse comportamento, Ou seja, que Se você aumentar o número de computadores que você joga no problema por algum fator, Você obtém esse fator, mais throughput, mais desempenho.

[24:14] fora do sistema. Isso é um enorme ganho. Porque Você pode comprar computadores apenas com dinheiro. Certo? Enquanto que se, para obter a alternativa a isso, Hum, é que para obter mais desempenho, você tem que pagar programadores para reestruturar seu software para obter melhor desempenho, para torná-lo mais eficiente, para aplicar algum tipo de técnicas especializadas, melhores algoritmos ou algo assim. Se você tem que pagar programadores, para consertar seu código para ser mais rápido.

[24:44] uma maneira cara de seguir. Adoraríamos poder simplesmente, ah, comprar mil computadores em vez de 10 computadores e obter Você sabe, 100 vezes mais throughput. Isso é fantástico. E então esse tipo de ideia de escalabilidade é uma ideia enorme no fundo da cabeça das pessoas quando elas estão construindo coisas como grandes sites que rodam em um você sabe, prédio cheio de computadores. Se o prédio cheio de computadores está lá para obter uma quantidade correspondente de desempenho de dados. você tem que ter cuidado com o design para realmente obter esse desempenho. Hum, Então, muitas vezes a forma como isso aparece quando estamos olhando diagramas ou escrevendo diagramas neste curso é que Isso é supondo que estamos construindo um site.

[25:26] Normalmente, você pode ter um site que você sabe, tem um servidor HTTP, ou digamos que tem alguns tem alguns usuários. hum, executando navegadores web, E eles conversam com... você sabe, servidor web rodando Python ou PHP ou qualquer coisa, Tipo de servidor web. E o servidor web conversa com algum tipo de banco de dados. Hum, Você sabe, quando você tem um ou dois usuários, tem um computador rodando ambos, ou talvez um computador para o servidor web e um computador para o banco de dados, Talvez de repente você fique realmente popular e você Você sabe, 100 milhões de pessoas se inscrevem no seu serviço.

[26:10] Certo? Como você... Não. Como você conserta seu-- você certamente não pode-- suportar milhões de pessoas em um único computador, Hum, exceto por otimização extremamente cuidadosa e intensiva em mão de obra. Hum, mas você não tem tempo para isso. Então, Tipicamente a maneira como você vai acelerar as coisas, a primeira coisa que você faz é comprar mais servidores web e simplesmente dividir os usuários para que você saiba, metade dos seus usuários ou alguma fração dos usuários vá para o servidor web um e a outra metade Você os envia para o servidor web dois.

[26:40] e porque talvez você esteja construindo não sei o quê, Reddit ou algo assim, onde todos os usuários precisam ver os mesmos dados no final, você tem todos os servidores web conversando com o back end. E talvez você possa continuar adicionando servidores web por muito tempo aqui. Obrigado. Hum, obrigado. E então esta é uma forma de obter aceleração paralela no código do servidor web. Sabe, se você estiver rodando PHP ou Python, talvez não seja muito eficiente. Hum, desde que cada servidor web individual não coloque muita carga no banco de dados, você pode adicionar muitos servidores web.

[27:13] antes de você ter problemas. Mas esse tipo de escalabilidade raramente é infinita, infelizmente. Hum, certamente não sem uma reflexão séria. E então o que tende a acontecer com esses sistemas é que em algum momento depois que você tem 10 ou 20 ou 100 servidores web todos conversando com o mesmo banco de dados, de repente o banco de dados começa a ser um gargalo. e adicionar mais servidores web não ajuda mais. Então é raro que você obtenha escalabilidade total através de números infinitos de adicionar números infinitos de computadores.

[27:45] Em algum momento você fica sem combustível porque o lugar onde você está adicionando mais computadores não é mais o gargalo. tendo muitos e muitos servidores web, basicamente movemos o gargalo Hum, acho que está limitando o desempenho dos servidores web para o banco de dados. Hum, e neste ponto, na verdade, você quase certamente tem que fazer um pouco de trabalho de design. porque é raro que você possa pegar, que haja alguma maneira direta de pegar um único banco de dados e meio que refatorar as coisas. com ele para. você pode pegar dados organizados em um único banco de dados e refatorá-los para que sejam divididos em vários bancos de dados.

[28:21] Hum, mas muitas vezes é bastante trabalho. e porque é complicado, mas muitas pessoas na verdade precisam fazer isso. Hum, vamos ver muitos exemplos neste curso em que o sistema distribuído do qual as pessoas falam é um sistema de armazenamento. porque os autores estavam executando sabe, algo como um grande site que ficou sem combustível em um único banco de dados ou servidores de armazenamento. Hum, de qualquer forma, então a história da escalabilidade é que adoramos construir sistemas que escalam dessa forma, mas hum você sabe que é difícil fazer isso, ou requer trabalho muitas vezes, trabalho de design, levar essa ideia infinitamente longe.

[29:04] Amém. Obrigado. Obrigado. Certo, então. Outro grande tópico que surge muito é tolerância a falhas. Obrigado. . Se você está construindo um sistema com um único computador nele, bem, um único computador muitas vezes pode ficar no ar por anos. Tipo, eu tenho servidores no meu escritório que estão no ar há anos sem travar. Hum, sabe, o computador é bem confiável, o sistema operacional é bem confiável, aparentemente a energia no meu prédio é bem confiável. Então não é incomum ter computadores únicos que simplesmente ficam no ar por quantidades surpreendentes de tempo.

[29:44] No entanto, se você está construindo sistemas com milhares de computadores, então mesmo que cada computador possa se esperar que fique no ar por um ano, com mil computadores isso significa que você vai ter cerca de três falhas de computador por dia. E no seu conjunto de computadores. resolver grandes problemas com grandes sistemas distribuídos transforma tolerância a falhas muito rara, problemas de falha muito raros, em problemas de falha que acontecem o tempo todo. Em um sistema com mil computadores, quase certamente sempre há algo quebrado. Sempre há algum computador que travou ou está misteriosamente funcionando incorretamente ou lentamente ou fazendo a coisa errada.

[30:25] Ou talvez haja alguma parte da rede, tipo com mil computadores, temos muitos cabos de rede. e muitos switches de rede. Sabe, sempre há algum cabo de rede que alguém pisou e está com falha, ou cabo de rede que caiu, ou algum switch de rede cujo ventilador quebrou e o switch superaqueceu e falhou. Sempre há algum probleminha em algum lugar no seu sistema distribuído do tamanho de um prédio. Então a grande escala transforma problemas de eventos muito raros, com os quais você realmente não precisa se preocupar muito, em problemas constantes.

[30:57] A... falha tem que ser realmente, ou a resposta, a ocultação de falhas, a capacidade de perceber falhas só precisa estar embutida no design. porque sempre há falhas. Hum... E, sabe, como parte de construir, sabe, abstrações convenientes para programadores de aplicativos, nós realmente precisamos ser capazes de construir infraestrutura que, tanto quanto possível, esconda as falhas dos programadores de aplicativos ou as mascare ou algo assim. para que todo programador de aplicativo não precise ter uma história completa e complicada para todos os diferentes tipos de falhas que podem ocorrer.

[31:32] Hum, há várias noções diferentes que você pode ter sobre o que significa ser tolerante a falhas. sobre um pouco mais. mas exatamente o que queremos dizer com isso. E veremos muitos sabores diferentes, mas entre as ideias mais comuns que você vê, uma é disponibilidade. Obrigado. Amém. Então, sabe, alguns sistemas são projetados para que, sob certos tipos de falhas, não todas as falhas, mas certos tipos de falhas, o sistema continue operando apesar da falha enquanto fornece serviço intacto.

[32:15] Uh, o mesmo tipo de serviço que teria fornecido, mesmo se não tivesse havido falha. Então alguns sistemas estão disponíveis nesse sentido, então se você constrói um serviço replicado que talvez tenha duas cópias, sabe, se um dos servidores réplica falhar, talvez o outro servidor possa continuar operando. Ambos falham, é claro, você não pode. Sabe, você não pode prometer. Hum. disponibilidade nesse caso. Então sistemas disponíveis geralmente dizem, bem, sob um certo conjunto de falhas, vamos continuar fornecendo serviço. Vamos estar disponíveis.

[32:48] Mais falhas do que isso ocorrem. Não estará mais disponível. Obrigado. Outro tipo de tolerância a falhas que você pode... que você pode ter ou além da disponibilidade ou por si só é a recuperabilidade. Obrigado. Obrigado. Obrigado. E o que isso significa é que se algo der errado, talvez o serviço pare de funcionar. Ou seja, ele simplesmente para de responder a solicitações, Hum, e vai esperar que alguém venha e conserte o que quer que tenha dado errado, mas depois que o conserto ocorrer, o sistema será capaz de continuar como se nada de ruim tivesse acontecido.

[33:23] Então este é um requisito mais fraco que a disponibilidade, porque aqui não vamos fazer nada até que o componente com falha tenha sido consertado, Mas o fato de que podemos voltar a funcionar sem, sabe, mas... sem qualquer perda de correção, ainda é um requisito significativo. Isso significa, sabe, sistemas recuperáveis tipicamente precisam fazer coisas como salvar seus dados mais recentes em disco ou algo onde possam recuperá-los, sabe, depois que a energia voltar. Hum, e mesmo entre sistemas disponíveis, para que um sistema seja útil na vida real, geralmente a maneira como os sistemas disponíveis são especificados é que eles estão disponíveis até que algum número de falhas tenha acontecido. Se muitas falhas aconteceram, um sistema disponível parará de funcionar ou parará de responder completamente, Mas quando coisas suficientes tiverem sido consertadas, ele continuará operando. Então um bom sistema disponível será meio que recuperável também no sentido de que se muitas falhas ocorrerem,

[34:26] hum Ele parará de responder, mas depois continuará corretamente depois disso. Hum, então é isso que adoramos ouvir. É isso que gostaríamos de obter. O maior martelo, veremos várias abordagens para resolver esses problemas. Eu disse, meio que duas coisas que são as ferramentas mais importantes que temos neste departamento. Uma é armazenamento não volátil. para que, sabe, algo travou, a energia falhou, ou qualquer coisa, talvez haja uma falha de energia no prédio inteiro. Podemos usar armazenamento não volátil como discos rígidos ou flash ou unidades de estado sólido ou algo para meio que armazenar um checkpoint ou um log do estado do sistema e então quando a energia voltar ou alguém consertar nossa fonte de alimentação, quem sabe o quê, poderemos ler nosso estado mais recente do disco rígido e continuar a partir daí.

[35:22] Então. Então uma ferramenta é meio que armazenamento não volátil. E o gerenciamento de armazenamento não volátil é algo que surge muito, porque armazenamento não volátil tende a ser caro de atualizar. E então uma enorme quantidade do tipo de detalhes minuciosos de construir sistemas tolerantes a falhas de alto desempenho está em maneiras inteligentes de evitar ter que escrever no armazenamento não volátil demais. Nos velhos tempos e até hoje, sabe, o que escrever em armazenamento não volátil significava era mover um braço de disco e esperar que um prato de disco girasse.

[35:58] ambos os quais são agonizantemente lentos. na escala de, sabe, microprocessadores de 3 gigahertz. Com coisas como flash. A vida é bem melhor, mas ainda requer muita reflexão para obter bom desempenho disso. E a outra grande ferramenta que temos para tolerância a falhas é a replicação. Obrigado. e o gerenciamento de cópias replicadas é meio complicado. Sabe, esse tipo de problema à espreita em qualquer sistema replicado onde temos dois servidores cada um com uma cópia supostamente idêntica do estado do sistema.

[36:32] Hum, o problema chave que surge é sempre que as duas réplicas acidentalmente se desviam e param de ser réplicas. E isso é apenas-- sabe, no fundo de todo design que vamos ver para usar replicação para obter tolerância a falhas. E o Lab 2, e é sobre isso que vocês todos estão. gerenciamento de cópias replicadas para tolerância a falhas. Hum. Como vocês verão, é bem complexo. Hum, um tópico final, tópico transversal final, hum, é consistência.

[37:11] Obrigado. Obrigado. Então, como exemplo do que quero dizer com consistência, suponhamos que estamos construindo um sistema de armazenamento distribuído e é um serviço de chave-valor, então ele apenas suporta. duas operações, talvez haja uma operação put, e você dá a ela uma chave, e um valor, e o sistema de armazenamento meio que guarda o valor como o valor para esta chave, então ele mantém apenas uma grande tabela de chaves e valores. E então há uma operação get. o cliente envia a ela uma chave e o serviço de armazenamento deve responder com o valor que está armazenado para aquela chave.

[37:51] E isso é meio que o Quando não consigo pensar em nada else como exemplo de um sistema distribuído, eu saco hum, serviços de chave-valor. E eles são muito úteis, certo? Eles são apenas meio que a versão fundamental Hum, simples de um sistema de armazenamento. Então. Claro que se você é um programador de aplicativos. É útil se... Essas duas operações meio que têm significados anexados a elas. Você pode ir olhar no manual e o manual diz, sabe, o que significa, o que você receberá de volta se chamar get.

[38:23] certo, e meio que o que significa para você chamar put. Então seria ótimo se houvesse algum tipo de especificação para o que elas significavam, caso contrário, tipo, Como você pode possivelmente escrever um aplicativo sem uma descrição do que Pudding getters devem fazer. Hum, e este é o tópico da consistência. E a razão pela qual é interessante em sistemas distribuídos é que Hum. tanto por razões de desempenho quanto de tolerância a falhas, razão de tolerância a falhas, muitas vezes temos mais de uma cópia dos dados flutuando por aí. Então, sabe, em um sistema não distribuído onde você tem apenas um único servidor com uma única tabela, muitas vezes há, embora nem sempre.

[39:02] Muitas vezes não há relativamente ambiguidade sobre o que put e get podem significar intuitivamente. Você sabe, o que put significa é atualizar a tabela, e o que get significa é apenas, me dê a versão que está armazenada na tabela. Hum, mas em um sistema distribuído, onde há mais de uma cópia dos dados, devido a replicação ou cache ou quem sabe o quê? Pode haver muitas versões diferentes desse par chave-valor circulando. Como se uma das réplicas, você sabe, suponha que algum cliente emita um put, e você sabe, há-- duas cópias do servidor, então ambos têm uma tabela de chave-valor.

[39:46] Certo, e talvez a chave um tenha valor 20 em ambos. Obrigado. e então algum cliente emite um put. Temos um cliente aqui. e ele vai enviar um put, quer atualizar o valor de um para ser 21. Talvez esteja contando coisas neste servidor de chave-valor, então envia um put Obrigado. com chave um e valor 21, envia para o primeiro servidor e está prestes a enviar O mesmo, você sabe, quer atualizar ambas as cópias, certo?

[40:19] Mantém eles em sincronia. Está prestes a enviar este put, mas pouco antes de enviar o put para o segundo servidor, ele falha. falha de energia, bug no sistema operacional ou algo assim. Então agora o estado em que ficamos, infelizmente, é que enviamos este put e então atualizamos uma das duas réplicas para ter valor 21, mas a outra ainda está com 20. Agora alguém aparece e lê com um "get" E eles podem obter... Eles querem... Ler o valor associado à chave um, eles podem obter 21 ou podem obter 20, dependendo de com quem falam. E mesmo se a regra for você sempre fala com o servidor de cima primeiro, Se você está construindo um sistema de tolerância a falhas, a regra real tem que ser Ah, você fala com o servidor de cima primeiro, a menos que ele tenha falhado, caso em que você fala com o servidor de baixo.

[41:00] Hum, Então de qualquer forma, algum dia você corre o risco de expor esta cópia obsoleta dos dados. para algum get futuro. Pode ser que muitos gets obtenham o 21 atualizado e então Como na próxima semana, de repente, algum get produza, você sabe, uma cópia de uma semana atrás dos dados. Então isso não é muito consistente. Certo? em ordem, mas você sabe, é o tipo de coisa que poderia acontecer. Certo? e não somos cuidadosos. Precisamos realmente escrever quais serão as regras sobre puts e gets dado este perigo devido à replicação.

[41:37] E acontece que há muitas definições diferentes de consistência que você pode ter. Hum, Muitas delas são relativamente diretas. Muitas delas soam como, bem, eu get produz o você sabe, valor put pelo put concluído mais recentemente. Certo. E então isso geralmente é chamado de consistência forte. Acontece também que é muito útil construir sistemas que tenham consistência muito mais fraca. Que, por exemplo, não garantem nada como eu get.

[42:11] vê o valor escrito pelo put mais recente. E a razão, então há sistemas fortemente consistentes - - Eles geralmente têm alguma versão de get vendo os puts mais recentes. Acho que você tem que... Há muitos detalhes a resolver. Há também consistência fraca, muitos tipos de sistemas fracamente consistentes que não fazem tal garantia. sobre isso. e pode garantir a você bem, você sabe, se alguém faz um put, então você pode não ver o put. Você pode ver valores antigos que não foram atualizados pelo put por um período de tempo ilimitado, talvez.

[42:47] Hum, E a razão para-- as pessoas estarem muito interessadas em esquemas de consistência fraca. é que Consistência forte, isto é, ter RIS realmente veja, tenha garantia de ver o mais recente certo. Essa é uma especificação muito cara de implementar. hum porque o que significa é quase certamente que você tem que, alguém tem que fazer muita comunicação para, realmente implementar. alguma noção de consistência forte. Se você tem múltiplas cópias, Hum, Isso significa que ou o escritor ou o leitor, ou talvez ambos, tem que consultar cada cópia. Como neste caso, hum onde talvez um cliente falhou, deixou uma atualizada, mas não a outra.

[43:29] Se quiséssemos implementar consistência forte de uma maneira simples neste sistema, faríamos os leitores lerem ambas as cópias ou, se houver mais de uma cópia, todas as cópias. e usar o valor escrito mais recentemente que encontrarem. Hum. mas isso é caro. Isso é muita conversa. para ler um valor. Então, para evitar comunicação o máximo possível, Hum. particularmente se as réplicas estiverem longe, as pessoas constroem sistemas fracos que podem na verdade permitir a leitura obsoleta de um valor antigo neste caso.

[44:01] Hum, embora muitas vezes haja mais semântica anexada a isso para tentar tornar esses esquemas fracos. E onde este problema de comunicação, você sabe, consistência forte. exigindo comunicação cara. Onde isso realmente te coloca em apuros é que, Se estamos usando replicação para tolerância a falhas, então Nós realmente queremos que as réplicas tenham probabilidade de falha independente, tenham falha não correlacionada. Então, por exemplo, colocar ambas as réplicas dos nossos dados no mesmo rack, na mesma sala de máquinas, é provavelmente uma péssima ideia.

[44:38] porque se alguém tropeçar no cabo de energia daquele rack, ambas as nossas cópias dos nossos dados vão morrer. Porque ambas estão conectadas ao mesmo cabo de energia no mesmo rack. Hum, Então na busca por tornar as réplicas o mais independentes possível em falhas para obter uma tolerância a falhas decente, As pessoas adorariam colocar réplicas diferentes o mais longe possível, como em cidades diferentes. ou talvez em lados opostos do continente. Então um terremoto que destrói um data center será extremamente improvável que também destrua O outro data center que tem a outra cópia.

[45:13] Hum, Você sabe, então adoraríamos poder fazer isso. Se você fizer isso, então a outra cópia está a milhares de quilômetros de distância, E a velocidade com que a luz viaja significa que pode levar na ordem de milissegundos ou dezenas de milissegundos para comunicar a um data center do outro lado do continente para atualizar a outra cópia dos dados. E então isso torna esta A comunicação necessária para consistência forte, para boa consistência, potencialmente extremamente cara. Como toda vez que você quer fazer uma dessas operações put, ou talvez um get, dependendo de como você implementa, Você pode ter que ficar lá esperando por tipo 10 ou 20 ou 30 milissegundos para falar com ambas as cópias dos dados para garantir que ambas estão atualizadas ou ambas verificadas.

[45:57] para encontrar a cópia mais recente. Hum, E Essa despesa tremenda, certo? Isso é 10 ou 20 ou 30 milissegundos em máquinas que, afinal, executarão tipo um bilhão de instruções por segundo. Então estamos desperdiçando muitas instruções potenciais enquanto esperamos. As pessoas frequentemente constroem sistemas muito mais fracos. Você tem permissão para atualizar apenas a cópia mais próxima ou consultar apenas a cópia mais próxima. Agora, quero dizer, há uma enorme quantidade de pesquisa acadêmica e do mundo real. sobre como estruturar garantias de consistência fraca para que sejam realmente úteis para aplicações e como tirar vantagem delas para realmente obter alto desempenho.

[46:35] Obrigado. Certo, então essa é uma prévia relâmpago das... ideias técnicas do curso. Alguma pergunta sobre isso? antes de eu começar a falar sobre MapReduce. Certo, quero mudar para MapReduce. Esse é um tipo de estudo de caso detalhado que na verdade vai ilustrar a maioria das ideias. que estivemos falando aqui. E que produz um sistema que foi Uh...

[47:06] originalmente projetado e construído e usado pelo Google, acho que o artigo data de 2004. O problema que eles enfrentavam era que estavam executando computações enormes em terabytes e terabytes de dados. criando um índice de todo o conteúdo da web ou analisando a estrutura de links de toda a web para identificar as páginas mais importantes ou as páginas mais autoritativas.

[47:36] E então, você sabe, toda a web era-- mesmo naqueles dias dezenas de terabytes de dados. Hum... Construir um índice da web é basicamente equivalente a uma espécie de ordenação de toda a dados. Ordenar, você sabe, é tipo... razoavelmente caro. e executar uma ordenação em todo o conteúdo da web em um único computador eu não sei quanto tempo teria levado, mas você sabe, semanas ou meses ou anos ou algo assim. Então, o Google na época estava desesperado para poder executar computações gigantes em dados gigantes em milhares de computadores.

[48:09] para que as computações pudessem terminar rapidamente. Valia a pena para eles comprar muitos computadores para que seus engenheiros não tivessem que passar muito tempo lendo o jornal ou algo assim esperando seus grandes trabalhos de computação terminarem. Hum... E então por um tempo, eles tinham seus engenheiros espertos meio que escrevendo à mão, você sabe, se você precisasse escrever um indexador web ou algum tipo de ferramenta de análise de links, links web. você sabe, o Google comprava os computadores e dizia: "Aqui, engenheiros, você sabe, executem o software que quiserem nestes computadores."

[48:40] eles laboriosamente escreviam o tipo de software único escrito manualmente para pegar qualquer problema que estivessem trabalhando e de alguma forma distribuí-lo para muitos computadores e organizar essa computação e obter os dados de volta. Hum, Se você só contrata engenheiros que são especialistas experientes em sistemas distribuídos, Talvez isso seja ok, embora mesmo assim, provavelmente seja muito desperdício de esforço de engenharia. Mas eles queriam contratar pessoas que fossem habilidosas em outra coisa. Hum, E não necessariamente...

[49:13] Hum... engenheiros que queriam passar todo o tempo escrevendo software de sistema distribuído. Então eles realmente precisavam de algum tipo de framework que tornasse fácil apenas, ter seus engenheiros Certo? o tipo de núcleo de qualquer análise que quisessem fazer, como algoritmo de ordenação ou índice web ou analisador de links ou qualquer coisa. Apenas escrever o núcleo dessa aplicação e não executar, poder executá-la em milhares de computadores. hum sem se preocupar com os detalhes de como espalhar o trabalho pelos milhares de computadores, como organizar qualquer movimento de dados necessário, como lidar com as falhas inevitáveis.

[49:49] Então eles estavam procurando um framework que tornasse fácil para não especialistas poderem escrever e executar computações distribuídas gigantes. Hum, E então é disso que se trata o MapReduce. Amém. E a ideia é que o programador apenas escreva o projetista da aplicação, consumidor desta computação distribuída e apenas consiga escrever uma função map simples e uma função reduce simples, Certo. não sabe nada sobre distribuição. e o framework MapReduce cuidaria de todo o resto.

[50:23] Hum, Então uma visão abstrata do que o MapReduce faz é Começa assumindo que há alguma entrada e a entrada é dividida em um monte de arquivos ou pedaços diferentes de alguma forma. Estamos imaginando que Você sabe, Temos arquivo de entrada um, arquivo de entrada dois, arquivo de entrada três, Etc. Você sabe, e essas entradas são talvez Ajuda.

[50:53] páginas web rastreadas da web ou mais provavelmente tipos de grandes arquivos que contêm muitos arquivos web--cada um dos quais contém muitos arquivos web. rastreados da web. Certo, e a maneira como o MapReduce começa é que você define uma função map e o framework MapReduce vai executar sua função map em cada um dos arquivos de entrada. você Obrigado. E claro você pode ver aqui que há algum paralelismo óbvio disponível.

[51:25] pode executar os maps em paralelo. Então cada uma dessas funções map olha apenas para sua entrada e produz saída. A saída que uma função map deve produzir é uma lista. Recebe um arquivo como entrada e um arquivo como alguma fração dos dados de entrada, e produz uma lista de pares chave-valor como saída. a função map. E então, por exemplo, vamos supor que estamos escrevendo o exemplo MapReduce mais simples possível, um trabalho MapReduce de contagem de palavras, cujo objetivo é contar o número de ocorrências de cada palavra.

[51:59] Então sua função map pode emitir pares chave-valor, onde a chave é a palavra e o valor é apenas um. Então, para cada palavra que vê, essa função map vai dividir a entrada em palavras. Para cada palavra que vê, ela emite essa palavra como chave e um como valor. E depois vamos contar todos esses uns para obter a saída final. A entrada um tem a palavra A nela e a palavra B nela. E então a saída que o map vai produzir é chave A valor 1, chave B valor 1.

[52:32] Talvez a segunda indicação de map veja um arquivo que tem um a b nele e nada mais, então vai emitir B1. Talvez esta terceira entrada tenha um A nela e um C nela. Certo, então executamos todos esses maps em todos os arquivos de entrada. E obtemos esta saída intermediária, o que o artigo chama de saída intermediária, que é para cada map, um conjunto de pares chave-valor como saída. Então a segunda etapa da computação é executar os reduces.

[53:04] Obrigado. Hum, e a ideia é que o framework MapReduce coleta todas as instâncias de todos os maps de cada palavra-chave. Então o framework MapReduce vai coletar todos os A's, você sabe, de cada map, cada par chave-valor cuja chave era A, ele vai pegar, coletar todos eles e entregá-los a *batendo* uma chamada da função reduce definida pelo programador. E então vai pegar todos os B's e coletá-los juntos. Claro, isso requer coleta real porque diferentes instâncias da chave B foram produzidas por diferentes indicações de map em computadores diferentes. Então não estamos falando de movimento de dados.

[53:50] Então vamos coletar todas as chaves B e entregá-las a uma chamada diferente de reduce que tem todas as chaves B como seus argumentos, e o mesmo com C, todos os C's. Então isso vai ser o framework MapReduce vai organizar uma chamada para reduce para cada chave que ocorreu em qualquer uma das saídas do map. Hum, e para nosso exemplo meio bobo de contagem de palavras, todos esses reduces têm que fazer, ou qualquer um deles tem que fazer, é apenas contar o número de itens passados a ele. Nem precisa olhar os itens porque sabe que cada um deles é—a palavra é responsável por mais um como valor. Você não precisa olhar esses uns, apenas os contamos. Então este reduce vai produzir Hum, A e então a contagem.

[54:43] De suas entradas, este reduce. Vai produzir a chave associada a ele e então a contagem de seus valores, que também é dois. Obrigado. Obrigado. Obrigado. Então é assim que um típico... trabalho MapReduce se parece. O nível alto. Apenas por completude, o—desculpe. Bem, um pouco de terminologia. A computação inteira é chamada de job. Qualquer invocação de map ou reduce é chamada de task. Então temos um job inteiro e ele é composto por um monte de tarefas map.

[55:21] e então um monte de tarefas reduce. Hum... Então um exemplo para esta contagem de palavras, você sabe, como seriam as funções map e reduce. Obrigado. Obrigado. Hum... Obrigado. Obrigado. A função map recebe uma chave e um valor como argumentos. E agora estamos falando de funções escritas em uma linguagem de programação comum como C++ ou Java ou sei lá o quê.

[55:52] hum Então isso é apenas código que pessoas comuns podem escrever. O que uma função map para contagem de palavras faria é dividir a chave é o nome do arquivo, que tipicamente é ignorado, não nos importamos realmente qual era o nome do arquivo. E o V é o conteúdo do "arquivo de entrada deste map". Então V apenas contém todo este texto. Vamos dividir V em palavras. Obrigado. Obrigado. E então para cada palavra, Obrigado.

[56:24] *batendo* *batendo* *batendo* Vamos apenas emitir. E emit recebe dois argumentos. Chamadas de emit só o map pode fazer, e emit é fornecido pelo framework MapReduce. Podemos produzir, entregamos ao emit uma chave, que é a palavra... e um valor que é a string um. Então é isso para a função map. Uma função map de contagem de palavras no MapReduce poderia literalmente ser tão simples quanto isso.

[56:56] Hum, então. a espécie de promessa deles de fazer o E, você sabe, esta função map não sabe nada sobre distribuição ou múltiplos computadores, o fato de precisarmos mover dados pela rede, ou sei lá o quê. Isso é extremamente... direto. E a função reduce para... contagem de palavras, hum. O reduce é chamado com Lembre-se de que cada reduce é chamado com uma espécie de todas as instâncias de uma dada chave; no framework MapReduce, chama reduce com a chave pela qual é responsável e um vetor de todos os valores que os maps produziram.

[57:35] associados a essa chave. A chave é a palavra, os valores são todos uns, não nos importamos realmente com eles, só nos importamos com quantos havia. hum. E então, reduce tem sua própria função emit que apenas recebe um valor a ser emitido como saída final. como o valor para esta chave. Então vamos emitir o comprimento. Obrigado. deste array. Obrigado. Então isso também é tão simples quanto funções reduce são. no MapReduce, ou seja, Extremamente simples.

[58:08] e não exigindo nenhum conhecimento sobre tolerância a falhas ou qualquer outra coisa? Certo, alguma pergunta sobre... O framework básico, sim. e não... necessário mas isso pode retornar algo. Estou nisso. Tipo França, França, França. usando o framework MapReduce que talvez seja reduce com acesso. esse passo algum número de vezes. Você quer dizer que você pode alimentar a saída dos reduces meio que— Sim.

[58:43] Obrigado. Oh, sim. Oh sim, na vida real, certo. Na vida real, é rotina entre usuários de MapReduce, você sabe, definir um job MapReduce que recebe algumas entradas e produz algumas saídas e então ter um segundo job MapReduce, você sabe, se você está fazendo alguma análise multi-estágio muito complicada. ou algoritmo iterativo. como PageRank, por exemplo, que é o algoritmo que o Google usa para meio que estimar quão importante ou influente diferentes páginas web são. Esse é um algoritmo iterativo que meio que converge gradualmente para uma resposta. E se você implementar um MapReduce, o que eu acho que eles originalmente fizeram, você tem que executar o job MapReduce múltiplas vezes.

[59:28] A saída de cada um é meio que— você sabe, lista de páginas web, com um valor ou peso ou importância atualizado para cada página web. Então era rotina pegar essa saída e então usá-la como entrada para outro job MapReduce. Não podemos fazer isso para sempre. Ah sim. é. todas as lágrimas "Bem, sim, você precisa meio que configurar as coisas a saída, você precisa— a função reduce meio que com o conhecimento disso.

[1:00:00] Atender a produzir. dados que estão no formato ou têm a informação necessária para o próximo job MapReduce. Quer dizer, isso na verdade traz à tona uma pequena deficiência no framework MapReduce, que é, é ótimo. se você está Obrigado. se o algoritmo que você precisa executar é facilmente expressável como um map seguido por esse tipo de "embaralhamento dos dados por chave, seguido por um reduce, e é isso." MapReduce é fantástico para algoritmos que podem ser moldados nessa forma.

[1:00:30] E além disso, cada um dos maps tem que ser completamente independente. exigido ser uh... funcionais, funções puramente funcionais que apenas olham seus argumentos e nada mais. E você sabe, isso é tipo, é uma restrição. E acontece que muitas pessoas querem executar pipelines muito mais longos que envolvem muitos e muitos tipos diferentes de processamento. E com MapReduce, você tem que meio que remendar isso a partir de múltiplos—e MapReduce. jobs distintos produzidos por map. e sistemas mais avançados, que falaremos mais tarde no curso, são muito melhores em permitir que você especifique o pipeline completo de computações, e eles farão otimização.

[1:01:09] o framework percebe todas as coisas que você tem que fazer. organizar muito mais complicado eficientemente. otimizar, muito mais complicado. Computação. Sua pergunta. Então no artigo, eles distinguem entre mappers e funções map. Eu acho que esse é o— tipo os processos que estão executando o map. Quais são os... e acolhem os processos que estão— Do ponto de vista do programador, é só sobre map e reduce.

[1:01:43] Do nosso ponto de vista, vai ser sobre os processos worker. e os servidores worker que fazem parte do framework MapReduce, entre muitas outras coisas. chamá-los de funções produzidas. Então— hum Sim, do nosso ponto de vista, nos importamos muito com como isso é organizado pelo framework circundante. Esta é meio que a visão do programador com toda a parte distribuída removida. Hum. Sim? Obrigado. Desculpe, eu tenho que...

[1:02:21] Diga de novo. Desculpe, você emite localmente? Oh, você quer dizer para onde vão os dados emitidos? Obrigado. Ok, então há duas perguntas. Uma é... Quando você chama emit, o que acontece com os dados? e a outra é onde as funções rodam. Então, Obrigado. Hum. A resposta real é que Primeiro, onde as coisas rodam? Há um número de, digamos, mil servidores. Na verdade, a coisa certa a olhar aqui é a figura um no artigo.

[1:02:59] Hum, embora por baixo disso no mundo real, haja alguma grande coleção de servidores. E Hum. Vamos chamá-los talvez de servidores worker ou workers. E. Há também um único servidor master que está organizando toda a computação. E o que está acontecendo aqui é que o servidor master sabe que há algum número de arquivos de entrada, você sabe, 5,000 arquivos de entrada. e ele distribui invocações de map para os diferentes workers. Então ele enviará uma mensagem para o worker sete dizendo, por favor execute esta função map em tal e tal arquivo de entrada.

[1:03:39] E então a função worker que é, você sabe, parte do MapReduce e sabe tudo sobre MapReduce, bem então, Hum, Ler o arquivo, ler a entrada, tanto faz, qualquer que seja o arquivo de entrada. e chamar esta função map com o nome do arquivo e valor como argumentos. do que aquele processo worker. é o que implementa emit. E toda vez que o map chama emit, O processo worker. vai escrever esses dados em arquivos no disco local.

[1:04:11] Então o que acontece com os emits do map? é que eles produzem arquivos no disco local do worker do map que estão acumulando todas as chaves e valores produzidos pelo map executado naquele worker. hum Então no final da fase map, O que nos resta é todas aquelas máquinas worker Cada uma das quais tem a saída de alguns dos maps que foram executados naquela máquina worker. Então os workers do MapReduce organizam a movimentação dos dados para onde serão necessários para os reduces e já que eu E uma computação grande típica Essa sincronização de reduce vai precisar de toda a saída de map que mencionou a chave A, mas vai acabar que, você sabe, este é um exemplo meio simples, mas provavelmente, Em geral, cada invocação de map produzirá muitas chaves, incluindo algumas instâncias da chave A.

[1:05:13] Então tipicamente, em ordem, antes de podermos sequer executar esta função reduce, o framework MapReduce, ou seja, o worker MapReduce rodando em um dos nossos mil servidores, vai ter que ir falar com cada um dos outros mil servidores e dizer: "Olha, eu vou executar o reduce para a chave A, por favor. Olhe para a saída intermediária do map armazenada no seu disco e pesque todas as instâncias da chave A e envie-as pela rede para mim." Então o worker do reduce vai fazer isso. Vai buscar de cada worker.

[1:05:44] todas as instâncias da chave pela qual é responsável, que o master lhe disse para ser responsável. E uma vez que tenha coletado todos esses dados, então pode chamar reduce. E a própria função reduce chama reduce emit, que é diferente do emit do map. O que o emit do reduce faz é escrever a saída em um arquivo. em um serviço de arquivos de cluster que o Google usa. Então aqui está algo que eu não mencionei.

[1:06:15] Hum, eu não mencionei onde a entrada fica. e onde a saída fica. Ambas são vials. Hum, porque qualquer pedaço de entrada Nós queremos a flexibilidade de poder ler qualquer pedaço de entrada em qualquer servidor trabalhador. Isso significa que precisamos de algum tipo de sistema de arquivos de rede para armazenar os dados de entrada. Hum, E então de fato, o artigo fala sobre essa coisa chamada GFS, de Google File System.

[1:06:48] Hum, E o GFS é um sistema de arquivos de cluster. E o GFS na verdade roda exatamente no mesmo conjunto de servidores trabalhadores que rodam o MapReduce. E a entrada GFS apenas automaticamente, quando você, sabe, é um sistema de arquivos, você pode ler e escrever arquivos. ele apenas automaticamente divide qualquer arquivo grande que você armazena nele. por muitos servidores em pedaços de 64 megabytes. Então se você escrever, se você tiver 10 terabytes de conteúdo de páginas web rastreadas. e você apenas escrevê-los no GFS, mesmo como um único arquivo grande, o GFS automaticamente dividirá essa vasta quantidade de dados em pedaços de 64 kilobytes distribuídos uniformemente por todos os servidores GFS, ou seja, todos os servidores que o Google tem disponíveis.

[1:07:32] E isso é fantástico, é exatamente o que precisamos. Se então quisermos executar um trabalho MapReduce que toma toda a web rastreada como entrada. os dados já estão armazenados de uma forma que é dividida uniformemente por todos os servidores. E então isso significa que hum os trabalhadores de map, você sabe, nós vamos lançar Se tivermos mil servidores, vamos lançar mil trabalhadores de map cada um lendo um milésimo dos dados de entrada. e eles poderão ler os dados em paralelo de mil servidores de arquivos GFS.

[1:08:02] Isso está obtendo... Uma tremenda taxa total. de leitura. você sabe, a taxa de leitura de mil servidores. Sim. Obrigado. executando o map. Então você está pensando que talvez o Google tenha um conjunto de máquinas físicas que rodam o GFS e um conjunto separado de máquinas físicas que rodam trabalhos MapReduce. dizendo que o Posso ter dois?

[1:08:37] Ok. Eles não são necessariamente. - Certo, então a pergunta é: o que é essa seta aqui? realmente envolve. Hum, E a resposta para isso na verdade meio que mudou ao longo dos anos à medida que o Google de todo esse sistema. Você sabe, com isso no caso mais geral, se tivermos arquivos grandes armazenados em algum sistema de arquivos de rede grande. Tipo, você sabe, é como o GFS é um pouco como o AFS. que você pode ter usado no Athena. onde você vai falar com alguma coleção, seus dados são divididos por, uma grande coleção de servidores, você tem que ir falar com esses servidores pela rede para recuperar seus dados.

[1:09:13] Hum, Nesse caso, o que essa seta pode representar é Obrigado. o map, o processo trabalhador do MapReduce tem que sair e falar pela rede com o servidor GFS correto ou talvez servidores. que armazenam sua parte da entrada. e buscá-la pela rede para a-- máquina trabalhadora do MapReduce a fim de passar o map. E esse é certamente o caso mais geral. E foi eventualmente como o MapReduce realmente funcionou. No mundo deste artigo, porém, E se você fizesse isso, isso é muita comunicação de rede.

[1:09:47] Você está falando de 10 terabytes de dados, e então temos que mover 10 terabytes pela rede do data center deles, o que... você sabe, redes de data center rodam a gigabits por segundo, mas ainda é muito tempo para mover. dezenas de terabytes de dados. Obrigado. a fim de tentar, e de fato no mundo deste artigo em 2004, O gargalo mais restritivo em seu sistema MapReduce era a taxa de transferência da rede. porque eles estavam rodando em uma rede, se você ler até a seção de avaliação. a rede deles, a rede deles era Hum...

[1:10:23] Eles tinham milhares de máquinas, sei lá, e eles coletavam máquinas, eles conectavam máquinas em, você sabe, cada rack de máquinas em, você sabe, um switch Ethernet para aquele rack ou algo assim. Mas então, você sabe, todas elas precisam falar umas com as outras. Mas havia um switch Ethernet raiz. com o qual todos os switches Ethernet de rack falam. E isso, e você sabe, então se você apenas escolher algum trabalhador MapReduce e algum servidor GFS as chances são de que pelo menos metade das vezes, a comunicação entre eles tenha que passar por esse único switch raiz. O switch raiz deles tinha apenas uma certa quantidade de taxa de transferência total, que eu esqueço, uh... você sabe, algum número de gigabits por segundo.

[1:11:07] hum De qualquer forma, eu esqueço o número, mas quando fiz a divisão, ou seja, dividi a taxa de transferência total disponível no switch raiz pelos aproximadamente 2,000 servidores que eles usaram nos experimentos do artigo. O que obtive foi que a parcela de cada máquina do switch raiz, ou da capacidade total da rede, era de apenas 50 megabits por segundo. na configuração deles. Legendas pela comunidade Amara.org Então 50 megabits por segundo por máquina.

[1:11:39] E isso pode parecer muito, 50 megabits, nossa, milhões e milhões. Mas na verdade é bem pequeno comparado à velocidade, digamos, dos discos ou das CPUs. E então isso, com a rede deles, esses 50 megabits por segundo eram um limite tremendo. Eles realmente se desdobraram no design descrito no artigo para evitar usar a rede. E eles usaram vários truques para evitar enviar coisas pela rede quando podiam evitar. Um deles foi Eles rodaram o GFS.

[1:12:12] servidores. e os trabalhadores do MapReduce no mesmo conjunto de máquinas. para que eles tenham mil máquinas Eles rodariam o GFS, eles implementam seu serviço GFS nessas mil máquinas e rodam o MapReduce nas mesmas mil máquinas. E então quando o mestre estava dividindo o trabalho de map e meio que distribuindo para diferentes trabalhadores, ele inteligentemente quando estava EU VOU PARA A PRÓXIMA PERGUNTA. prestes a executar o map. que ia ler do arquivo de entrada um, ele descobriria a partir do GFS qual servidor realmente mantém o arquivo de entrada um em seu disco local.

[1:12:50] E ele-- Enviar o map. para aquele arquivo de entrada para o software MapReduce na mesma máquina. de modo que, por padrão, essa seta é na verdade uma leitura local do disco local e não envolvia a rede. E você sabe, dependendo de falhas ou carga ou o que for, que nem sempre podiam fazer isso. Mas quase todos os maps seriam executados na mesma máquina que armazenava os dados, poupando assim uma vasta quantidade de tempo que de outra forma teriam que esperar para mover os dados de entrada pela rede.

[1:13:21] Hum, O próximo truque que eles usaram é que o map, como mencionei antes, armazena sua saída no disco local da máquina em que você executa o map. Então, novamente, armazenar a saída do map não requer comunicação de rede, pelo menos porque a saída é armazenada no disco. no entanto Nós sabemos com certeza que de uma forma ou de outra, para agrupar todos os da forma como o MapReduce é definido, Para agrupar todos os valores associados a uma determinada chave e passá-los em uma única invocação para produzir em alguma máquina, isso vai exigir comunicação de rede.

[1:13:59] Nós vamos--você sabe, nós queremos--nós precisamos--nós estamos Isso é todos os A's e dar a eles uma única máquina para ter que ser movidos pela rede. E então esse shuffle, esse movimento das chaves desse tipo, você sabe, originalmente armazenadas por linha na mesma máquina que executou o map. Precisamos que elas essencialmente sejam armazenadas por coluna na máquina que será responsável pelo reduce. Essa transformação de armazenamento por linha para essencialmente armazenamento por coluna é chamada, o artigo chama de shuffle. E realmente isso exigia mover cada pedaço de dados.

[1:14:30] pela rede. do map que o produziu para o reduce que precisávamos. E isso foi tipo a parte cara do... Hum. do MapReduce. Sim. Por que eles não? fizeram algo que rodasse tipo como você teria você Mantenha seu... como você já tem. escolha um dos então você teria esperado a noite toda. Você está certo, você pode imaginar uma definição diferente na qual você tem um reduce mais tipo streaming. Eu não sei, não pensei nisso a fundo. Não sei por quê. se isso seria viável ou não. Certamente no que diz respeito à interface do programador, tipo, se o objetivo, o objetivo número um deles realmente, era tornar fácil programar.

[1:15:11] por pessoas que simplesmente não tinham ideia do que estava acontecendo no sistema. Então pode ser que esta especificação, esta é realmente a forma como as funções reduce se parecem. em C++ ou algo assim. Tipo, uma versão streaming disso agora está começando a parecer Eu não sei como parecia. Provavelmente não tão simples. Mas você sabe, talvez pudesse ser feito dessa forma. E de fato, muitos sistemas modernos As pessoas se tornaram muito mais sofisticadas. com coisas modernas que são os sucessores do MapReduce. E eles de fato envolvem processar fluxos de dados frequentemente em vez dessa abordagem muito em lote. É uma abordagem em lote no sentido de que esperamos até obter todos os dados e então os processamos.

[1:15:55] Então, antes de tudo, você precisa ter uma noção de entradas finitas, certo? E sistemas modernos frequentemente de fato usam streams. e... são capazes de tirar proveito de algumas eficiências devido a isso. Obrigado. mas não o MapReduce. Obrigado. Hum... Ok, então este é o ponto em que o shuffle é onde todo o tráfego de rede acontece, isso pode na verdade ser uma vasta quantidade de dados. Então, se você pensar em ordenação, Se você estiver ordenando, a saída da ordenação tem o mesmo tamanho que a entrada da ordenação. Então isso significa que se sua entrada for 10 terabytes de dados, e você estiver executando uma ordenação, você está movendo 10 terabytes de dados pela rede neste ponto.

[1:16:37] E sua saída também será 10 terabytes e então isso é-- bastante dados e de fato é para muitos trabalhos produzidos por map, embora não todos. Eles reduzem significativamente a quantidade de dados nesses estágios. Eu estou... Alguém mencionou, oh, e se você quiser alimentar a saída do reduce em outro MapReduce E de fato, era frequentemente o que as pessoas queriam fazer. E de qualquer forma, a saída do reduce pode ser enorme, como para ordenação ou para indexação da web. a saída que ele produz é sobre 10 terabytes de entrada. a saída do reduce será novamente 10 terabytes. Então a saída do reduce também era armazenada no GFS.

[1:17:10] E o sistema-- você sabe, o reduce apenas produziria esses pares chave-valor, mas o, Obrigado. A estrutura MapReduce os reuniria e os escreveria em arquivos gigantes no GFS. Hum, E então havia outra rodada de comunicação de rede necessária para levar a saída de cada reduce ao servidor GFS necessário para armazenar esse produto. Você pode pensar que eles poderiam ter... Usado o mesmo truque com a saída de armazenar a saída no servidor GFS que por acaso executava hum o trabalhador MapReduce que executou o reduce.

[1:17:48] E talvez eles tenham feito isso, mas porque o GFS, além de dividir os dados para desempenho, também mantém duas ou três cópias para tolerância a falhas. Isso significa que não importa o quê, você precisa escrever uma cópia dos dados pela rede para um servidor diferente. Então há muita comunicação de rede aqui, e um pouco aqui também. Hum, E foi essa comunicação de rede que realmente limitou a... Taxa de transferência do MapReduce. em 2004. Hum, Em 2020, Porque esse arranjo de rede era um fator tão limitante para tantas coisas que as pessoas queriam fazer em data centers.

[1:18:22] As redes de data center modernas são muito mais rápidas na raiz do que isso era. Hum, Uma rede de data center típica que você pode ver hoje na verdade tem muitas raízes, em vez de um único switch raiz pelo qual tudo tem que passar, você pode ter-- muitos switches raiz e cada switch de rack tem uma conexão para cada um desses switches raiz replicados e o tráfego é dividido. entre os switches raiz. Então as redes de data center modernas têm muito mais taxa de transferência de rede hum E por causa disso, na verdade, modernos-- eu acho que o Google meio que parou de usar o MapReduce alguns anos atrás, mas Hum, antes de pararem de usá-lo.

[1:19:01] O MapReduce moderno na verdade não tenta mais executar os maps. na mesma máquina onde os dados estavam armazenados. Eles ficavam felizes em carregar os dados de qualquer lugar porque simplesmente assumiam que a rede era extremamente rápida. Certo. Estamos sem tempo para o MapReduce. Temos um laboratório. no final da próxima semana no qual você escreverá seu próprio MapReduce um tanto simplificado. Então, divirta-se com isso. e nos vemos na quinta-feira.

Ver a transcrição original em inglês

[0:01] All right, let's get started. This is 6824, distributed systems. Um, Thank you. So I'd like to start with just a brief explanation of what I think a distributed system is. Thank you. The core of it is a set of cooperating computers that are communicating with each other over network to get some coherent task done. The kinds of examples that we'll be focusing on in this class are things like storage for big websites, or big data computations such as MapReduce, Um, And also somewhat more exotic things like peer to peer file sharing.

[0:43] Those are all just examples of the kinds of case studies we'll look at. Um, And the reason why all this is important is that a lot of critical infrastructure out there is built out of distributed systems. Infrastructure that requires more than one computer to get its job done or sort of inherently needs to be spread out physically. Um. So the reasons why people build this stuff, First of all, before I even-- talk about distributed systems, I just want to remind you that If you're designing a system, you need to solve some problem, if you can possibly solve it, on a single computer.

[1:17] you know, without building a distributed system, you should do it that way. And there's many, many jobs you can get done on a single computer, and it's always easier. So distributed systems, you should try everything else before you try building distributed systems 'cause they're not simpler. So the reason why people are driven to use lots of cooperating computers are They need to get high performance. And the way to think about that is they want to get, achieve some sort of parallelism. Lots of CPUs, lots of memories, lots of disk arms moving in parallel.

[1:54] Another reason why people build this stuff is to be able to tolerate faults. Wow. . have two computers do the exact same thing. If one of them fails, you can cut over to the other one. Another is that some problems are just naturally spread out in space. Um, You want to do interbank transfers of money or something. Bank A has this computer in New York City, and Bank B has this computer in London.

[2:25] you know, you just have to have some way for them to talk to each other and cooperate in order to carry that out. So there's some natural sort of physical reasons systems that are inherently physically distributed, And the final reason that people build this stuff is in order to achieve some sort of security goal. So often by, if there's some code you don't trust, or you need to interact with somebody, They may be malicious or maybe their code has bugs in it. So you don't want to have to trust it. You may want to split up the computation so, you Your stuff runs over there on that computer, my stuff runs here on this computer, and they only talk to each other.

[3:03] to some sort of narrow, narrowly defined network protocol. So we may be worried about security, And that's achieved by splitting things up into multiple computers so that they can be isolated. Um. The-- Most of this course is going to be about performance and fault tolerance, although the other two often work themselves in by way of the sort of constraints on the case studies that we're going to look at. Um, You know, all the distributed systems of these problems are, because they have many parts and the parts execute concurrently, because there are multiple computers.

[3:42] You get all the problems that come up with concurrent programming, all the sort of complex interactions and weird timing dependent stuff. And that's part of what makes distributed systems hard. Another thing that makes... distributed systems hard is that Because again you have multiple pieces plus a network. you can have very unexpected failure patterns that is If you have a single computer, it's usually the case that either the computer works or maybe it crashes or suffers a power failure or something. But it pretty much either works or doesn't work.

[4:12] Distributed systems made up of lots of computers, you can have partial failures. That is, some pieces stop working, other pieces continue working. Or maybe the computers are working, but some part of the network is broken or unreliable. um So partial failures is another reason why uh... distributed systems are hard. So this is sort of basic challenges. Bye. Thank you. Thank you.

[4:44] Bye. Subtitles by the Amara.org community Thank you. Thank you. And a final reason why it's hard is that, you know, the original reason to build a distributed system is often to get higher performance. to get 1,000 computers worth of performance, or 1,000 disc arms, worth of performance. But it's actually very tricky to obtain that thousand X speed up with a thousand computers. There's often a lot of roadblocks thrown in your way. Um, Hello.

[5:15] Thank you. Thank you. It often takes a bit of careful design to... make the system actually give you the performance you feel you deserve. So solving these problems, of course, can be all about, you know, addressing these issues. Um, The reason to take the course is because often the problems and the solutions are quite just technically interesting and They're hard problems. For some of these problems, there's pretty good solutions known for other problems They're not such great solutions, no.

[5:46] Distributed systems are used by a lot of real world systems out there, big websites often involved. you know, vast numbers of computers that are, you know, put together as distributed systems. When I first started teaching this course, It was. distributed systems were something of an academic curiosity. You know, people thought, "Oh, you know At a small scale, they were used sometimes, and people felt that, oh, someday they'd be... might be important. but now particularly driven by the rise of giant websites.

[6:17] that have you know, vast amounts of data and entire warehouses full of computers, distributed systems in the last 20 years have gotten to be Very-- seriously important part of computing infrastructure. Okay. This means that there's been a lot of attention paid to them, a lot of problems have been But there's still quite a few unsolved problems. So if you're a graduate student or you're interested in research, There's a lot of problems yet to be solved in distributed systems You could look into his research.

[6:49] And finally, if you like building stuff, This is a good class because it has a lab sequence in which you'll construct some fairly realistic distributed systems focused on performance and fault tolerance. So you've got a lot of practice. building distributed systems and making them work. All right. Let me talk about course structure a bit before I... get started on real technical content. You should be able to find the course website.

[7:20] using Google. And on the course website is the lab assignments course schedule, and also linked to a Piazza where you can post questions, get answers. Um, The course staff, I'm Robert Morris, will be giving the lectures. I also have four TAs. You guys want to stand up and show your faces? Um, Thank you. The TAs are experts at in particular at solving the labs, They'll be holding office hours, so if you have Questions about the labs, you should go to office hours.

[7:54] or you could post questions to Piazza. Um, Thank you. The course has a couple of important components. Um, One is his lectures. There's a paper for almost every lecture. Thank you. Thank you. There's two exams. Thank you. Thank you. Thank you. Bye. There's the labs, programming labs, and Um, there's an optional final project that you can do instead of one of the labs.

[8:27] Thank you. Subtitles by the Amara.org community The lectures will be about big ideas in distributed systems. There will also be a couple of lectures that are more about sort of lab programming stuff. A lot of the lectures will be taken up by case studies, a lot of the way that I sort of try to bring out the um, content of distributed systems is by looking at papers some academic, some written by people in industry, describing real solutions to real problems.

[9:04] Um, These lectures actually would be videotaped. and I'm hoping to post them online so that you can that if you're not here, or you want to review the lectures, you'll be able to look at the videotape lectures. Amen. The papers, again, there's one to read per week. Most of them are research papers. Some of them are classic papers. Like today's paper, which I hope some of you have read on MapReduce. It's an old paper, but it was the beginning of, it spurred an enormous amount of interesting work, both academic and in the real world. So some are classic and some are more recent papers.

[9:38] sort of talking about more up-to-date research, what people are currently worried about. And from the papers, I'll be hoping to tease out what the basic problems are, what ideas people have had that might or might not be useful in solving distributed system problems, Um, We'll be looking at sometimes at implementation details in some of these papers. Because a lot of this has to do with actual construction of of software-based systems. And we're also going to spend a certain amount of time looking at evaluations. people evaluating how fault tolerant their systems by measuring them or people measuring how much performance or whether they got performance improvement at all.

[10:14] Um, So I'm hoping that you'll all read the papers before coming to class. The lectures are... maybe not gonna make as much sense if you haven't already read the lecture, because there's not enough time to both explain all the contents of the paper and have a sort of interesting reflection on what the paper means. online class you really gotta be papers before coming to class and hopefully one of the things you learn in this class is how to read a paper rapidly and efficiently, and skip over the parts that maybe aren't that important sort of focus on teasing out the important ideas.

[10:50] On the website, there's for every link to by the schedule, there's a question. that you should submit an answer for for every paper. I think the answers are due at midnight. And we also ask that you submit a question you have about the paper. Um, to the website in order both to give me something to think about as I'm preparing the lecture and if I have time I'll try to answer at least a few of the questions by email. And the question and the answer for each paper are due midnight. the night before.

[11:21] There's two exams, there's a midterm exam in class, I think on the last class meeting before, uh Spring break. Um, and there's a final exam during final exam week at the end of the semester. The exams are going to focus mostly on papers and the labs. and probably the best way to prepare for them as well as attending lecture and reading the papers. um a good way to prepare for the exams is to look at old exams.

[11:52] 20 years of old exams and solutions. And so you look at those and sort of get a feel for what kind of questions that I like to ask. And indeed, because we read many of the same papers, Inevitably, I ask questions each year that can't help but resemble questions asked in previous years. Thank you. The labs, there's four programming labs. The first one of them is due Friday next week. um They're...

[12:23] Thank you. Lab one is a... Thank you. A simple MapReduce lab. to implement your own version of the paper. in which I'll be discussing in a few minutes. Um, Lab two. involves using a technique called raft in order to get fault, in order to, sort of allow, in theory, allow any system to be made fault tolerant by replicating it and having this raft technique. manage the replication and manage sort of automatic cut over if there's a failed if one of the replicated servers fails.

[12:59] So this is RAF for fault tolerance. Um. Thank you. Subtitles by the Amara.org community *kiss* In lab three, you'll use your raft implementation in order to build a fault tolerant key value server. Thank you. Amen. Thank you. It'll be replicated and fault tolerant. And in lab four, you'll take your replicated key value server and clone it into a number of independent groups. and you'll split the data Um, in your key value storage system across all of these individual replicated groups to get parallel speed up.

[13:37] by running multiple replicated groups in parallel and you'll also be responsible for moving the various chunks of data between different servers as they come and go. without dropping any balls. what's often called a sharded, Bye. key values service. Bye. you Sharding refers to splitting up the data, partitioning the data. among multiple servers in order to get parallel speedup.

[14:10] um Thank you. If you want, instead of doing lab four, You can do a project of your own choice. And the idea here is if you have some idea for a distributed system you know, in the style of... some of the distributed systems we talk about in the class, if you have your own idea that you want to pursue, and you like to build something and measure whether it worked Explore your idea. you can do a project. Um, And so for a project, you'll pick some teammates because we require that projects are done and teams of two or three people.

[14:45] Nam. So like some teammates and send your project idea to us and we'll think about it and say yes or no and maybe give you some advice. um, And then if you go ahead and do, if we say yes, and you want to do a project, you do that instead of Lab 4, and it's do. at the end of the semester. You know, you'll... you should do some, uh, design work and build a real system, and then in the last day of class, you'll demonstrate your system. as well as handing in a short... sort of written report to us about what you built. And I posted on the website some some ideas which might or might not be useful for you to sort of spur thoughts about what projects you might build, but really the best projects are one where you have a good idea, for the project. And the idea is if you want to do a project, you should choose an idea that's sort of in the same vein as the systems that we're talk about in this class.

[15:40] Okay, back to labs. The lab grades that we give you, you hand in your lab code, and we run some tests against it, You're graded based on how many tests you pass. We give you all the tests that we use, so there's no hidden tests. So, If you influence the lab and it reliably passes all the tests, then chances are good, unless there's something funny going on, which there sometimes is. Chances are good that if your code passes all the tests when you run it, it'll pass all the tests when we run it. and you'll get a full score. So hopefully there'll be no mystery about what score you're likely to get.

[16:13] on the labs. Um, Let me warn you that Debugging these labs can be time consuming. Because they're distributed systems, and have a lot of concurrency and communication, Um, sort of strange, difficult to debug errors can crop up. You really ought to start the labs early. Don't leave them. A lot of trouble if you leave the labs to the last moment. You got to start early. If you're-- problems, please come to the TA's office hours.

[16:44] and please feel free to ask questions. about the labs on Piazza. And indeed, I hope if you know the answer that you'll answer people's questions on Piazza as well. All right. Any questions about the mechanics of the course? Yes? Bye. Yeah. Thank you. So the question is, how do these things factor into grade? I forget, but it's all on the...

[17:18] It's on the website under-- something. Um. I think it's the labs are the single most important. component. Thank you. Okay. Thank you. Um... All right, so this is a course about infrastructure. for applications. And so all through this course, there's going to be a sort of split in the way I talk about things between applications, which are sort of other people, the customer, somebody else writes.

[17:49] The applications are going to use the infrastructure that we're thinking about in this course. And so the kinds of infrastructure that tend to come up a lot. Thank you. Thank you. are storage Thank you. communication Thank you. and computation. And we'll talk about systems that provide all three of these kinds of infrastructure.

[18:19] Um, the storage Turns out that storage is going to be the one we focus most on because it's a very well-defined and useful abstraction. And thank you. usually fairly straightforward abstractions. So people know a lot about how to use and build storage systems and how to build sort of replicated fault tolerant high performance distributed implementations of storage. We'll also talk about some of our computation systems, like MapReduce for today.

[18:50] is a computation system. Um, And we will talk about communication some, but mostly from the point as a tool that we need to use to build distributed systems. Like computers have to talk to each other, over a network, you know, maybe you need reliability or something. And so we'll talk a bit about but we're actually mostly... consumers of communication. Um, If you want to learn about communication, systems as or how they work, that's more the topic of 6829. So for storage and computation, A lot of our goal is to be able to discover abstractions, Um, ways of simplifying the interface to these, Storage and computation distributed storage and computation infrastructure so that it's easy to build applications on top of it.

[19:41] And what that really means is that we need to, we'd like to be able to build abstractions that hide the distributed nature of these. of these systems. So the dream, which is rarely fully achieved, but the dream would be to be able to build an interface, That looks to an application as if it's a non distributed storage system just like a file system or something that everybody already knows how to program and has a pretty simple model semantics. We'd love to be able to build interfaces that look and act just like non-distributed, storage and computation systems, but are actually-- you know, vast, extremely high performance, fault tolerant, distributed systems underneath.

[20:23] Um. So we'd love to have abstractions. Thank you. Subtitles by the Amara.org community Thank you. And as you'll see as the course goes on, we sort of, you know only part of the way there. It's rare that you find an abstraction for a distributed version of storage or computation that has simple behavior, behaves just like Um, the non-distributed version of storage that everybody understands. People are getting better at this and...

[20:54] um We're going to try to study the ways in what people have learned about. building such abstractions. Okay. What kind of, what kind of, Topics show up as we're considering these abstractions. The first one, the first topic, general topic that we'll see a lot is in a lot of the systems we look at, have to do with implementation. Thank you. um So, for example, the kind of tools that you see a lot for for ways people learn how to build these systems are things like remote procedure call, whose goal is to mask the fact that we're communicating over an unreliable network.

[21:38] um Another kind of implementation A topic that we'll see a lot is threads. which are a programming technique, that allows us to harness multi-core computers, but maybe more important for this class, Threads are a way of structuring concurrent operations. in a way that's hopefully simplifies the programmer view of those concurrent operations. Um, And because we're gonna use threads a lot, it turns out we're gonna need to also just from an implementation level, spend a certain amount of time thinking about concurrency control, things like locks.

[22:18] Um. you Thank you. And the main place that these implementation ideas will come up in the class, there will touched on in many of the papers, but you're going to come face to face with all of this in a big way in the labs. You need to build distributors. you know, do the programming for distributed systems. These are like a lot of the sort of important tools beyond just sort of ordinary programming, Um, These are some of the critical tools that you'll need to use. I'm back. to build distributed systems.

[22:50] Another big topic that comes up in all the papers we're going to talk about is performance. Thank you. Bye. Thank you. Thank you. Um, Usually the high level goal of building a distributed system is to get what people call scalable speedup. So we're going to look in for scalability. And what I mean by scalability or scalable speedup is that If I have some problem that I'm solving with one computer, and I buy a second computer to help me execute my problem.

[23:30] If I can now solve the problem in half the time, or maybe solve twice as many problem instances. you know, per minute. on two computers as I had on one, then That's an example of scalability. Sort of. two times the computers or resources, um gets me two times the performance or throughput. And this is a huge hammer. If you can build a system that actually has this behavior, Namely that If you increase the number of computers you throw at the problem by some factor, You get that factor, more throughput, more performance.

[24:14] out of the system. That's a huge win. Because You can buy computers with just money. Right? Whereas if in order to get the alternative to this, Um, is that in order to get more performance, you have to pay programmers to restructure your software to get better performance, to make it more efficient, to apply some sort of specialized techniques, better algorithms or something. If you have to pay programmers, the fix your code to be faster.

[24:44] an expensive way to go. We'd love to be able to just, oh, buy a thousand computers instead of 10 computers and get You know, 100 times more throughput. That's fantastic. And so this sort of scalability idea is a huge idea in the backs of people's heads when they're like building things like big websites that run on a you know, building full of computers. If the building full of computers is there to get a sort of corresponding amount of data performance. you have to be careful about the design in order to actually get that performance. Um, So, often the way this looks when we're looking at diagrams or writing diagrams in this course is that That's supposing we're building a website.

[25:26] Ordinarily, you might have a website that you know, has a HTTP server, or let's say it has some has some users. um, running web browsers, And they talked to... you know, web server running Python or PHP or whatever, Sort of web server. And the web server talks to some kind of database. Um, You know, when you have one or two users, have one computer running both, or maybe a computer for the web server and a computer from the database, Maybe all of a sudden you get really popular and you You know, 100 million people sign up for your service.

[26:10] Right? How do you... No. How do you fix your-- you certainly can't-- support millions of people on a single computer, Um, except by extremely careful labor intensive optimization. Um, but you don't have time for. So, Typically the way you're going to speed things up, the first thing you do is buy more web servers and just split the users so that you know, half your users or some fraction of the user go to web server one and the other half You send them to web server two.

[26:40] and because maybe you're building I don't know what, Reddit or something, where all the users need to see the same data ultimately, you have all the web servers talk to the back end. And maybe you can keep on adding web servers for a long time here. Thank you. Um, Thank you. And so this is a way of getting parallel speed up on the web server code. You know, if you're running PHP or Python, maybe it's not too efficient. Um, Uh, as long as each individual web server doesn't put too much load on the database, you can add a lot of web servers.

[27:13] before you run into problems. But. this kind of scalability is rarely infinite, unfortunately. um Certainly not without serious thought. And so what tends to happen with these systems is that at some point after you have 10 or 20 or 100 web servers all talking to the same database, Now all of a sudden the database starts to be a bottleneck. and adding more web servers no longer helps. So it's rare that you get full scalability through sort of infinite numbers of adding infinite numbers of computers.

[27:45] At some point you run out of gas because The place at which you are adding more computers is no longer the bottleneck. by having lots and lots of web servers, we basically move the bottleneck Um, I think it's limiting performance from the web servers to the database. Um, And at this point, actually, you almost certainly have to do a bit of design work. because It's rare that you can take, that there's any straightforward way to take a single database and sort of refactor things. with it for. you can take data sorted in a single database and refactor it so it's split over multiple databases.

[28:21] Um, but it's often a fair amount of work. and Because it's awkward, but many people actually need to do this. Um, We're going to see a lot of examples in this course in which the distributed system people talking about is a storage system. because the authors were running You know, something like a big website that ran out of gas on a single database or storage servers. Um, Anyway, so the Scalability story is we love to build systems that scale this way, but um you know it's hard to make it, or it takes work often, design work, push this idea infinitely far.

[29:04] Amen. Thank you. Thank you. Okay, so. Another big topic that comes up a lot is fault tolerance. Thank you. . If you're building a system with a single computer in it, well, A single computer often can stay up for years. Like, I have servers in my office that have been up for years without crashing. Um, You know, the computer's pretty reliable, the operating system's pretty reliable, Apparently the power in my building is pretty reliable. So it's not uncommon to have single computers that just stay up for amazing amounts of time.

[29:44] However, If you're building systems out of thousands of computers, then even if each computer can be expected to stay up for a year, With a thousand computers that means you're gonna have like about three computer failures per day. And in your set of computers. solving big problems with big distributed systems turns sort of very rare fault tolerance, very rare failure problems, into failure problems that happen just all the time. In a system with a thousand computers, there's almost certainly always something broken. There's always some computer that's either crashed or mysteriously running incorrectly or slowly or doing the wrong thing.

[30:25] Or maybe there's some piece of the network, like with a thousand computers, We got a lot of network cables. and a lot of network switches. You know, there's always some network cable that somebody stepped on and is unreliability, or network cable that fell out, or some network switch whose fan is broken and the switch overheated and failed. There's always some little problem somewhere in your building-sized um, distributed system. So Big scale turns problems from very rare events, you really don't have to worry about that much, into just constant problems.

[30:57] The... failure has to be really, or the response, the masking of failures, the ability to perceive about failures just has to be built into the design. because there's always failures. Um... And, you know, as part of building, you know, convenient abstractions for application programmers, We really need to be able to build infrastructure that as much as possible hides the failures from application programmers or masks them or something. so that every application programmer doesn't have to have a complete complicated story for all the different kinds of failures that can occur.

[31:32] Um, there's a bunch of different notions that you can have about what it means to be fault tolerant. about a little more. but exactly what we mean by that. And we'll see a lot of different flavors, but among the more common ideas you see, one is availability. Thank you. Amen. So, you know, some systems are designed so that under, some certain kinds of failures, not all failures, but certain kinds of failures, the system will keep operating despite the failure while providing undamaged service.

[32:15] Uh, the same kind of service it would have provided, even if there had been no failure. So some systems are available in that sense, So if you build a replicated service that maybe has two copies, You know, if one of the replicas replica servers fail fails, maybe the other server can continue operating They both fail, of course, you can't. You know, you can't promise. Um. availability in that case. So available systems usually say, well, under a certain set of failures, We're going to continue providing service. We're going to be available.

[32:48] More failures than that occur. It won't be available anymore. Thank you. Another kind of fault tolerance you might... you might have or in addition to availability or by itself is recoverability. Thank you. Thank you. Thank you. And what this means is that if something goes wrong, maybe the service will stop working. That is it all. simply stopped responding to requests, Um, and it'll wait for someone to come along and repair whatever went wrong, but after the repair occurs, the system will be able to continue as if nothing bad had gone wrong.

[33:23] So this is sort of a weaker requirement than availability, because here we're not going to do anything while until the failed component has been repaired, But the fact that we can get up get going again without, you know, but... without any loss of correctness, is still a significant requirement. It means, you know, recoverable systems typically need to do things like save their latest date on disk or something where they can get it back you know, after the power comes back up. Um, And even among available systems, In order for a system to be useful in real life, Usually what the way available systems are specced is that They're available until Some number of failures have happened. If too many failures have happened, an available system will stop working or will stop responding at all, But when enough things have been repaired, it'll continue operating. So a good available system will sort of be recoverable as well in the sense that if too many failures occur,

[34:26] um It'll stop answering, but then we'll continue correctly after that. Um, So this is what we love to hear. This is what we'd like to obtain. The biggest hammer, we'll see a number of approaches to solving these problems. I said, sort of Two things that are the most important. tools we have in this department. One is non-volatile storage. so that, you know, something crashed, power failed, or whatever, Maybe there's a building-wide power failure. We can use non-volatile storage like hard drives or flash or solid state drives or something to sort of store a checkpoint or a log the uh state of the system and then when the power comes back up or somebody repairs our power supply, who knows what, we'll be able to read our latest state off the hard drive and continue from there.

[35:22] So. So one tool is sort of non-volatile storage. And the management of non-volatile storage is something that comes up a lot, because non-volatile storage tends to be expensive to update. And so a huge amount of the sort of nitty-gritty of building sort of high performance fault-tolerant systems is in clever ways to avoid having to write the non-volatile storage too much. In the old days and even today you know, what writing non-volatile storage meant was, moving a disc arm and waiting for a disk platter to rotate.

[35:58] both of which are agonizingly slow. on the scale of, you know, 3 gigahertz microprocessors. With things like flash. Life's quite a bit better, but still requires a lot of thought to get good performance out of it. And the other big tool we have for fault tolerance is replication. Thank you. and the management of replicated copies is sort of tricky You know, that sort of problem lurking in any replicated system where we have two servers each with a supposedly identical copy of the system state.

[36:32] Um, The key problem that comes up is always that the two replicas will accidentally drift out of sync and will stop being replicas. And this is just-- you know, at the back of every design that we're gonna see for using replication to get fault tolerance. And Lab 2, and that's what you're all about. management of replicated copies for fault tolerance. Um. As you'll see, it's pretty complex. Um, A final topic, final cross-cutting topic, um is consistency.

[37:11] Thank you. Thank you. So as an example of what I mean by consistency supposing we're building a distributed storage system and it's a key value service so it just supports. two operations, maybe there's a put operation, and you give it a key, and a value and the storage system sort of stashes away the value under as the value for this key, so it maintains just a big table of keys and values. And then there's a get operation. the client sends it a key and the storage service is supposed to respond with the value that's stored for that key.

[37:51] And this is kind of the When I can't think of anything else as an example of a distributed system, I'll whip uh, key value services. And they're very useful, right? They're just sort of the fundamental Um, simple version of a storage system. So. Of course if you're an application programmer. It's helpful if... These two operations kind of have meanings attached to them. You can go look in the manual and the manual says you know, what it what it means, what you'll get back if you call get.

[38:23] right, and sort of what it means for you to call put So it would be great if there was some sort of spec for what they meant, otherwise, like, How can you possibly write an application without a description of what Pudding getters are supposed to do. Um, And this is the topic of consistency. And the reason why it's interesting in distributed systems is that Um. both for performance and for fault tolerant reasons, fault tolerance reason, we often have more than one copy of the data floating around. So, you know, in a non-distributed system where you just have a single server with a single table, there's often, although Not always.

[39:02] There's often relatively no ambiguity about what put and get could possibly mean intuitively. You know, what put means is update the table, and what get means is just, get me the version that's stored in the table, Um, But in a distributed system, where there's more than one copy of the data, due to replication or caching or Who knows what? There may be lots of different versions um of this key value pair floating around. Like if one of the replicas, you know, supposing some client issues a put, and You know, there's-- two copies of the The server, so they both have a key value table.

[39:46] Right, and maybe key one has value 20 on both of them. Thank you. and then some client issues a put. We have a client over here. and it's gonna send a put, it wants to update the value of one to be 21. Maybe it's counting stuff in this Key value server, so it sends a put Thank you. with key one and value 21, it sends it to the first server and it's about to send The same, you know, it wants to update both copies, right?

[40:19] It keeps them in sync. It's about to send this put, but just before it sends the put to the second server, it crashes. power failure, bug in operating system or something. So now the state we're left in, sadly, is that we sent this put and so we've updated one of the two replicas to have value 21, but the other one's still with 20. Now somebody comes along and reads with a "get" And they might get... They want to... Read the value associated with key one, they might get 21 or they might get 20, depending on who they talk to. And even if the rule is you always talk to the top server first, If you're building a fault tolerance system, the actual rule has to be Oh, you talk to the top server first, unless it's failed, in which case you talk to the bottom server.

[41:00] Um, So either way, someday you risk exposing this stale copy of the data. to some future get. It could be that many gets get the updated 21 and then Like next week, all of a sudden, some get yields, you know, a week old copy of the data. So that's not very consistent. Right? in order, but you know, it's, the kind of thing that could happen. Right? and we're not careful. We need to actually write down what the rules are going to be about puts and gets given this danger of due to replication.

[41:37] And it turns out there's many different the definitions you can have of consistency. Um, Many of them are relatively straightforward. Many of them sound like, well, I get yields the you know, value put by the most recently completed put. All right. And so that's usually called strong consistency. It turns out also it's very useful to build systems that have much weaker consistency. That for example, do not guarantee anything like I get it.

[42:11] sees the value written by the most recent put. And the reason, so there's strongly consistent systems - - They usually have some version of get seeing most recent puts. I think you have to... There's a lot of details to work out. There's also weakly consistent, many sort of flavors of weakly consistent systems that do not make any such guarantee. on that. and it may guarantee you well you know, if, someone does a put, then you may not see the put. You may see old values that weren't updated by the put for an unbattered amount of time maybe.

[42:47] Um, And the reason for-- people being very interested in weak consistency schemes. is that Strong consistency, that is, having RIS actually see, be guaranteed to see the most recent right. That's a very expensive spec to implement. um because what it means is almost certainly that you have to, somebody has to do a lot of communication in order to, actually implement. some notion of strong consistency. If you have multiple copies, Um, It means that either the writer or the reader, or maybe both, has to consult every copy. Like in this case, um where maybe a client crashed, left one updated, but not the other.

[43:29] If we wanted to implement strong consistency in maybe a simple way in this system, we'd have readers read both of the copies or if there's more than one copy, all the copies. and use the most recently written value that they find. Um. but that's expensive. That's a lot of chit chat. to read one value. So in order to avoid communication as much as possible, Um. particularly if replicas are far away, people build weak systems that might actually allow the stale read of an old value in this case.

[44:01] Um, although there's often more semantics attached to that to try to make these weak schemes And where this communication problem, you know, strong consistency. requiring expensive communication. Where this really runs you into trouble is that If we're using replication for fault tolerance, then We really want the replicas to have independent failure probability, to have uncorrelated failure. So, for example, putting both of the replicas of our data in the same rack, in the same machine room, is probably a really bad idea.

[44:38] because if someone trips over the power cable to that rack, both of our copies of our data are gonna die. Because they're both attached to the same power cable on the same rack. Um, So in the search for making replicas as independent in failure as possible in order to get decent fault tolerance, People would love to put different replicas as as far apart as possible, like in different cities. or maybe on opposite sides of the continent. So an earthquake that destroys one data center will be extremely unlikely to also destroy The other data center that has the other copy.

[45:13] Um, You know, so we'd love to be able to do that. If you do that, then the other copy is thousands of miles away, And the rate at which light travels means that it may take on the order of milliseconds or tens of milliseconds to communicate to a data center across the continent in order to update the other copy of the data. And so that makes this The communication required for strong consistency, for good consistency, potentially extremely expensive. Like every time you want to do one of these put operations, or maybe a get, depending on how you implement it, You might have to sit there waiting for like 10 or 20 or 30 milliseconds in order to talk to both copies of the data to ensure that they're both updated or both checked.

[45:57] to find the latest copy. Um, And That tremendous expense, right? This is 10 or 20 or 30 milliseconds on machines that, after all, will execute like a billion instructions per second. So we're wasting a lot of potential instructions while we wait. People often build much weaker systems. You're allowed to only update the nearest copy or only consult the nearest copy. Now, I mean, there's a huge sort of amount of academic and real world. research on had us. structure weak consistency guarantee so they're actually useful to applications and how to take advantage of them in order to actually get high performance.

[46:35] Thank you. All right, so that's a lightning preview of the... technical ideas in the course. Any questions about this? before I start talking about MapReduce. All right, I want to switch to MapReduce. That's a sort of detailed case study that's actually going to illustrate most of the ideas. that we've been talking about here. And that produces a system that was Uh...

[47:06] originally designed and built and used by Google, I think the paper dates back to 2004. The problem they were faced with was that they were running huge computations on terabytes and terabytes of data. creating an index of all of the content of the web or analyzing the link structure of the entire web in order to identify the most important pages or the most authoritative pages.

[47:36] And so, you know, the whole web is-- was even in those days tens of terabytes of data. Um... Building an index of the web is basically equivalent to a sort running sort of the entire data. Sort, you know, it's like... reasonably expensive. and to run a sort on the entire content of the web on a single computer I don't know how long it would have taken, but you know, weeks or months or years or something. So, Google at the time was desperate to be able to run giant computations on giant data on thousands of computers.

[48:09] in order that the computations could finish rapidly. It was worth it to them to buy lots of computers so that their engineers wouldn't have to spend a lot of time reading the newspaper or something waiting for their big compute jobs to finish. Um... And so for a while, they had their clever engineers sort of hand write, you know, if you needed to write a web indexer or some sort of link, web link analysis tool. you know, Google bought the computers and they say, "Here, engineers, you know, do--run whatever software you like on these computers."

[48:40] they would laboriously write the sort of one-off manually written software to take whatever problem they were working on and sort of somehow farm it out to a lot of computers and organize that computation and get the data back. Um, If you only hire engineers who are skilled distributed systems experts, Maybe that's OK, although even then, it's probably very wasteful of engineering effort. But they wanted to hire people who were skilled at something else. Um, And not necessarily...

[49:13] Um... engineers who wanted to spend all their time writing distributed system software. So they really needed some kind of framework that would make it easy to just, have their engineers Right? the kind of guts of whatever analysis they wanted to do, like sort algorithm or web index or link analyzer or whatever. Just write the guts of that application and not run, be able to run it on a thousands of computers. um without worrying about the details of how to spread the work over the thousands of computers, how to organize whatever data movement was required, how to cope with the inevitable failures.

[49:49] So they were looking for a framework that would make it easy for non-specialists to be able to write and run giant distributed computations. Um, And so that's what MapReduce is all about. Amen. And the idea is that the programmer just write the application designer, consumer of this distributed computation and just be able to write a simple map function and a simple reduce function, Good. don't know anything about distribution. and the MapReduce framework would take care of everything else.

[50:23] Um, So an abstract view of what MapReduce is up to is It starts by assuming that there's some input and the input is split up into some a whole bunch of different files or chunks in some way. We're imagining that You know, We have input file one, input file two, input file three, Etc. You know, and these inputs are maybe Help.

[50:53] web pages crawled from the web or more likely sort of big files that contain many web--each of which contains many web files. crawl from the web. All right, and the way MapReduce starts is that you define a map function and the MapReduce framework is going to run your map function on each of the input files. you Thank you. And of course you can see here there's some obvious parallelism available.

[51:25] can run the maps in parallel. So each of these map functions only looks at its input and produces output. The output that a map function is required to produce is a list. Takes a file as input and a file as some fraction of the input data, and it produces a list of key value pairs as output. the map function. And so, for example, let's suppose we're writing the simplest possible MapReduce example, a word count MapReduce. job, who's is The goal is to count the number of occurrences of each word.

[51:59] So your map function might emit key value pairs where the key is the word, and the value is just one. So for every word it sees, so this map function will split the input up into words. For every word it sees, it emits that word as the key and one as the value. And then later on we'll count up all those ones. in order to get the final output. Input one has the word. A in it. and the word B in it. And so the output the map is going to produce is Key A value 1, key B value 1.

[52:32] Maybe the second map indication sees a file that has a a b in it and nothing else so it's going to implement output B1, Maybe this third input has an A in it. and a C in it. All right, so we run all these maps on all the input files. And we get this intermediate, what the paper calls intermediate output. which is for every map, a set of key value pairs as output. Then the second stage of the computation is to run the reduces.

[53:04] Thank you. Um, And the idea is that the MapReduce framework collects together all instances from all maps of each keyword. So the MapReduce framework is going to collect together all of the A's you know, from every map, every key value pair whose key was A, it's gonna take Collect them all. and hand them to *knocking* one call of the programmer-defined reduce function. And then it's going to take all the bees and collect them together. Of course, it requires real collection because they were different instances of Key B were produced by different indications of map on different computers. So we're not talking about data movement.

[53:50] So we're going to collect all the B keys and hand them to a different call to reduce that's has all of the B keys. as its arguments, and same with C, all the C's. So this is gonna be the MapReduce framework will arrange for one call to reduce for every key that occurred in Amen. any of the map output. Um, And for our sort of silly word count, example all these reduces have to do or any one of them has to do is just count the number of items passed to it. It doesn't even have to look at the items because it knows that each of them is--the word is responsible for plus one as the value. You don't have to look at those ones, we just count them. So this reduce is gonna produce Um, A and then the count.

[54:43] Of its inputs, this reduce. It's gonna produce the key associated with it and then count of its values, which is also two, Thank you. Thank you. Thank you. So this is what a typical... MapReduce job looks like. the high level. Just for completeness, the--I'm sorry. Well, a little bit of terminology. The whole computation is called the job. any one invocation of map or reduce is called a task. So we have an entire job and it's made up of a bunch of map tasks.

[55:21] and then a bunch of reduced tasks. Um... So an example for this word count, you know, what the map and reduce functions would look like. Thank you. Thank you. Um... Thank you. Thank you. The map function takes a key and a value as arguments. And now we're talking about functions like written in an ordinary programming language like, C++ or Java or who knows what.

[55:52] um So this is just code ordinary people can write. What a map function for word count would do is split the key is the file name, which typically is ignored, we don't really care what the file name was. And the V is the content of "this maps input file." So V just contains all this text. We're going to split V into words. Thank you. Thank you. And then for each word, Thank you.

[56:24] *knocking* *knocking* *knocking* We're just gonna emit. And emit takes two arguments. MIT's call only map can make, and MIT is provided by the MapReduce framework. We get to produce, we hand a MIT a key, which is the word... and a value which is Bye. string one. So that's it for the map function. A word count map function in MapReduce literally could be this simple.

[56:56] Um, So. their sort of promise to make the And, you know, this map function doesn't know anything about distribution or multiple computers the fact we need to move data across the network, or who knows what. This is extremely... straightforward. And the reduce function for... word count um The reduce is called with Remember each reduce is called with sort of all the instances of a given key on the MapReduce framework calls reduce with a the key that it's responsible for and a vector of all the values that the maps produced.

[57:35] associated with that key. The key is the word, the values are all ones, we don't really care about them, we only care about how many there were um And so, reduce has its own emit function that just takes a a value to be emitted as the final output. as the value for the This key. So we're going to admit the length. Thank you. of this array. Thank you. So this is also about as simple as reduced functions are. in MapReduce, namely, Extremely simple.

[58:08] and requiring no knowledge about fault tolerance or Anything else? All right, any questions about... The basic framework, yes. and not... necessary but this might return something. I'm at it. Like France, France, France. using the MapReduce framework that maybe it's reduce with access. that step some number of times. You mean can you feed the output of the reduces sort of-- Yeah.

[58:43] Thank you. Oh, yes. Oh yes, in real life, all right. In real life, it is routine among MapReduce users to you know, define a MapReduce job that took some inputs and produced some outputs and then have a second MapReduce job, you know, if you're doing some very complicated multi-stage analysis. or iterative algorithm. like PageRank, for example, which is the algorithm Google uses to sort of, Estimate how important or influential different web pages are. That's an iterative algorithm is sort of gradually converges on an answer. And if you implement a MapReduce, which I think they originally did, You have to run the MapReduce job multiple times.

[59:28] The output of each one is sort of-- you know, list of web pages, with an updated sort of value or weight or importance for each web page. So it was routine to take this output and then use it as the input to another MapReduce job. We can't do it forever. Oh yeah. it is. all the tears "Well, yeah, you need to sort of set things up the output, you need to-- the reduced function sort of in the knowledge though.

[1:00:00] Meet the produce. data that's in the format or has the information required for the next MapReduce job. I mean, this actually brings up a little bit of a shortcoming in the MapReduce. framework, which is, it's great. if you're Thank you. if the algorithm you need to run is easily expressible as a map followed by this sort of "shuffling of the data by key, followed by a reduce, "and that's it." MapReduce is fantastic for algorithms that can be cast in that form.

[1:00:30] And furthermore, each of the maps has to be completely independent. required to be uh... functional, pure functional functions that just look at their arguments and nothing else. And you know, that's like, it's a restriction. And it turns out that many people want to run much longer pipelines that involve lots and lots of different kinds of processing. And with MapReduce, you have to sort of cobble that together from multiple--and MapReduce. distinct map-produced jobs. and more advanced systems, which we will talk about later in the course, are much better at allowing you to specify the complete pipeline of computations, and they'll do optimization.

[1:01:09] the framework realizes all the stuff you have to do. organize much more complicated efficiently. optimize, much more complicated. Computation. Your question. So in the paper, they distinguish between mappers and map functions. I guess that's the-- like the processes that are running the map. What are the... and welcome the processes that are-- From the programmer's point of view, it's just about map and reduce.

[1:01:43] From our point of view, it's gonna be about the worker processes. and the worker servers that that are part of MapReduce framework, among many other things. call them out from produce functions. So-- um Yeah, from our point of view, we care a lot about how this is organized by the surrounding framework. This is sort of the programmers view with all the distributed stuff stripped out. Um. Yes? Thank you. Sorry, I got to...

[1:02:21] Say it again. Sorry, do you emit locally? Oh, you mean where does the emit data go? Thank you. Okay, so there's two questions. One is... When you call emit, what happens to the data? and the other is where the functions run. So, Thank you. Um. The actual answer is that First, where does the stuff run? There's a number of, say, a thousand servers. Actually, the right thing to look at here is figure one in the paper.

[1:02:59] Um, Though sitting underneath this in the real world, there's some big collection of servers. And Um. We'll call them maybe worker servers or workers. And. There's also a single master server that's organizing the whole computation. And what's going on here is the master server knows that there's some number of input files, you know, 5,000 input files. and it farms out invocations of map to the different workers. So it'll send a message to worker seven saying, please run this map function on such and such an input file.

[1:03:39] And then the worker function which is, you know, part of MapReduce and knows all about MapReduce, well then, Um, Read the file, read the input, whatever, whichever input file. and call this map function with the file name value as arguments. than that worker process. will is what implements emit. And every time the map calls emit, The worker process. will write this data to files on the local disk.

[1:04:11] So what happens to map emits? is they produce files on the map worker's local disk that are accumulating all the keys and values produced by the mapped run on that worker. um So at the end of the math phase, What we're left with is all those worker machines Each of which has the output of some of whatever maps were run on that worker machine. Then the MapReduce workers arrange to move the data to where it's going to be needed for the reduces and since I And a typical big computation This reduced syndication is gonna need all map output that mentioned the key A, but it's gonna turn out, you know, this is a sort of simple example, but probably, In general, every single map invocation will produce lots of keys, including some instances of key A.

[1:05:13] So typically in order, before we can even run this reduce function, the MapReduce framework that is the MapReduce worker running on one of our thousand servers, is going to have to go talk to every single other of the thousand servers and say, "Look, I'm gonna run the reduce for key A, please. Look at the intermediate map output stored in your disk and fish out all of the instances of key A and send them over the network to me. So the reduced worker is going to do that. It's going to fetch from every worker.

[1:05:44] all of the instances of the key that it's responsible for, that the master has told it to be responsible for. And once it's collected all of that data, then it can call reduce. And the reduce function itself calls reduce emit, which is different from the map in it. What reduces emit does is writes the output to A file. in a cluster file service that Google uses. So here's something I haven't mentioned.

[1:06:15] Um, I haven't mentioned where the input lives. and where the output lives. They're both vials. Um, because any piece of input We want the flexibility to be able to read any piece of input on any worker server. That means we need some kind of network file system to store the input data. Um, And so indeed, the paper talks about this thing called GFS, for Google File System.

[1:06:48] Um, And GFS is a cluster file system. And GFS actually runs on exactly the same set of workers worker servers that run MapReduce. And the input GFS just automatically, when you, you know, it's a file system, you can read and write files. it just automatically splits up any big file you store on it. across lots of servers in 64 megabyte chunks. So if you write, if you have 10 terabytes of crawled web page contents. and you just write them to GFS, even as a single big file, GFS will automatically split that vast amount of data up into 64 kilobyte chunks distributed evenly over all of the GFS servers, which is to say, all the servers that Google has available.

[1:07:32] And that's fantastic, that's just what we need. If we then want to run a MapReduce job that takes the entire crawled web as input. the data's already stored in a way that's split up evenly across all the servers. And so that means that um the map workers, you know, we're going to launch If we have a thousand servers, we're going to launch a thousand map workers each reading one one thousandth of the input data. and they're gonna be able to read the data in parallel from a thousand GFS file servers.

[1:08:02] That's getting... A tremendous total. read throughput. you know, the read-through bit of a thousand servers. Yeah. Thank you. running the map. So are you thinking maybe that Google has one set of physical machines that run GFS and a separate set of physical machines that run MapReduce jobs. saying that the May I have two?

[1:08:37] Okay. They're not necessarily . - Right, so the question is, what is this arrow here? actually involve. Um, And the answer to that actually sort of changed over the years as Google's of all of this system. You know, with this in the most general case, if we have big files stored in some big network file system. Like, you know, it's like GFS is a bit like AFS. you might have used on Athena. where you go talk to some collection, your data's split over, big collection of servers, you have to go talk to those servers over the network to retrieve your data.

[1:09:13] Um, In that case, what this arrow might represent is Thank you. the map, the MapReduce worker process has to go off and talk across the network to the correct GFS server or maybe servers. that store its part of the input. and fetch it over the network to the-- MapReduce worker machine in order to pass the map. And that's certainly the most general case. And that was eventually how MapReduce actually worked. In the world of this paper though, And if you did that, that's a lot of network communication.

[1:09:47] You're talking about 10 terabytes of data, and then we have to move 10 terabytes across their data center network, which... you know, data center networks run at gigabits per second, but it's still a lot of time to move. tens of terabytes of data. Thank you. in order to try to, and indeed in the world of this paper in 2004, The most constraining bottleneck in their MapReduce system was network throughput. because they were running on a network, if you read as far as the evaluation section. their network, their network was Um...

[1:10:23] They had thousands of machines, whatever, and they would collect machines, they would plug machines into, you know, each rack of machines into, you know, an Ethernet switch for that rack or something. But then, you know, they all need to talk to each other. But there was a root Ethernet switch. that all of the rack Ethernet switches talk to. And this, and you know, so if you just pick some MapReduce worker and some GFS server chances are at least half the time, the communication between them has to pass through this one root switch. Their root switch had only some amount of total throughput, which I forget, uh... you know some number of gigabits per second.

[1:11:07] um Anyway, I forget the number, but when I did the division, that is divided up the total throughput available in the root switch by the roughly 2,000 servers that they used in the paper's experiments. What I got was that each machine's share of the root switch, or of the total network capacity, was only 50 megabits per second. in their setup. Subtitles by the Amara.org community So 50 megabits per second per machine.

[1:11:39] And that might seem like a lot, 50 megabits, gosh, millions and millions. But it's actually quite small compared to how fast, say, disks run or CPUs run. And so this, with their network, this 50 megabits per second was like a tremendous limit. They really stood on their heads in the design described in the paper to avoid using the network. And they played a bunch of tricks to avoid sending stuff over the network when they possibly could avoid it. One of them was They ran the GFS.

[1:12:12] servers. and the MapReduce workers on the same set of machines. so that they have a thousand machines They'd Run GFS, they implement their GFS service on that thousand machines and run MapReduce on the same thousand machines. And then when the master was splitting up the map work and sort of farming it out to different workers, it would cleverly when it was I'M GOING TO GO TO THE NEXT QUESTION. about to run the map. that was gonna read from input file one, it would figure out from GFS which server actually holds input file one on its local disk.

[1:12:50] And it would-- Send the map. for that input file to the MapReduce software on the same machine. so that by default, this arrow is actually local read from the local disk and did not involve the network. And you know, depending on failures or load or whatever, that it couldn't always do that. But almost all of the maps would be run on the very same machine that stored the data, thus saving them um vast amount of time that they would otherwise have had to wait to move the input data across the network.

[1:13:21] Um, The next trick they played is that map, as I mentioned before, stores its output on the local disk of the machine that you run the map on. So, again, storing the output of the map does not require network communication, at least because the output's stored on the disk. however We know for sure that one way or another, in order to group together all of the way the MapReduce is defined, In order to group together all of the values associated with the given key and pass them single invocation to produce on some machine, this is going to require network communication.

[1:13:59] We're going to--you know, we want to--we need to--we're That's all the A's and give them a single machine to have to be moved across the network. And so this shuffle, this movement of the keys from this kind of, you know, originally stored by Rowe on the same machine that ran the map. We need them essentially to be stored on by column on the machine that's going to be responsible for reduce. This transformation of row storage to essentially column storage is called, the paper calls a shuffle. And it really that required moving every piece of data.

[1:14:30] across the network. from the math that produced it to the reduce that we needed. And that was like the expensive part of the... Um. of the MapReduce. Yeah. Why didn't they? make the something that would run sort of like you would have you Keep your... as you have it already. pick one of the then you would have waited all night. You're right, you can imagine a different definition in which you have a more kind of streaming reduce. I don't know I haven't thought this through. I don't know why. whether that would be feasible or not. Certainly as far as programmer interface, like if the goal, their number one goal really, to be able to make it easy to program.

[1:15:11] by people who just had no idea what was going on in the system. So it may be that this spec, this is really the way reduce functions look. in C++ or something. Like a streaming version of this is now starting to look I don't know how it looked. Probably not this simple. But you know, maybe it could be done that way. And indeed, many modern systems People have gotten a lot more sophisticated. with modern things that are the successors of MapReduce. And they do indeed involve processing streams of data often rather than this very batch approach. It is a batch approach in the sense that we wait until we get all the data and then we process it.

[1:15:55] So first of all, you then have to have a notion of finite inputs, right? And modern systems often do indeed use streams. and... are able to take advantage of some efficiencies due to that. Thank you. but not MapReduce. Thank you. Um... Okay, so this is the point at which the shuffle is where all the network traffic happens, this can actually be a vast amount of data. So if you think about sort, If you're sorting, the output of the sort has the same size as the input to the sort. So that means that if your input is 10 terabytes of data, and you're running a sort, you're moving 10 terabytes of data across the network at this point.

[1:16:37] And your output will also be 10 terabytes and so this is-- quite a lot of data and indeed it is for many map-produced jobs, although not all. There significantly reduce the amount of data at these stages. I'm... Somebody mentioned, oh, what if you want to feed the output of reduce into another MapReduce And indeed, that was often what people wanted to do. And in any case, the output of the reduce might be enormous, like for sort or web-in-mixing. the output that it produces is on 10 terabytes of input. the output of the reduce is again gonna be 10 terabytes. So the output of the reduce was also stored on GFS.

[1:17:10] And the system would-- you know, reduce would just produce these key value pairs, but the, Thank you. MapReduce framework would gather them up and write them into giant files on GFS. Um, And so there was another, round of network communication required to get the output of each reduce to the GFS server needed to store that produce. You might think that they could have... Played the same trick with the output of storing the output on the GFS server that happened to run um the MapReduce worker that ran the reduce.

[1:17:48] And maybe they did do that, but because GFS as well as splitting data for performance, also keeps two or three copies for fault tolerance. That means no matter what, you need to write one copy of the data across a network to a different server. So there's a lot of network communication here, and a bunch here also. Um, And it was this network communication that really limited the... Thruppidimapidus. in 2004. Um, In 2020, Because this network arrangement was such a limiting factor for so many things people wanted to do in data centers.

[1:18:22] Modern data center networks are a lot faster at the root than this was. Um, One typical data center network you might see today actually has many root, instead of a single root switch that everything has to go through, you might have-- many root switches and each rack switch as a connection to each of these sort of replicated root switches and the traffic is split up. among the root switches. So modern data center networks have far more network throughput um And because of that, actually, modern-- I think Google sort of stopped using Macrodeuce a few years ago, but Um, before they stopped using it.

[1:19:01] The modern MapReduce actually no longer try to run the maps. on the same machine as the data was stored on. They were happy to load the data from anywhere because they just assumed the network It was extremely fast. Okay. We're out of time for MapReduce. We have a lab. at the end of next week in which you'll write your own somewhat simplified MapReduce. So, Have fun with that. and see you on Thursday.

Abrir no ambiente de trabalho do Vidleaf

Pesquise a transcrição, selecione linhas, copie citações com carimbos de data/hora, traduza.

Abrir no ambiente de trabalho →

Atribuição

"Palestra 1: Introdução" do MIT 6.824: Sistemas Distribuídos (https://www.youtube.com/@6.824), licenciado sob CC BY 3.0 (https://creativecommons.org/licenses/by/3.0/). Vídeo original: https://www.youtube.com/watch?v=cQP8WApzIQQ. Esta página é uma transcrição em texto do vídeo com quebras de parágrafo e carimbos de data/hora adicionados; o criador não é afiliado e não endossa o Vidleaf. O Vidleaf adicionou pontuação por IA e um resumo gerado por IA; o texto original permanece disponível nesta página.

Você é o criador ou detentor de direitos? Solicite uma correção ou remoção: copyright@vidleaf.app (veja Sobre estas páginas).

Última atualização