composição e arquitetura do hadoop

1. Composição do Hadoop

As três estruturas principais que compõem o Hadoop são MapReduce, YARN e HDFS, que são estruturas de computação distribuída, estrutura de agendamento de recursos e sistema de arquivos distribuídos, respectivamente.

1.1 Visão geral da arquitetura HDFS

Hadoop Distributed File System, abreviadamente HDFS, é um sistema de arquivos distribuído.
hdfs tem três serviços, nomeadamente NameNode, NameNode secundário e DataNode.
1) NameNode (nn): Processa solicitações de leitura e gravação do cliente, armazena metadados de arquivos, como nome do arquivo, estrutura de diretórios de arquivos, tempo de geração, número de cópias, permissões de arquivo, bem como a lista de bloqueios de cada arquivo e o DataNode onde o bloco está localizado, etc.
2) DataNode (dn): Armazena os blocos de dados reais e executa operações de leitura e gravação nos blocos de dados.
3) NameNode secundário (2nn): Faça backup de metadados do NameNode de vez em quando

1.2 Visão geral da arquitetura YARN

Yet Another Resource Negotiator, conhecido como YARN, é outro coordenador de recursos e é o gerenciador de recursos do Hadoop.
O fio possui quatro serviços, ResourceManager (gerenciador de recursos), NodeManager (gerenciador de nós), applicationmaster (gerenciador de tarefas), contêiner (contêiner) 1)
ResourceManager (rm): gerenciador de recursos de cluster (cpu, memória, etc.).
2) NodeManager (nm): Gerenciador de recurso de um único nó.
3) applicationMaster (am): O gerenciador de uma única tarefa executada.
4) Container: Um container equivale a um servidor independente, encapsulando os recursos necessários para as tarefas, como memória, CPU, disco, etc.

Pode haver vários clientes.
Vários applicationMasters podem ser executados no cluster.
Cada NodeManager pode ter vários contêineres.

1.3 Visão geral da arquitetura MapReduce

(1) MrAppMaster: Responsável pelo agendamento de processos e coordenação de status de todo o programa.
(2) MapTask: Responsável por todo o processo de processamento de dados na etapa Mapa.
(3) ReduzTask: Responsável por todo o processo de processamento de dados da etapa Reduzir.
MapReduce divide o processo de cálculo em dois estágios: Mapear e Reduzir
1) O estágio Map processa os dados de entrada em paralelo
2) O estágio Reduzir resume os resultados do Mapa

1.4 A relação entre HDFS, YARN e MapReduce

O cliente envia a tarefa ao gerenciador de recursos (ResourceManager).
Depois de receber a tarefa, o gerenciador de recursos vai para o nó NodeManager para iniciar a tarefa (ApplicationMaster).
O ApplicationMaster solicita recursos do ResourceManager. Se houver recursos, o ApplicationMaster é responsável por iniciar a tarefa, nomeadamente MapTask.
Cada mapa funciona de forma independente e é responsável por recuperar seu DataNode correspondente e registrar os resultados no HDFS.DataNode
é responsável pelo armazenamento, NameNode é responsável pela gravação e 2nn é responsável por fazer backup de alguns dados.

2HDFS

HDFS (Hadoop Distributed File System) é um sistema de arquivos distribuído adequado para cenários de gravação e leitura única.

2.1 Vantagens e desvantagens do HDFS

Vantagens:
1) Alta tolerância a falhas
. Os dados são salvos em múltiplas cópias. Quando algumas máquinas do cluster estão inativas, os dados podem ser obtidos de outras máquinas que estão funcionando normalmente. 2)
Adequado para processar big data
dividindo arquivos grandes em pequenos blocos de dados. Quando armazenado em servidores diferentes, um arquivo grande pode ser armazenado. Ao mesmo tempo, a grande capacidade de todo o sistema de armazenamento pode ser alcançada combinando vários discos rígidos de vários servidores. Arquivos grandes podem ser armazenados em fragmentos. Diferentes os shards podem realizar operações paralelas de leitura e gravação, obtendo assim acesso de alta velocidade aos dados.
O NameNode é responsável pela operação dos metadados do arquivo, e o DataNode é responsável pelo processamento de solicitações de leitura e gravação de arquivos. O fluxo de dados do arquivo não será processado pelo NameNode, mas será contatado apenas pelo DataNode específico armazenado nele. Portanto, , o NameNode não se tornará o gargalo do sistema. Cada nó DataNode lida com a leitura e gravação de fluxos de dados de conteúdo de arquivo e seu rendimento é bastante melhorado.
3) Confiabilidade

