Back-End

28 nov, 2018

Peloton: o planejador unificado de recursos da Uber para diversas cargas de trabalho de cluster

Publicidade

O gerenciamento de cluster, uma infraestrutura de software comum entre empresas de tecnologia, agrega recursos computacionais de uma coleção de hosts físicos em um pool de recursos compartilhado, ampliando a capacidade de computação e permitindo o uso flexível de hardware do centro de dados.

Na Uber, o gerenciamento de cluster fornece uma camada de abstração para várias cargas de trabalho. Com a escala crescente de nossos negócios, o uso eficiente dos recursos do cluster torna-se muito importante.

No entanto, nossa pilha de computação estava subutilizada devido a vários clusters dedicados para casos de uso em lotes, sem estado e com estado.

Além disso, a natureza muito dinâmica de nossos negócios significa grandes flutuações na demanda de compartilhamento de viagens devido a feriados e outros eventos.

Esses casos de borda nos levaram a provisionar hardware em excesso para cada cluster, a fim de lidar com as cargas de trabalho de pico.

Confiar em clusters dedicados também significa que não podemos compartilhar recursos de computação entre eles. Durante períodos de pico, um cluster pode estar precisando de recursos enquanto outros têm recursos de sobra.

Para aproveitar melhor nossos recursos, precisávamos co-localizar essas cargas de trabalho em uma única plataforma de computação.

As eficiências resultantes reduziriam o custo técnico por viagem em nossa infraestrutura, beneficiando, em última análise, nossos parceiros motoristas e passageiros que dependem da Uber para ganhar a vida ou se locomover.

A solução a que chegamos foi o Peloton, um planejador unificado projetado para gerenciar recursos em cargas de trabalho distintas, combinando nossos clusters separados em um unificado.

O Peloton suporta todas as cargas de trabalho da Uber com uma única plataforma compartilhada, equilibrando o uso de recursos, compartilhando recursos de forma elástica e nos ajudando a planejar as futuras necessidades de capacidade.

Cargas de trabalho de cluster de computação

Há quatro categorias principais de cargas de trabalho de cluster de computação usadas na Uber: trabalhos sem estado, com estado e daemon.

  • Stateless jobs são serviços de longa duração sem estados persistentes.
  • Stateful jobs são serviços de longa duração, como os do Cassandra, MySQL e Redis, que têm estado persistente nos discos locais.
  • Batch jobs normalmente levam alguns minutos a alguns dias para serem concluídos. Existe uma ampla categoria de trabalhos em lote para análise de dados, aprendizado de máquina, mapas e processamento relacionado a veículos autônomos, provenientes de softwares como Hadoop, Spark e TensorFlow. Esses trabalhos são preemptivos por natureza e menos sensíveis a flutuações de desempenho de curto prazo devido à escassez de recursos de cluster.
  • Os Daemon jobs são agentes em execução em cada host para componentes de infraestrutura, como Apache Kafka, HAProxy e M3 Collector.
Figura 1: dividimos nossas cargas de trabalho de cluster em quatro categorias, cada uma com seus próprios atributos e recursos.

A necessidade de agendamento unificado de recursos

Os clusters de computação são críticos para impulsionar os negócios da Uber. Eles tornam muito mais fácil para os proprietários de infraestrutura gerenciar recursos de computação em ambientes locais e em nuvem.

Os clusters são os blocos de construção fundamentais para a arquitetura de microsserviço da Uber e fornecem vários recursos importantes para os proprietários de serviços, como autocorreção, posicionamento dinâmico e atualizações contínuas, além de suportar nossas cargas de trabalho de Big Data.

A co-localização de diversas cargas de trabalho em clusters compartilhados é essencial para melhorar a utilização do cluster e reduzir os custos gerais do cluster.

