View - IFBa
Transcrição
View - IFBa
Análise Arquitetural do Hadoop File System João Carlos Nascimento Pacheco Vinícius Azevedo de Melo Instituto Federal da Bahia (IFBA) Salvador, Bahia, Brasil. [email protected] Instituto Federal da Bahia (IFBA) Salvador, Bahia, Brasil. [email protected] Resumo—A cada dia, novas barreiras vêm sendo ultrapassadas na área da tecnologia da informação e paralela a esta questão, o aumento na quantidade e complexidade dos serviços oferecidos na Web, consequentemente levando a uma grande quantidade de informação a ser gerenciada. Para o processamento destas informações, escalabilidade, tolerância a falhas, alta disponibilidade de armazenamento dentre outros, são fatores importantíssimos que precisam ser avaliados, já que mecanismos convencionais que fazem gerenciamento de dados não oferecem tal suporte almejado. Eis que uma das soluções existentes atualmente é o Apache Hadoop, um arcabouço para o armazenamento e processamento de dados em larga escala. Ele oferece como ferramentas principais o MapReduce, responsável pelo processamento distribuído, e o Hadoop Distributed File System (HDFS), para armazenamento de grandes conjuntos de dados, também de forma distribuída. Keyword – Hadoop, HDFS, MapReduce. I. INTRODUÇÃO Uma das grandes barreiras encontradas atualmente no mundo da tecnologia da informação está em armazenar e gerenciar de forma inteligente a grande quantidade de informações que vêm sendo disponibilizada. Sistemas de mídias sociais, serviços corporativos, sistemas Web, dentre outros, vêm produzindo uma quantidade gigantesca de dados. A maioria destes dados se encontra armazenada em uma forma não estruturada e em sistemas, linguagens e formatos heterogêneos, em muitos casos, incompatíveis entre si. [3]. É neste cenário que surge o Apache Hadoop, um framework para o processamento de grande quantidade de informações em aglomerados computacionais, com objetivo de prover soluções para os sistemas distribuídos. Ele oferece como ferramentas principais o MapReduce, responsável pelo processamento distribuído, e o HDFS, para armazenamento de grandes conjuntos de dados, também de forma distribuída. [2] Com base nestas breves informações, o intuito deste artigo consiste em analisar como são desempenhadas as tarefas de processamento, armazenamento, gerência e transferência dos dados do HDFS, através da extração de duas view-points distintas, sendo a primeira estrutural e a segunda, uma visão de implantação, para que ambas nos permitam avaliar como o HDFS cumpre os requisitos funcionais e não funcionais definidos em seu projeto. Este trabalho está estruturado da seguinte forma: Na próxima seção está descrito o que consiste de fato o HDFS, e quais são seus objetivos, requisitos funcionais e não funcionais. Na seção conseguinte duas visões arquiteturais foram extraídas do HDFS e demonstradas com o intuito de destacar possíveis estilos, padrões arquiteturais, componentes, conectores e configuração final obtida. Posteriormente, uma demonstração de como foi realizado o mapeamento do modelo arquitetural nos artefatos de implementação do HDFS e por fim, discussões e soluções alternativas serão pontuadas com base em uma visão comparativa crítica. II. HDFS Um sistema gerenciador de arquivos convencional tem em suas premissas um conjunto de funcionalidades, como por exemplo, armazenamento, organização, nomeação, compartilhamento, recuperação, permissão e proteção aos arquivos geridos de forma que todo este processo ocorra de maneira mais “transparente” possível ao usuário. [3] Já um sistema gerenciador de arquivos distribuído deve além de possuir as premissas descritas acima, permitir o armazenamento e o compartilhamento desses arquivos em diversos hardwares diferentes, interconectados por meio de uma rede. O HDFS foi inspirado no Google File System e projetado para ser implantado em hardware de baixo custo, organizados dentro de um cluster. Cada cluster contém um único Namenode, que é o componente de software responsável por armazenar em memória os metadados referentes à localização dos arquivos gerenciados, manter a integridade do sistema e responder requisições dos clientes que desejam fazer operações com os arquivos. [2] Os dados físicos estão propriamente armazenados nos nós do cluster denominados Datanodes. Estes nós, dentro do conceito trazido pelo Hadoop são máquinas comuns, numa combinação aceitável de aproximadamente dez mil trabalhando em paralelo, que podem ser substituídas ou adicionadas ao cluster de acordo com a demanda de armazenamento e à medida que apresentarem eventuais problemas. [2] O Namespace de um HDFS consiste em registros que armazenam metadados de arquivos, tais como: localização, permissões de acesso, data de acesso e modificação, e cotas de espaço em disco. Estes registros são chamados de Inodes, e são mantidos em memória RAM pelo Namespace. A decisão arquitetural de manter o Namespace separado dos dados foi tomada para permitir a escalabilidade do sistema, visto que, o acesso aos metadados é mais rápido em relação à transferência de arquivos inteiros. [1] [2] O processo de leitura dos dados dá-se através do HDFS Client que solicita ao Namenode um arquivo, este retorna uma lista de Datanodes, contendo os blocos daquele arquivo. De posse desta lista, o HDFS Client conecta-se diretamente aos respectivos Datanodes detentores dos blocos e efetua a leitura dos dados. Quando um cliente solicita uma operação de leitura, o Namenode envia as informações necessárias para que a leitura seja efetuada juntamente com um checksum do bloco que está sendo lido, para que o cliente leitor verifique a sua integridade. Caso o bloco não esteja íntegro, o cliente notifica o Namenode, que por sua vez envia um novo checksum de outro Datanode que possua uma réplica do mesmo bloco. [2] O processo de escrita de dados em arquivos ocorre de forma similar: o HDFS Client solicita ao Namenode a escrita do primeiro bloco do arquivo no sistema e tem como resposta uma lista de Datanodes para armazenar as réplicas daquele bloco. [2] Outro detalhe relevante é que cada bloco de informação enviado pelo cliente é seguido de um checksum como forma de verificar a integridade do bloco de dados no momento que ele chega a cada Datanode. Este checksum é guardado separadamente dos metadados das informações de fato, que o cliente escreveu no arquivo. [2] Espera-se que o Namenode organize as réplicas em Datanodes espalhados em máquinas e em racks diferentes, de modo a aumentar a disponibilidade destes arquivos quando solicitados, visto que, no procedimento de leitura de um arquivo, são escolhidos os Datanodes mais próximos do cliente que fez a solicitação. O uso de réplicas também garante que dados não serão perdidos em caso de falha de um nó. [1] [2] Adiante, os Datanodes ainda enviam Blockreports e Heartbeats para o Namenode. O primeiro consiste em informações sobre as réplicas dos blocos dos arquivos que cada Datanode possui, por padrão, um Blockreport é enviado assim que o Datanode se registra, depois disso, é agendado um envio de hora em hora. Desta forma o Namenode consegue manter-se atualizado com relação aos arquivos disponíveis no sistema. [1]. Já um Heartbeat tem por finalidade informar ao Namenode que o respectivo Datanode que o enviou está ativo, permitindo manter a integridade do sistema, visto que, Datanodes que não enviam Heartbeats por cerca dez minutos são desativados e, se necessário, o Namenode cria novas replicas em outros nós para substituir aquele Datanode. [2] Um Heartbeat contém informações importantes sobre o respectivo Datanode que viabilizam as ações de balanceamento tomadas pelo Namenode, tais como: capacidade total de armazenamento, quantidade de espaço em uso e volume de dados em tráfego decorrente de operações de leitura e/ou escrita em andamento. [2] III. PROJETO ARQUITETURAL A escolha dos Datanodes leva em consideração questões como balanceamento de uso de espaço em disco e distância física até o cliente solicitante. Ao receber os possíveis destinos de escrita dos dados, o HDFS Client organiza um pipeline de instruções e os envia para os respectivos Datanodes. Este processo se repete para cada bloco de arquivo a ser escrito e os Datanodes escolhidos para o armazenamento podem variar. [2] Um detalhe relevante é que quando um cliente está escrevendo informações no arquivo a ser enviado, somente ele poderá fazer este procedimento e nenhum outro cliente em paralelo poderá fazer o mesmo procedimento, garantindo um dos requisitos funcionais, denominado Write-Once-ReadMany. [2] Os arquivos armazenados pelo HDFS geralmente são divididos em blocos e cada bloco é replicado em três Datanodes distintos, por padrão. [1] [2] Figura 1 – Visão Estrutural Os protocolos disponibilizados pela camada core exibida na Figura 1 servem para padronizar a comunicação interna e viabiliza a adição ou substituição de novos componentes, desde que eles utilizem o mesmo conjunto de protocolos. O HDFS atende a um estilo de arquitetura em camadas observando que a aplicação acessa a interface provida pelo HDFS Core, que por sua vez compõe o núcleo do sistema, que integra o Namenode, Datanodes e os demais componentes por meio dos protocolos NamenodeProtocol e DatanodeProtocol. [8] A escrita em arquivo por parte do HDFS Client utiliza-se do estilo arquitetural Pipe-and-Filter. À medida que é formado um pipe entre os nós para os quais os dados vão ser persistidos, e estes fluem dos nós mais próximos para os mais remotos, considerando-se distância calculada através da topologia de rede, o primeiro nó recebe os dados, guarda para si os que são destinados a ele e repassa adiante os que devem chegar aos nós adjacentes. [2] Este fluxo de dados entre os nós do pipe configura a utilização de um conector do tipo stream. O Hadoop Pipe é uma solução fornecida pelo projeto Hadoop, que cria um pipe composto de jobs, e pode ser utilizado pelo HDFS Client para realizar a tarefa de escrita de arquivos. A seguir estão listados os pares que se comunicam utilizando os estilos arquiteturais acima descritos: HDFS Client e Namenode - uso de conector NamenodeProtocol, que utiliza os conectores remote procedure call - ipc (utilizando a Lib IPC), HTTP, arbitrator, distributor e stream. HDFS Client e Datanodes - uso de conector do tipo DatanodeProtocol para envio de recebimento de dados, utilizando os conectores remote procedure call - ipc e stream. Datanodes e Namenode - uso de conector DatanodeProtocol para envio de Heartbeats e Blockreports dos Datanodes para o Namenode. No sentido contrário, em resposta aos Datanodes, o Namenode utiliza o conector NamenodeProtocol para passar instruções aos nós sobre o que fazer (armazenar arquivo, ligar, desligar, enviar relatório com urgência). Backupnodes e Namenode - há uma sincronização em tempo de execução em que o Backupnode conecta-se ao Namenode através de um conector NamenodeProtocol e obtém as informações contidas no Namenode. Balancer e Datanodes - uso do conector DatanodeProtocol e InterDatanodeProtocol para estabelecer conexão, coordenar, distribuir atividades de balanceamento entre Datanodes e permitir o fluxo de dados entre os mesmos. Os componentes HDFS Client, Namenode, Balancer e Datanodes, possuem um interpretador de comandos para efetuar suas atividades quando invocados, atendendo, portanto ao estilo arquitetural Basic Interpreter. [8] Isto permite, por exemplo, que o administrador mude em tempo de execução algum parâmetro de funcionamento do sistema e ordene ao Balancer que verifique novamente como está balanceamento dos dados. Esse estilo permite que novos comandos sejam adicionados em cada artefato sem impacto sobre a arquitetura. O funcionamento do HDFS Client é voltado para uma execução em lote das requisições, uma vez que a interação com o usuário não é prioridade, desta forma o estilo arquitetural Batch Sequential é utilizado, priorizando-se a vazão dos dados em detrimento do tempo de resposta ao cliente. [4] A possibilidade de uso do protocolo HTTP provida pelo NamenodeProtocol para acesso à suas informações consiste em uma aplicação do estilo arquitetural Cliente Servidor. Este protocolo pode ser utilizado pelo Backupnode e pelo HDFS Client, como faz o WebHDFS Ainda de acordo com a figura 1, considerando os conectores existentes, temos os seguintes valores de dimensão: O conector do tipo remote procedure call - ipc utilizado pelos protocolos NamenodeProtocol, DatanodeProtocol e InterDatanodeProtocol utiliza passagem de parâmetro por referência, invocação explícita, acesso público e chamadas síncronas com único ponto de entrada. [7] O conector do tipo stream utilizado pelos protocolos DatanodeProtocol e InterDatanodeProtocol utiliza buffer de 64kb, entregando unidades atômicas aqui denominadas blocos em formato raw, não guardando estado das conexões efetuadas, e atuando de forma remota realizando transferência síncrona com tempo limite. Este ainda é capaz de enviar e receber dados simultaneamente em mais de uma conexão, e cada bloco é enviado no máximo uma vez. [2] O conector do tipo arbitrator utilizado pelos protocolos NamenodeProtocol e DatanodeProtocol age de forma autoritária, por meio de comandos diretos retornados para os Datanodes por meio do DatanodeProtocol para o primeiro, e por meio de comandos diretos enviados do BlockScanner e do Balancer, para o segundo. [2] O conector do tipo distritbutor implementado pelos protocolos NamenodeProtocol e DatanodeProtocol utiliza o mecanismo de entrega do tipo unicast. O roteamento é feito de forma dinâmica, pois um Datanode possui um identificador único e este pode ser reconhecido pelo Namenode mesmo se o seu endereço IP mudar. Os nós que o distributor pode afetar são do tipo adhoc, visto que novos Datanodes podem ser adicionados ao sistema em tempo de execução e estes estarão sujeitos ao que for determinado por meio dos protocolos citados, tanto pelas operações de balanceamento efetuadas pelo balancer quanto para a escolha dos nós que receberão réplicas dos blocos no processo de escrita efetuada pelo Namenode. [2] IV. IMPLEMENTAÇÃO E IMPLANTAÇÃO A Figura 2 exibe uma proposta de implantação, onde uma aplicação cliente acessa algum dos HDFS Clients disponibilizados para efetuar operações, estes HDFS Clients são: WebHDFS e C API Lib. O WebHDFS é um HDFS Client que traz consigo o protocolo Representational State Transfer (REST), e por isto apresenta todas as características decorrentes das decisões arquiteturais utilizadas neste Commercial-Off-The-Shelf, do inglês, Produto Comercial de Prateleira (COTS). [10] A utilização do WebHDFS consiste em requisições do tipo GET do protocolo HTTP para efetuar cada operação disponibilizada pelo HDFS Client, como: ler arquivo, adicionar à arquivo, criar/apagar diretório, listar diretório, obter checksum de arquivo, definir permissão, dentre outras. [8] [9] [10] A C API Lib é uma segunda alternativa de HDFS Client que disponibiliza um conector do tipo RPC através da biblioteca Java Native Interface (JNI), para execução de código Java nativo a partir da linguagem C. [10] A aplicação, utilizando de um dos artefatos citados acima, pode acessar o HDFS Client para efetuar as mesmas ações que o WebHDFS acessa, só que, neste caso, o faz por meio de chamadas do tipo RPC. [9] [10] Cabe aqui ressaltar que ao efetuar uma leitura/escrita, seja qual for o HDFS Client utilizado, o algoritmo do Namenode que retorna a lista de Datanodes a serem lidos considera a distância até o Client e ordena pela menor distância, assim sendo, caso o WebHDFS Client seja utilizado, os Datanodes contidos no mesmo rack no qual ele se encontra serão posicionados primeiro na lista, e o mesmo acontece com relação ao C API Lib, de forma análoga. [9] V. DISCUSSÃO E CONCLUSÕES Os ganhos com o desenvolvimento do HDFS foram de grande valia para que mais um passo fosse dado no mundo da tecnologia da informação. Figura 2 – Visão de Implantação Características como redundância de dados, recursos contra eventuais falhas, seja de consistência de informação ou de máquinas físicas, grande capacidade de armazenamento de informações, processamento em máquinas convencionais, simplicidade oferecida ao desenvolvedor com relação a gerenciamento de questões relativas à computação paralela, escalabilidade e balanceamento de carga proporcionada pelo próprio arcabouço, são algumas das principais vantagens de adota-lo como ferramenta de gerenciamento distribuído de informações. Além do alto desempenho alcançado por meio do estilo Batch Sequential, implementação que prioriza a vazão dos dados trafegados. [1] [3] A capacidade de receber e interpretar comandos em tempo de execução provida pela aplicação do estilo arquitetural Basic Interpreter permite que o administrador consulte informações e configure o Namenode e o Balancer de modo a otimizar o funcionamento do sistema de acordo com a sua necessidade. O alto desempenho entregue pelo HDFS também reside no uso do IPC, uma lib que provê um mecanismo remote procedure call de forma rápida, por não utilizar a serialização nativa do Java, fazendo com que o cliente implemente sua própria serialização de forma otimizada A arquitetura em camadas utilizada, permitiu que novas funcionalidades fossem adicionadas ao sistema, como é o caso dos Backupnodes e CheckpointNodes que só foram adicionados ao projeto em um segundo momento, e utilizaram o NamenodeProtocol provido pelo HDFS Core, integrando-se à solução sem impacto significativo sobre os artefatos já existentes, e trazendo consigo features importantes para atender ao requisito de tolerância à falhas. [2] Outro fator positivo a ser citado é o custo para a utilização deste sistema, que por ser open source, garante uma redução de custo considerável em relação a um sistema concorrente proprietário. [3] Por outro lado, o uso de um único Namenode tende limitar a escalabilidade provida pela arquitetura implementada pelo HDFS, quando o número de arquivos providos cresce. [4] Uma vez que para aperfeiçoar o tempo de resposta às requisições dos clientes, os metadados dos arquivos do Datanode ficam armazenados em memória RAM no Namenode, portanto, a quantidade de informações armazenadas é limitada pelo tamanho desta memória. [4] Somado a isto, existe o fato de que durante o ciclo de vida do sistema de arquivos o espaço necessário para armazenar os dados cresce numa proporção maior do que o armazenamento físico disponível, fazendo com que a memória RAM do Namenode se torne um “gargalo” para escalabilidade do sistema. [4] Além disso, o envio de Heartbeats dos nós para o Namenode cria uma carga interna ao sistema, que pode se tornar disfuncional caso o número de nós seja tal que comprometa a capacidade do Namenode de responder a requisições clientes externas. [4] Como uma alternativa ao HDFS, existe o Ceph. Este apresenta uma solução para sistema de arquivos distribuídos onde o Namenode é replicado em um cluster de acordo com a demanda, de modo a balancear a carga de armazenamento do namespace e dividir a carga interna do sistema em vários nós. [6] O intuito com o Ceph é de prover maior escalabilidade e maior tolerância a falhas em relação ao Hadoop, visto que o uso de um único Namenode consiste em um único ponto de falha, e mesmo com as estratégias de backup e recovery oferecidas pelo HDFS do Hadoop, o processo de recuperação no caso de uma falha no nó da rede onde o Namenode se encontra pode demandar um tempo considerado inaceitável para aplicações que exigem alta disponibilidade. [6] REFERÊNCIAS [1] Borthakur D. "HDFS Architecture Guide", abril 2009, http://archive.cloudera.com/cdh4/cdh/4/mr1/hdfs_design.pdf, [2] Chansler R., Kuang H., Radia S., Shvachko K. and Srinivas S., "The Hadoop Distributed File System" http://www.aosabook.org/en/hdfs.html [3] Goldman, A., Kon, F., Junior, F. P., et al. “Apache Hadoop: Conceitos teóricos e práticos, evolução e novas possibilidades”, XXXI Jornadas de atualizações em informática, 2012, http://www.imago.ufpr.br/csbc2012/anais_csbc/eventos/jai/artigos/JAI%20%20Cap%203%20Apache%20Hadoop%20conceitos%20teoricos %20e%20praticos,%20evolucao%20e%20novas%20possibilidades.pdf [4] Konstantin Shvachko, et al., “The Hadoop Distributed File System,” Mass Storage Systems and Technologies (MSST), IEEE 26th Symposium on IEEE, 2010, http://storageconference.org/2010/Papers/MSST/Shvachko.pdf. [5] P. Bone, “Integrating NLTK with the Hadoop Map Reduce Framework”, Junho 2008, http://ww2.cs.mu.oz.au/~pbone/papers/nltk-hadoop.pdf [6] Scott, B., E. M. Estolano, C. Maltzahn, A. Khurana, A. Nelson, e S. Weil, “Ceph as a Scalable Alternative to the Hadoop Distributed File System,” vol. 35, Agosto 2010, http://static.usenix.org/publications/login/201008/openpdfs/maltzahn.pdf [7] Hadoop Wiki - http://wiki.apache.org/hadoop/ipc [8] Hadoop Version Control System http://hadoop.apache.org/version_control.html [9] LibHDFS C API http://hadoop.apache.org/docs/stable/libhdfs.html [10] WebHDFS REST API http://hadoop.apache.org/docs/stable/webhdfs.html
Documentos relacionados
Apache Hadoop - DComp - Universidade Federal de São Carlos
Bruno Antunes da Silva Universidade Federal de São Carlos - Campus Sorocaba [email protected]
Leia maisdata blocks
• NameNode: serviço/máquina que armazena as informações sobre os arquivos no sistema (metadados) • Um acesso precisa passar por ele para descobrir para onde (quais DataNodes) os dados irão, ou de o...
Leia mais