Desvantagens
1) Não é adequado para acesso a dados em tempo real
2) Não é possível armazenar um grande número de arquivos pequenos. Armazenar
um grande número de arquivos pequenos ocupará uma grande quantidade de memória NameNode para armazenar informações de metadados.
O tempo de endereçamento para armazenamento de arquivos pequenos excederá o tempo de leitura.

Melhor teoria de perda de transmissão: Em uma transmissão, quando o tempo de endereçamento ocupa 1% do tempo total de transmissão, a perda dessa transmissão é a menor, que é a transmissão com melhor custo-benefício!
De acordo com as atuais condições de desenvolvimento de hardware, a taxa de gravação de discos comuns é de cerca de 100M/S e o tempo de endereçamento é geralmente de 10ms!
(10ms / 1%) * 100M/S = 100M

3) A gravação simultânea não é suportada e os arquivos são modificados aleatoriamente.
Vários threads não têm permissão para gravar em um arquivo ao mesmo tempo. Somente anexação é suportada e modificação não é suportada.

2.2 Processo de gravação de dados HDFS

(1) O cliente solicita que o NameNode faça upload de arquivos através do módulo Distributed FileSystem. O NameNode verifica se o arquivo de destino existe e se o diretório pai existe e retorna o resultado. (2) O cliente solicita quais DataNodes o bloco deve ser carregado
para, e NameNode retorna o nó DataNode.
(3) O cliente solicita que dn1 carregue dados através do módulo FSDataOutputStream. Quando dn1 recebe a solicitação, ele continuará a chamar dn2 e, em seguida, dn2 chama dn3 para concluir o estabelecimento desta comunicação gasoduto. dn1, dn2 e dn3 respondem ao cliente passo a passo.
(4) O cliente começa a carregar o primeiro bloco para dn1 (primeiro lê os dados do disco e coloca-os em um cache de memória local).Tomando o pacote como unidade, dn1 irá passá-lo para dn2 após receber um pacote, e dn2 irá passá-lo para dn3; dn1 Cada pacote transmitido será colocado em uma fila de resposta aguardando uma resposta.
(5) Após a transmissão de um bloco ser concluída, o cliente solicita novamente ao NameNode que carregue o segundo bloco para o servidor.

2.3 Processo de leitura de dados HDFS

(1) O cliente solicita que o NameNode baixe o arquivo através do DistributedFileSystem, e o NameNode encontra o endereço do DataNode onde o bloco do arquivo está localizado consultando os metadados.
(2) Selecione um servidor DataNode (então aleatório) com base no princípio mais próximo e solicite a leitura dos dados.
(3) DataNode começa a transmitir dados para o cliente (lê o fluxo de entrada de dados do disco e realiza a verificação em unidades de pacote).
(4) O cliente recebe o pacote em unidades de pacote, primeiro armazena-o em cache localmente e depois o grava no arquivo de destino.

3MapaReduzir

3.1 Vantagens e Desvantagens do MapReduce

Vantagens:
1) Fácil de programar: Programas distribuídos podem ser concluídos simplesmente implementando algumas interfaces.
2) Boa escalabilidade: Quando os recursos computacionais são insuficientes, as capacidades podem ser melhoradas adicionando máquinas.
3) Alta tolerância a falhas: Se uma máquina desligar, ela pode transferir a tarefa de computação acima para outro nó para execução, para que a tarefa não falhe. Este processo é concluído internamente pelo Hadoop.
4) Adequado para processamento off-line de dados massivos acima do nível PB.
Desvantagens:
1) Não é bom em computação em tempo real
2) Não é bom em computação de streaming: Porque as características de design do próprio MapReduce determinam que a fonte de dados deve ser estática.
3) Não é bom para cálculo de gráfico acíclico direcionado: MapReduce não é bom para converter a entrada do último aplicativo na saída do anterior, porque o resultado de saída de cada trabalho MapReduce será gravado no disco, o que causará muito de E/S do disco e levam a um desempenho muito ruim.