Abaixo, descrevemos alguns exemplos de como co-localizar cargas de trabalho mistas impulsionam a utilização em nosso cluster, além de nos ajudar a planejar com mais precisão o provisionamento de clusters:

  • O supercomprometimento de recursos e a preempção de trabalho são essenciais para melhorar a utilização de recursos de cluster. No entanto, é muito caro preemptar/interromper os trabalhos on-line, como serviços sem estado ou com estado que geralmente são sensíveis à latência. Portanto, impedir a preempção desses trabalhos sensíveis à latência exige que nós co-localizemos tarefas em lote que tenham de baixa prioridade e sejam preemptivas no mesmo cluster, permitindo-nos utilizar melhor os recursos supercomprometidos.
  • À medida em que os serviços da Uber se movem em direção a uma arquitetura ativo-ativa, teremos capacidade reservada para recuperação de desastres (DR) em cada centro de dados. Essa capacidade de DR pode ser usada para tarefas em lote até ocorrer failover/falha do centro de dados. Além disso, compartilhar clusters com cargas de trabalho mistas significa que não precisamos mais comprar capacidade extra de DR para cargas de trabalho on-line e em lote separadamente.
  • As cargas de trabalho on-line do Uber aumentam durante grandes eventos, como o Halloween ou a véspera de Ano Novo. Precisamos planejar com antecedência a capacidade desses eventos de alto tráfego, exigindo que compremos hardware separadamente para trabalhos on-line e em lote. Durante o resto do ano, esse hardware extra é subutilizado, levando a custos técnicos extras e desnecessários. Ao co-localizar as duas cargas de trabalho no mesmo cluster, podemos emprestar capacidade de cargas de trabalho em lote para cargas de trabalho on-line para esses picos sem comprar hardware extra.
  • Cargas de trabalho diferentes possuem perfis de recursos que geralmente são complementares entre si. Por exemplo, os serviços com estado ou os trabalhos em lote podem ser intensivos em IO de disco, mas os serviços sem estado geralmente usam pouco IO de disco. Dados esses perfis, faz mais sentido co-localizar os serviços com estado com tarefas em lote no mesmo cluster.

Percebendo que esses cenários nos permitiriam alcançar maior eficiência operacional, melhorar o planejamento de capacidade e otimizar o compartilhamento de recursos, ficou evidente que precisávamos co-localizar diferentes cargas de trabalho juntas em uma única plataforma de computação compartilhada.

Um planejador de recursos unificado nos permite gerenciar todos os tipos de cargas de trabalho para usar nossos recursos da forma mais eficiente possível.

Planejadores de cluster alternativo

O gerenciamento de cluster em larga escala tem sido um tema em alta nos últimos anos devido à crescente escala dos centros de dados e à ampla adoção de contêineres Linux. Existem quatro gerenciadores de cluster relacionados ao nosso trabalho: Google Borg, Kubernetes, Hadoop YARN e Apache Mesos/Aurora.

Arquiteturas do planejador de Cluster

A Figura 2, abaixo, compara quatro arquiteturas de planejador de cluster dividindo-as em seis áreas funcionais: execução de tarefas, alocação de recursos, preempção de tarefas, posicionamento de tarefas, ciclo de vida de trabalhos/tarefas e fluxos de trabalho no nível do aplicativo, como MapReduce:

Figura 2: Podemos comparar as arquiteturas dos quatro principais planejadores de cluster em seis áreas funcionais.

A alocação de recursos no Mesos é dividida em duas partes: alocação de granulação grosseira no nível do framework e alocação de granulação fina no nível do trabalho. Mesos usa o DRF para alocar recursos para frameworks, mas delega a alocação no nível de trabalho para cada framework.

Pelas seguintes razões, nenhum desses planejadores existentes atendeu às nossas necessidades:

  • Borg não é uma solução de código aberto, portanto, não poderíamos usá-lo.
  • O YARN é um planejador em lotes para o Hadoop sem suporte ou suporte muito limitado para trabalhos sem estado, com estado e daemon.
  • O Kubernetes não conseguiu escalonar para os grandes clusters exigidos pela Uber, ou seja, mais de 10.000, nem suporta o compartilhamento flexível/elástico de recursos. Também não é o planejador ideal para cargas de trabalho em lote, devido à natureza de alta rotatividade/mistura de trabalhos em lote.
  • O Mesos foi projetado para gerenciar clusters em vez de agendar cargas de trabalho. Sua alocação de recursos de baixa granularidade a frameworks é sub-ótima para nosso caso de uso porque não suporta o compartilhamento elástico de recursos e exige a criação de um planejador para cada carga de trabalho.