3.2 Ideias centrais do MapReduce

(1) Os programas de computação distribuída muitas vezes precisam ser divididos em pelo menos dois estágios, o estágio de mapa e o estágio de redução.
(2) Instâncias simultâneas de MapTask na fase de mapa são executadas em paralelo e são independentes umas das outras.
(3) As instâncias simultâneas de ReduceTask na fase de redução são independentes umas das outras, mas seus dados dependem da saída de todas as instâncias simultâneas de MapTask na fase anterior.
(4) O modelo de programação MapReduce pode conter apenas um estágio Map e um estágio Reduzir. Se a lógica de negócios do usuário for muito complexa, apenas vários programas MapReduce poderão ser executados em série.
Resumo: Analise a tendência do fluxo de dados do WordCount para compreender profundamente as ideias centrais do MapReduce.

3.3 Processo MapReduce

Um programa MapReduce completo possui três tipos de processos de instância quando executado de forma distribuída:
(1) MrAppMaster: Responsável pelo agendamento de processos e coordenação de status de todo o programa.
(2) MapTask: Responsável por todo o processo de processamento de dados na etapa Mapa.
(3) ReduzTask: Responsável por todo o processo de processamento de dados da etapa Reduzir.

3.4 Princípio da estrutura MapReduce

3.4.1 Mecanismo de determinação de paralelismo MapTask

O fatiamento de dados apenas fatia logicamente a entrada e não a divide em fatias para armazenamento em disco. Fatia de dados é a unidade usada pelo programa MapReduce para calcular os dados de entrada. Cada fatia iniciará um MapTask correspondentemente.

1) O paralelismo da fase de mapa de um trabalho é determinado pelo número de fatias quando o cliente envia o trabalho.
2) Cada fatia dividida recebe uma instância paralela mapTask para processamento.
3) Por padrão, o tamanho da fatia = tamanho do bloco.
4) A fatia é fatiada para cada arquivo.

3.4.2 Análise de fatia FileInputFormat

1) O programa primeiro encontra o diretório de armazenamento de dados
2) Percorre cada arquivo no diretório
3) Percorre o primeiro arquivo
(1) Obtém o tamanho do arquivo
(2) Calcula o tamanho da fatia (por padrão tamanho da fatia = tamanho do bloco)
(3) Cada tempo Ao fatiar, é necessário determinar se a parte restante é maior que 1,1 vezes o bloco. Caso contrário, divida-o em uma fatia (4)
Escreva as informações de fatiamento em um arquivo de planejamento de fatiamento
(5) O processo principal de fatiamento é concluído no método getSplit()
(6) InputSplit registra apenas as informações de metadados da fatia (posição inicial, comprimento, nó, etc.)
4) Envie o arquivo de planejamento de fatiamento para o fio, e o MrAppMaster do fio inicia o mapTask correspondente com base em o arquivo de planejamento de fatiamento.

3.4.3 Classe de implementação TextInputFormat

As classes comuns de implementação de interface de FileInputFormat incluem: TextInputFormat, KeyValueTextInputFormat, NLineInputFormat, CombineTextInputFormat e InputFormat personalizado, etc.
1) TextInputFormat
TextInputFormat é a classe de implementação FileInputFormat padrão. Leia cada registro linha por linha. A chave é o deslocamento do byte inicial em todo o arquivo onde a linha está armazenada, do tipo LongWritable. O valor é o conteúdo desta linha, excluindo quaisquer terminadores de linha (caracteres de avanço de linha e retorno de carro), tipo Texto.

TextInputformat usa o deslocamento inicial de cada linha no arquivo como chave e o conteúdo de cada linha como valor. Por padrão, \n ou a tecla Enter é usada como uma linha de registros.

2) KeyValueTextInputFormat
KeyValueTextInputFormat é uma classe de implementação de FileInputFormat. Cada linha é um registro e é dividida em chave e valor pelo delimitador.
Você pode definir o separador definindo conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, "\t") na classe do driver.

KeyValueTextInputFormat é adequado para processar dados de entrada. Cada linha possui duas colunas e é separada por tabulações.

3) NLineInputFormat
Se NlineInputFormat for usado, o InputSplit processado por cada processo de mapa não será mais dividido por blocos de blocos, mas pelo número de linhas N especificado por NlineInputFormat.

4) CombineTextInputFormat
CombineTextInputFormat é usado em cenários onde há muitos arquivos pequenos.Ele pode planejar logicamente vários arquivos pequenos em uma fatia, de modo que vários arquivos pequenos possam ser entregues a um MapTask para processamento.

3.4.4 Mecanismo de fatiamento CombineTextInputFormat

Configuração do valor máximo da fatia de armazenamento virtual

CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);

(1) Processo armazenado virtual:
Compare os tamanhos de todos os arquivos no diretório de entrada com o valor definido setMaxInputSplitSize por sua vez. Se não for maior que o valor máximo definido, divida-o logicamente em um bloco. Se o arquivo de entrada for maior que o valor máximo definido e mais que o dobro do valor máximo, um bloco será cortado de acordo com o valor máximo; quando o tamanho dos dados restantes exceder o valor máximo definido e não for maior que o dobro do valor máximo, o arquivo é dividido em dois blocos de armazenamento virtual (para evitar que apareçam fatias muito pequenas).
Por exemplo, se o valor setMaxInputSplitSize for 4M e o tamanho do arquivo de entrada for 8,02M, ele será logicamente dividido em arquivos de 4M. O tamanho restante é 4,02 M. Se dividido de acordo com a lógica 4 M, um pequeno arquivo de armazenamento virtual de 0,02 M aparecerá, então o arquivo restante de 4,02 M será dividido em dois arquivos (2,01 M e 2,01 M).
(2) Processo de fatiamento:
(a) Determine se o tamanho do arquivo do armazenamento virtual é maior que o valor setMaxInputSplitSize. Se for maior ou igual ao valor, uma fatia separada será formada.
(b) Se não for maior, mescle-o com o próximo arquivo de armazenamento virtual para formar uma fatia.

3.5 Fluxo de trabalho MapReduce

O fluxo de trabalho do MapReduce consiste na fase de envio, na fase mapTask, na fase de embaralhamento e na fase de redução.

3.5.1 fase mapTask

1) O cliente envia fatias, pacotes jar e arquivos xml para o fio, e MrAppMaster obtém as informações da fatia e abre o número correspondente de mapTasks.
2) mapTask chama o método read() de RecordReader por meio de InputFormat para ler dados externos e analisar a chave/valor.
3) Quando o processamento de dados for concluído, chame OutputCollector.collect() para gerar o resultado. Ele particionará a chave/valor gerada e a gravará no buffer de memória anelar.

3.5.2 fase aleatória

4) Quando o buffer circular atingir 80%, o MapReduce gravará os dados no disco local e gerará um arquivo temporário.
5) Dentro do buffer circular, os dados serão particionados e classificados. Use o algoritmo de classificação rápida para classificar os números das partições e, em seguida, classificar as chaves. Isso garante que todos os dados na mesma partição sejam ordenados de acordo com a chave.
Escreva os dados em cada partição no arquivo temporário splashN.out no diretório de trabalho da tarefa em ordem crescente de acordo com o número da partição. Se Combiner estiver definido, os dados nas partições serão mesclados antes de serem gravados no arquivo.
As informações de metadados na partição serão gravadas na estrutura de dados do índice de memória SpillRecord. Se o tamanho do índice de memória atual exceder 1 MB, o índice de memória será gravado no arquivo output/spillN.out.index.
6) Quando todo o processamento de dados for concluído, o MapTask mescla todos os arquivos temporários em um arquivo grande e gera os arquivos de índice correspondentes.
MapTask mescla em unidades de partição. Para uma determinada partição, serão usadas várias rodadas de fusão recursiva. Mesclar 10 arquivos em cada rodada e adicionar os arquivos resultantes de volta à lista a ser mesclada.Depois de classificar os arquivos, repita o processo acima até finalmente obter um arquivo grande.