Então, nós construímos o Peloton, um planejador de recursos unificado que é executado no Mesos, para suportar nossas cargas de trabalho.

Visão geral do Peloton

O Peloton é construído sobre o Mesos, aproveitando-o para agregar recursos de diferentes hosts e iniciar tarefas como contêineres do Docker.

Para gerenciar recursos de todo o cluster com mais eficiência e agilizar as decisões de planejamento global, a Peloton usa pools de recursos hierárquicos para gerenciar recursos elásticos entre diferentes organizações e equipes.

A Figura 3, abaixo, mostra a arquitetura do Peloton em comparação com outros sistemas de gerenciamento de cluster:

Figura 3: Cobrindo ciclos de vida de tarefas, posicionamento de tarefas e preempção de tarefas, o Peloton atendeu melhor às nossas necessidades do que outros planejadores de cluster disponíveis.

Com o Peloton, seguimos a abordagem usada pelo Borg, com a principal diferença sendo o uso do Mesos como uma agregação de recursos e camada de execução de tarefas. Borg faz uso de seu próprio Borglet para execução de tarefas.

O Peloton adota uma abordagem semelhante ao trabalho do controlador Borg ou ao mestre de aplicação YARN (menos o gerenciamento do ciclo de vida do trabalho e da tarefa) para a extensibilidade de aplicativos especificados pelo usuário.

Arquitetura

Para obter alta disponibilidade e escalabilidade, o Peloton usa uma arquitetura ativo-ativa com quatro tipos de daemon separados: gerenciador de trabalho, gerenciador de recursos, mecanismo de posicionamento e gerenciador de host.

As interações entre esses daemons são projetadas de modo que as dependências sejam minimizadas e só ocorram em uma direção. Todos os quatro daemons dependem do Apache Zookeeper para a descoberta de serviços e a eleição do líder.

A Figura 4, abaixo, mostra a arquitetura de alto nível de Peloton construída sobre Mesos, Zookeeper e Cassandra:

Figura 4: O Peloton apresenta uma arquitetura ativa-ativa com vários clusters Mesos.

A arquitetura Peloton é composta pelos seguintes componentes:

  • O Peloton UI é uma interface do usuário baseada na web para gerenciar trabalhos, tarefas, volumes e pools de recursos no Peloton.
  • O Peloton CLI é uma interface de linha de comando para o Peloton com funcionalidade semelhante à interface baseada na web.
  • A Peloton API usa Protocol Buffers como a linguagem de definição de interface e YARPC como seu tempo de execução de RPC. Peloton UI, Peloton CLI e outras extensões Peloton são todas construídas sobre a mesma Peloton API.
  • O Host Manager abstrai os detalhes do Mesos de outros componentes do Peloton. Registra-se com o Mesos através da API HTTP do Mesos.
  • O Resource Manager mantém a hierarquia do pool de recursos e calcula periodicamente o direito/a titularidade de recurso de cada pool de recursos, que é, então, usado para planejar ou preemptar tarefas de maneira correspondente.
  • O Placement Engine encontra a colocação (ou seja, tarefa para mapeamento de host) levando em consideração as restrições de trabalho e tarefa, bem como os atributos do host. Os mecanismos de posicionamento podem ser plugáveis ​​para diferentes tipos de trabalho, como serviços com estado e trabalhos em lote.
  • O Job Manager manipula o ciclo de vida de trabalhos, tarefas e volumes. Ele também suporta atualizações contínuas de tarefas em um trabalho para serviços de longa duração.
  • O Storage Gateway fornece uma camada de abstração sobre diferentes backe-nds de armazenamento, para que possamos migrar de um back-end de armazenamento para outro sem uma alteração significativa no próprio Peloton. Nós temos um back-end padrão para o Cassandra integrado, mas podemos estendê-lo para outros backends.
  • Group Membership gerencia o conjunto de instâncias mestre do Peloton e elege um líder para registrar-se no Mesos como um framework e instanciar um gerenciador de recursos.