3.5.3 fase de redução

7) O Reduzir extrairá seus próprios dados do maptask de acordo com sua própria partição. Se seu tamanho exceder um determinado limite, ele será gravado no disco, caso contrário, será colocado diretamente na memória.
8) Ao extrair dados, o ReduceTask inicia dois threads em segundo plano para mesclar arquivos na memória e no disco para evitar o uso excessivo de memória ou muitos arquivos no disco.
9) Quando a mesclagem for concluída, a função reduzir() grava os resultados do cálculo no HDFS.

4 FIOS

4.1 Mecanismo de funcionamento do FIO

(1) O programa MR é submetido ao nó onde o cliente está localizado.
(2) YarnRunner se inscreve para um aplicativo do ResourceManager.
(3) RM retorna o caminho do recurso do aplicativo para YarnRunner.
(4) Envie os recursos necessários para operação ao HDFS. Após o envio dos recursos, inscreva-se para executar o mrAppMaster.
(5) O RM inicializa a solicitação do usuário em uma tarefa.
(6) Um dos NodeManagers recebe a Task e cria um container Container para gerar o MRAppmaster.
(7) O contêiner copia recursos do HDFS para o local. MRAppmaster se aplica ao RM para executar recursos MapTask.
(8) O RM atribui a tarefa MapTask em execução a dois outros NodeManagers e cria contêineres.
(9) MR envia o script de inicialização do programa para os dois NodeManagers que receberam a tarefa.Os dois NodeManagers iniciam o MapTask respectivamente, e o MapTask classifica as partições de dados.
(10) MrAppMaster espera que todos os MapTasks terminem de ser executados, então solicita um contêiner do RM e executa o ReduceTask.
(11)ReduceTask obtém os dados da partição correspondente do MapTask.
(12) Após a conclusão do programa, a MR solicitará o cancelamento à RM.

4.2 Processo de envio de trabalhos do YARN

(1) Envio de trabalho:
O cliente envia um trabalho para o fio.
Etapa 1: O cliente chama o método job.waitForCompletion para enviar um trabalho MapReduce para todo o cluster. e solicite um ID de emprego.
Etapa 2: RM retorna o caminho de envio e o ID do trabalho do recurso de trabalho para o Cliente.
Etapa 3: o cliente envia o pacote jar, as informações do slice e o arquivo XML para o caminho de envio de recurso especificado. Após enviar os recursos, solicite ao RM para executar o MrAppMaster.

(2) Inicialização do job
Etapa 6: Após o RM receber a solicitação do cliente, adicione o job ao agendador.
Passo 7: O NM ocioso recebe o job, cria um Container, gera um MRAppmaster e baixa os recursos enviados pelo Cliente para o local.

(3) Alocação de tarefas
Etapa 10: MrAppMaster aplica-se ao RM para recursos para executar várias tarefas MapTask.
Etapa 11: RM atribui a tarefa de executar MapTask a dois outros NodeManagers, e os outros dois NodeManagers recebem as tarefas e criam contêineres respectivamente.

(4) Tarefa em execução
Etapa 12: MR envia o script de inicialização do programa para os dois NodeManagers que receberam a tarefa.
Etapa 13: Depois que MrAppMaster esperar que todos os MapTasks terminem de ser executados, solicite um contêiner do RM e execute o ReduceTask.
Etapa 14: ReduceTask obtém os dados da partição correspondente do MapTask.
Etapa 15: Após a conclusão da execução do programa, o MR solicitará o cancelamento do RM.

(5) Atualizações de progresso e status.
As tarefas no YARN retornam seu progresso e status (incluindo contador) ao gerenciador de aplicativos. O cliente solicita atualizações de progresso do gerenciador de aplicativos a cada segundo e as exibe ao usuário.

(6) Conclusão do trabalho
Além de solicitar o progresso do trabalho ao gerenciador de aplicativos, o cliente verificará se o trabalho foi concluído chamando waitForCompletion() a cada 5 segundos. Após a conclusão do trabalho, o gerenciador de aplicativos e o Container limparão o status do trabalho. As informações do trabalho serão armazenadas pelo servidor de histórico de trabalhos para verificação posterior do usuário.