Todos os quatro daemons do Peloton têm garantias de alta disponibilidade com instâncias ativo-ativas ou topologia líder-seguidor. O Peloton garante que todas as tarefas sejam executadas pelo menos uma vez, mesmo após a falha de qualquer instância do aplicativo.

Para daemons do Peloton sem estado, como o Job Manager e o Placement Engine, qualquer falha de instância pode ser tolerada por seu mecanismo de repetição integrado.

A escalabilidade do Peloton tem algumas dimensões, incluindo o tamanho do cluster em número de hosts, o número de trabalhos e tarefas em execução e o rendimento máximo das decisões de planejamento e das tarefas de inicialização.

O Peloton visa oferecer suporte a trabalhos em lote em grande escala, por exemplo, milhões de tarefas ativas, 50.000 hosts e 1.000 tarefas por segundo.

O Job Manager e o Placement Engine podem ser dimensionados adicionando mais instâncias. Todas as solicitações de API para o Job Manager serão tratadas pelo backend de armazenamento, tornando a escalabilidade do backend de armazenamento essencial para o Peloton.

O gerenciador de recursos do Peloton tem um único líder, mas deve ser dimensionado para milhões de tarefas, uma vez que essas tarefas são mínimas, contando apenas com configuração de recursos e restrições de tarefas.

Além disso, todas as tarefas no gerenciador de recursos estão na memória, portanto, ele deve ser capaz de lidar com alta taxa de transferência de enfileiramento e desenfileiramento de tarefas.

Mesos é conhecido por escalar para cerca de 45.000 hosts ao executar cerca de 200.000 tarefas de longa duração que têm uma taxa de rotatividade/mistura muito baixa. No entanto, quando dimensionamos para tamanhos de cluster maiores, por exemplo, 50.000 hosts e trabalhos em lote altamente dinâmicos, o Mesos pode se tornar um gargalo devido ao design centralizado de seu canal principal e de evento único.

Em Peloton, Mesos é um agregador para todos os hosts, permitindo que o sistema gerencie recursos de múltiplos clusters de Mesos. Portanto, o Peloton pode ser dimensionado gerenciando vários clusters de Mesos que são bem dimensionados para o nosso perfil de carga de trabalho. Para o Peloton gerenciar vários clusters de Mesos, ele pode ter um conjunto de gerenciadores de host para cada cluster de Mesos.

A Figura 5, abaixo, mostra um exemplo de dimensionamento do Peloton gerenciando vários clusters de Mesos por meio de gerenciadores de host particionados/sharded:

Figura 5. Na implementação em escala, o Peloton pode gerenciar vários clusters Mesos e agendar trabalhos entre eles.

Gerenciamento elástico de recursos

O modelo de recursos do Peloton define como todos os recursos em um cluster são divididos entre usuários e trabalhos diferentes, além de como usuários diferentes podem compartilhar recursos de forma elástica. Existem dois mecanismos proeminentes de alocação de recursos que foram usados ​​em centros de dados de produção em larga escala: cota baseada em prioridade e equidade hierárquica max-min.

Este modelo foi adotado pelos sistemas de gerenciamento de cluster Borg e Aurora. Nesta abordagem, os recursos são divididos em duas cotas baseadas em prioridade: produção e não produção.

A capacidade total de cota de produção não pode ser maior que a capacidade total de um cluster. No entanto, a cota de não produção não é garantida em face da contenção de recursos em todo o cluster.

Com o Peloton, usamos a equidade hierárquica max-min para o gerenciamento de recursos, que é de natureza elástica.

A equidade max-min é um dos mecanismos de alocação de recursos mais amplamente utilizados para o gerenciamento de clusters, devido a suas capacidades de generalidade e isolamento de desempenho.

Muitos planejadores de cluster atuais, como o YARN, o VMware DRS e o DRF, proporcionam equidade máxima e mínima.

Usando essa abordagem na Uber, conforme mostrado na Figura 6, abaixo, todos os recursos em um cluster são divididos em diferentes organizações e depois subdivididos em diferentes equipes dentro dessa organização:

Figura 6: Implementamos a equidade hierárquica máxima-mínima para o gerenciamento de recursos no Peloton para compartilhar recursos entre diferentes organizações.

Cada organização tem uma garantia fixa de recursos e a prioridade do trabalho é aplicada dentro desse limite organizacional. Por exemplo, se uma organização não tiver trabalhos de alta prioridade, será dada uma garantia dos recursos para outros trabalhos com prioridade relativamente menor.

Esse modelo funciona muito bem com o chargeback/ressarcimento futuro e oferece mais flexibilidade a cada organização para definir suas cargas de trabalho dentro de seus limites de recursos.

Pools de recursos

Um pool de recursos no Peloton é uma abstração lógica para um subconjunto de recursos em um cluster. Todos os recursos em um cluster podem ser divididos em pools de recursos hierárquicos com base em organizações e equipes.

Um pool de recursos pode conter pools de recursos filhos hierárquicos para dividir ainda mais os recursos em uma organização. O compartilhamento de recursos entre pools é de natureza elástica – os pools de recursos com alta demanda podem emprestar recursos de outros pools se não estiverem usando esses recursos.

Cada pool de recursos tem diferentes dimensões de recursos, como as de CPUs, memória, tamanho de disco e GPUs. Esperamos que o número de dimensões de recursos aumente no futuro, caso o Mesos ofereça suporte a mais tipos de isolamento de recursos, como o IO do disco.

Conforme mostrado na Figura 7, abaixo, descrevemos quatro controles básicos de recursos para cada dimensão de recurso em um pool de recursos do Peloton:

  • Reserva é a garantia mínima de recursos para um pool de recursos. A reserva cumulativa de recursos em todos os pools não pode ser maior que a capacidade de um cluster.
  • Limite é o número máximo de recursos que um pool de recursos pode consumir a qualquer momento. Cada pool de recursos pode expandir mais do que sua reserva para esse limite, se o cluster tiver capacidade livre.
  • Compartilhar é o peso relativo que um pool de recursos tem o direito de alocar quando há capacidade livre no cluster.
  • Autorização define os recursos que um pool de recursos pode usar nesse momento. Esse controle muda a cada momento com base em cargas de trabalho em pools de recursos ou cluster.
Figura 7: O Peloton gerencia pools de recursos para equipes individuais em uma organização, usando Reserva, Limite e Compartilhar como controles.

Na Figura 8, abaixo, os gráficos demonstram como o compartilhamento elástico de recursos do Peloton empresta recursos de um pool de recursos para atender às demandas de outro em produção na Uber:

Figura 8: Com o compartilhamento elástico de recursos entre os pools de recursos da Equipe 1 e da Equipe 2, um pool de recursos pode emprestar recursos de outro caso sua demanda seja maior que a reserva garantida.

Existem dois gráficos para dois pools de recursos na Uber. Conforme mostrado na Figura 8, acima, quando a demanda do pool de recursos da Equipe 1 aumenta para um determinado serviço ou aumenta o número de trabalhos em lote, os recursos são emprestados dos pools de recursos da outra equipe.

Nessas situações, a alocação para a Equipe 1 aumenta além da reserva prometida (capacidade garantida); no entanto, quando a demanda aumenta no outro pool de recursos, os recursos retornam ao pool original. Isso pode ser obtido por preempção, o que é explicado na seção abaixo.

Preempção do pool de recursos