4.3 Agendador YARN e algoritmo de agendamento

Existem três tipos principais de agendadores de tarefas Hadoop: FIFO, capacidade (Capacity Scheduler) e imparcialidade (Fair Scheduler).
O agendador de recursos padrão do Apache Hadoop3.1.3 é o agendador de capacidade, e
o agendador padrão da estrutura CDH é o agendador justo.
1. Agendador FIFO (First In First Out): Fila única, primeiro a chegar, primeiro a ser atendido de acordo com a ordem em que os trabalhos são enviados.

2. Agendador de capacidade: É um agendador multiusuário desenvolvido pelo Yahoo.
Características
Múltiplas filas: Cada fila pode ser configurada com uma certa quantidade de recursos, e cada fila adota uma estratégia de agendamento FIFO.
Garantia de capacidade: Os administradores podem definir recursos para cada fila para garantir recursos mínimos e limites superiores de uso de recursos.
Flexibilidade: Se os recursos em uma fila Se houver algum restante, esses recursos podem ser compartilhados com a fila que precisa dos recursos. Se um novo aplicativo for enviado para a fila, os recursos correspondentes serão recuperados. Multiusuário: Suporta clusters compartilhados multiusuário
e execução simultânea de vários aplicativos. Para evitar que o trabalho de um usuário monopolize recursos, o escalonador limita a quantidade de recursos ocupados pelos trabalhos enviados pelo mesmo usuário.

2.1 Algoritmo de Alocação de Recursos
(1) Alocação de Recursos da Fila: A partir da raiz, o algoritmo de profundidade é usado, e a fila com a menor taxa de ocupação de recursos tem prioridade para alocar recursos.
(2) Alocação de recursos de trabalho: Por padrão, os recursos são alocados na ordem de prioridade e tempo de envio dos trabalhos enviados.
(3) Alocação de recursos de capacidade: Aloque recursos de acordo com a prioridade do contêiner. Se as prioridades forem as mesmas, o princípio da localidade dos dados é seguido. 1) As tarefas
e os dados estão no mesmo nó.
2) As tarefas e os dados estão no mesmo nó. no mesmo rack.
3) Tarefas e dados não estão no mesmo nó. Não estão no mesmo rack


3. Recursos do agendador justo :
Múltiplas filas: Cada fila pode ser configurada com uma certa quantidade de recursos, e cada fila adota uma estratégia de agendamento FIFO.Garantia de
capacidade: Os administradores podem definir recursos para cada fila para garantir recursos mínimos e limites superiores de uso de recursos. Flexibilidade
: Se houver recursos restantes em uma fila, esses recursos podem ser compartilhados com a fila que precisa dos recursos. Se um novo aplicativo for enviado para a fila, os recursos correspondentes serão recuperados. Multiusuário: Suporta compartilhamento multiusuário clusters e execução simultânea de vários aplicativos
. Para evitar que o trabalho de um usuário monopolize recursos, o escalonador limita a quantidade de recursos ocupados pelos trabalhos enviados pelo mesmo usuário.

Método de alocação de recursos de fila:
(1) Estratégia FIFO. Este método é consistente com o escalonador de capacidade.
(2) Estratégia justa. A estratégia justa é um método de multiplexação de recursos baseado no algoritmo justo max-min. Por padrão, este método é usado para alocar recursos internamente em cada fila.

Processo de alocação de recursos:
1. Selecione a fila
2. Selecione o trabalho
3. Selecione o contêiner
Etapas de implementação:
Calcule a participação mínima real de recursos do objeto de comparação, se está com fome, proporção de alocação de recursos, proporção de peso de uso de recursos.
Se houver fome, fome tem prioridade.
Se nenhum deles estiver com fome, então aquele com o menor peso de uso de recursos terá prioridade. Se eles forem iguais, a ordem do tempo de envio será dada.
Se ambos estiverem com fome, aquele com a menor alocação de recursos terá prioridade. será dada prioridade. Se forem iguais, será dada prioridade àquele com menor alocação de recursos.
(3) Política DRF

おすすめ

転載: blog.csdn.net/shenBaoYun/article/details/125747611