Hierarquias de pool de recursos elásticos nos permitem compartilhar recursos entre diferentes organizações. Cada organização tem seus próprios recursos designados e pools de recursos que podem emprestar a outras organizações quando seus recursos estão sendo subutilizados.

No entanto, o compartilhamento de recursos vem com o custo de não conseguir recuperar os recursos quando o credor precisar deles. Frequentemente, os planejadores aproveitam cotas estáticas para garantias de SLA mais rigorosas, como é o caso da Kubernetes e da Aurora.

Na Uber, optamos por compartilhar recursos entre as equipes e alcançar uma SLA mais rigorosa, permitindo a preempção no Peloton.

No Peloton, a preempção nos permite recuperar recursos de entidades que estão usando mais do que a atribuição/o loteamento atribuída/o, devolvendo-as ao credor original para suas necessidades de computação.

Peloton usa dois tipos de preempções:

  • Preempção do pool inter-recurso: este mecanismo impõe a equidade max-min em todos os pools de recursos. Aplica políticas de preempção nos recursos e reivindica recursos de retorno dos pools de recursos. O administrador do pool pode conectar diferentes políticas de preempção.
  • Preempção do pool intra-recurso: esse tipo de preempção impõe o compartilhamento de recursos em um pool de recursos com base nas prioridades do trabalho. Cada pool de recursos pode ter muitos usuários, com cada usuário executando muitos trabalhos.

Se um usuário ocupar toda a capacidade do pool de recursos, outros usuários poderão ter que esperar que esses trabalhos sejam concluídos antes que possam executar seus trabalhos. Isso levará a uma SLA perdida para os trabalhos que estão presos no pool.

Em outro cenário, trabalhos de prioridade mais baixa estão em execução e um trabalho de prioridade mais alta é recebido, exigindo que o planejador crie espaço para os trabalhos de prioridade mais alta. A preempção do pool intra-recurso preempta as tarefas de menor prioridade em um pool de recursos, se houver contenção de recursos.

Casos de uso do Peloton na Uber

O Peloton tem executado cargas de trabalho em lote em produção desde setembro de 2017 em clusters compostos por mais de 8.000 máquinas em diferentes zonas de disponibilidade. Todos os meses, esses clusters executam três milhões de trabalhos e 36 milhões de contêineres.

As cargas de trabalho da Peloton tratam de vários casos de uso em toda a Uber, cobrindo tudo, desde o nosso negócio cotidiano de compartilhamento de viagens até nossos projetos mais avançados, como o desenvolvimento de veículos autônomos.

Apache Spark

Peloton tem seu próprio driver Apache Spark, semelhante aos usados para YARN, Mesos e Kubernetes. O driver do Spark é executado como um trabalho controlador no Peloton, que adiciona e remove executores para o mesmo trabalho.

O serviço de shuffle do Spark é executado como um contêiner em todos os hosts. Na Uber, executamos milhões de trabalhos do Spark em produção todos os meses, usando o Peloton como um planejador de recursos, melhorando a eficiência de todos os trabalhos relacionados a mapas, marketplace e análise de dados.

Figura 9: Quando o Peloton executa um trabalho do Apache Spark, ele usa seu driver do Spark para agendar, priorizar e iniciar tarefas do executor.

TensorFlow

O Peloton suporta TensorFlow, agendamento de grupos e Horovod distribuídos, o framework TensorFlow, Keras e PyTorch distribuídos da Uber. O Peloton permite que esses frameworks instalem CPUs e GPUs no mesmo cluster e planejem cargas de trabalho mistas.

Para este projeto, o Peloton executa clusters muito grandes de mais de 4.000 GPUs e programa trabalhos de aprendizado profundos.

Figura 10: Em um exemplo em que o Peloton está executando um trabalho do TensorFlow distribuído usando o Horovod, o Peloton pode executar todas as tarefas usando o Mesos e fornecer um mecanismo para que eles se descubram.

A Figura 10, acima, mostra como um trabalho do TensorFlow distribuído é lançado no Peloton usando um preemptivo de planejamento de gangues/grupos, permitindo que ele planeje todas as tarefas ao mesmo tempo, enquanto fornece uma maneira de descobrirem um ao outro.

Executamos novamente os benchmarks oficiais do TensorFlow modificados para usar o Horovod e comparamos o desempenho com o TensorFlow distribuído regularmente.

Como mostrado na Figura 11, abaixo, observamos grandes melhorias em nossa capacidade de dimensionar no Peloton. Não estávamos mais desperdiçando metade dos recursos da GPU – na verdade, o dimensionamento usando os modelos Inception V3 e ResNet-101 alcançou uma marca de eficiência de 88%.

Em outras palavras, o treinamento do modelo foi cerca de duas vezes mais rápido do que o TensorFlow padrão distribuído devido ao Peloton.

Cargas de trabalho de veículos autônomos

Nosso planejador interno executava trabalhos em lote muito grandes, com 100.000 tarefas. Antes do Peloton, o Uber Advanced Technologies Group (ATG), nossa equipe responsável pelo desenvolvimento de sistemas de veículos autônomos, executava todas as suas cargas de trabalho em lote no planejador, com muitos clusters pequenos para tarefas. O Peloton consolidou todos esses pequenos clusters em um grande cluster com cerca de 3.000 hosts e unificou o processamento para todas as cargas de trabalho do planejador de diferentes equipes.

Mapas

O Peloton executa grandes cargas de trabalho em lote, como Spark e TensorFlow distribuído, para a equipe de Mapas da Uber. O Peloton alimenta todas essas cargas de trabalho em vários clusters e milhões de contêineres. As cargas de trabalho da equipe de Mapas têm necessidades muito específicas de preempção e compartilhamento hierárquico de recursos, bem como a colocação de GPUs e CPUs no mesmo cluster.

Marketplace

A equipe de Marketplace da Uber executa a plataforma que combina os motoristas com os passageiros para o nosso negócio de compartilhamento de viagens e determina preços dinâmicos. Essa equipe usa o Peloton para executar suas cargas de trabalho de preços, que são principalmente trabalhos do Spark, facilitando a baixa latência e o rápido rendimento/produtividade do cluster.

Próximos passos

Nos próximos meses, planejamos criar suporte de Peloton para outras cargas de trabalho, como sem estado e com estado. Também estamos trabalhando em um plano de controle, que será usado para implantar e orquestrar o Peloton no Mesos, um processo que agora é executado usando scripts de implantação.

Também estamos planejando migrar as cargas de trabalho do Mesos para o Kubernetes usando o Peloton, o que ajudaria na adoção do Peloton nos principais serviços em nuvem, já que o Kubernetes já desfruta de amplo suporte nesse domínio.

O Peloton já compartilha muitos padrões de design comuns com o Kubernetes em sua API, bem como a capacidade de atender a requisitos de escalabilidade mais altos. O design atual do Peloton tem muito poucas dependências em Mesos, exceto o agente Mesos, e Kubelet poderia trabalhar como agente em Peloton.

Nesta abordagem, podemos modelar o Peloton como uma implementação central mais dimensionável do Kubernetes:

  • Forneça uma API compatível com o Kubernetes no topo da API principal do Peloton.
  • Adicione uma nova implementação do gerenciador de host do Peloton que suporte o Kubelets.
  • Sistemas existentes, como Michelangelo, plataforma de aprendizado de máquina da Uber, ainda podem usar a API central nativa de Peloton.
Figura 12: Poderíamos migrar as cargas de trabalho do Mesos para o Kubernetes usando o Peloton para torná-lo mais amigável à nuvem.

Se você estiver interessado em construir uma infraestrutura de grande escala, considere a possibilidade de se candidatar a um cargo em nossa equipe!

***

Este artigo é do Uber Engineering. Ele foi escrito por Min Cai e Mayank Bansal. A tradução foi feita pela Redação iMasters com autorização. Você pode conferir o original em: https://eng.uber.com/peloton/