Uma Introdução ao Hadoop Distributed File System

Explorar a estrutura e subsistemas do HDFS

O Hadoop Distributed File System (HDFS) — um subprojeto do projeto Apache Hadoop — é um sistema de arquivos altamente tolerante a falhas projetado para executar em hardware padrão de baixo custo. O HDFS disponibiliza acesso de alto rendimento para os dados do aplicativo e é adequado para aplicativos com grandes conjuntos de dados. Este artigo explora os principais recursos desse sistema e apresenta uma visualização de alto nível da arquitetura do HDFS.

J. Jeffrey Hanson, CTO, Max International

Jeff HansonJeff Hanson tem mais de 20 anos de experiência como engenheiro e arquiteto de software, e é o CTO da Max International. Jeff é autor de muitos artigos e livros, incluindo Mashups: Strategies for the Modern Enterprise. Ele pode ser contactado em jjeffreyhanson@gmail.com.



30/Ago/2013

O HDFS é um projeto da Apache Software Foundation e um subprojeto do projeto Apache Hadoop (veja Recursos). O Hadoop é ideal para armazenar grandes quantidades de dados, do porte de terabytes e pentabytes, e usa o HDFS como sistema de armazenamento. O HDFS permite a conexão de nós (computadores pessoais padrão) contidos nos clusters por meio dos quais os arquivos de dados são distribuídos. É possível acessar e armazenar os arquivos de dados como um sistema de arquivos contínuo. O acesso aos arquivos de dados é gerenciado de um modo em fluxo, o que significa que aplicativos ou comandos são executados diretamente por meio do modelo de processamento MapReduce (veja Recursos, novamente).

O HDFS é tolerante a falhas e disponibiliza acesso de alto rendimento a grandes conjuntos de dados. Este artigo explora os principais recursos desse sistema e apresenta uma visualização de alto nível da arquitetura do HDFS.

Visão geral do HDFS

O HDFS tem muitas similaridades com outros sistemas de arquivos distribuídos, mas é diferente em vários aspectos. Uma diferença notável é o modelo WORM (write-once-read-many) do HDFS que afrouxa as exigências do controle de simultaneidade, simplifica a persistência de dados e habilita acesso de alto rendimento.

Outro atributo exclusivo do HDFS é o argumento que, normalmente, é melhor localizar a lógica de processamento próxima dos dados, ao invés de mover os dados para o espaço do aplicativo.

O HDFS restringe a gravação dos dados rigorosamente a um gravador por vez. Os bytes são sempre anexados ao final do fluxo e há a garantia de que os fluxos de bytes serão armazenados na ordem gravada.

O HDFS tem muitos objetivos. Estes são alguns dos mais notáveis:

  • Tolerância a falhas pela detecção de falhas e aplicação de recuperação rápida, automática
  • Acesso a dados por meio do fluxo MapReduce
  • Modelo de simultaneidade simples e robusto
  • Lógica de processamento próxima aos dados, ao invés dos dados estarem próximos à lógica de processamento
  • Portabilidade entre sistemas operacionais e hardware padrão heterogêneos
  • Escalabilidade para armazenar e processar de modo confiável grandes quantidades de dados
  • Economia pela distribuição de dados e pelo processamento entre clusters de computadores pessoais padrão
  • Eficiência pela distribuição de dados e pela lógica para processá-los em paralelo nos nós em que os dados estão localizados
  • Confiabilidade pela manutenção automática de várias cópias dos dados e pela reimplementação automática da lógica de processamento no caso de falhas

O HDFS fornece interfaces para os aplicativos a fim de movê-los para perto de onde se localizam os dados, como descrito na próxima seção.


Interfaces de aplicativo no HDFS

É possível acessar o HDFS de muitos modos diferentes. O HDFS disponibiliza uma interface de programação de aplicativos (API) Java™ e um wrapper nativo em linguagem C para a API Java. Além disso, é possível usar um navegador da web para buscar arquivos no HDFS.

O aplicativo descrito na Tabela 1 também está disponível para interface com o HDFS.

Tabela 1. Aplicativos que podem servir de interface com o HDFS
AplicativoDescrição
FileSystem (FS) shellUma interface da linha de comandos para shells comuns do Linux® e UNIX® (bash, csh etc.) que permite a interação com os dados do HDFS.
DFSAdminUm conjunto de comandos que pode ser usado para administrar um cluster HDFS.
fsckUm subcomando do comando/aplicativo do Hadoop. É possível usar o comando fsck para procurar por inconsistências nos arquivos, por exemplo, blocos perdidos, mas não para corrigir tais inconsistências.
Nós de nome e nós de dadosEstão integrados nos servidores da web que permitem que os administradores verifiquem o status atual de um cluster.

O HDFS tem um conjunto de recursos extraordinário com expectativa elevada, graças à sua arquitetura simples, porém eficiente.


Arquitetura do HDFS

O HDFS é composto por clusters de nós interconectados no local onde os arquivos e diretórios residem. Um cluster HDFS consiste em um único nó, conhecido como um NameNode, que gerencia o namespace do sistema de arquivos e regula o acesso do cliente aos arquivos. Além disso, os nós de dados (DataNodes) armazenam dados como blocos dentro dos arquivos.

Nós de nome e nós de dados

Dentro do HDFS, um nó de nome gerencia operações de namespace do sistema de arquivos do tipo abrir, fechar e renomear arquivos e diretórios. Um nó de nome também mapeia blocos de dados a nós de dados, os quais gerenciam as solicitações de leitura e gravação dos clientes HDFS. Os nós de dados também criam, excluem e replicam blocos de dados de acordo com as instruções do nó de nome dominante.

A Figura 1 ilustra a arquitetura de alto nível do HDFS.

Figura 1. A arquitetura do HDFS
A arquitetura do HDFS

Como ilustrado na Figura 1, cada cluster contém um nó de nome. Esse design facilita um modelo simplificado para gerenciamento de cada namespace e mediação da distribuição de dados.

Relacionamentos entre nós de nome e nós de dados

Nós de nome e nós de dados são componentes de software desenvolvidos para executar independentemente em máquinas padrão entre sistemas operacionais heterogêneos. O HDFS foi desenvolvido com a linguagem de programação Java; assim, qualquer máquina com suporte para essa linguagem pode executar o HDFS. Um cluster de instalação típico tem uma máquina dedicada com um nó de nome e, possivelmente, um nó de dados em operação. Cada uma das outras máquinas no cluster executa um nó de dados.

Protocolos de comunicação

Todos os protocolos de comunicação do HDFS são desenvolvidos no protocolo TCP/IP. Os clientes HDFS se conectam a uma porta do Protocolo de Controle de Transmissões (TCP) aberta no nó de nome e se comunicam com esse nó por meio de um protocolo proprietário baseado em Chamada de Procedimento Remoto (RPC). Os nós de dados conversam com o nó de nome através de um protocolo proprietário baseado em bloco.

Os nós de dados ficam em loop continuamente, solicitando instruções ao nó de nome. Um nó de nome não pode se conectar diretamente a um nó de dados; ele simplesmente retorna os valores das funções chamadas por um nó de dados. Cada nó de dados mantém um soquete do servidor aberto de modo que o código do cliente ou outros nós de dados possam ler ou gravar dados. O nó de nome conhece o host ou porta para esse soquete do servidor e fornece as informações aos clientes ou outros nós de dados interessados. Veja a barra lateral Communications protocols para obter mais informações sobre a comunicação entre nós, nós de dados e clientes.

O nó de nome mantém e administra mudanças no namespace do sistema de arquivos.

Namespace do sistema de arquivos

O HDFS suporta uma organização hierárquica tradicional de arquivos em que um usuário ou um aplicativo pode criar diretórios e armazenar arquivos neles. A hierarquia do namespace do sistema de arquivos é similar à maioria dos outros sistemas de arquivos existentes; é possível criar, renomear, reposicionar e remover arquivos.

O HDFS também suporta sistemas de arquivos de terceiros como o CloudStore e o Simple Storage Service (S3) (veja Recursos).


Replicação de dados

O HDFS replica blocos de arquivos para tolerância a falhas. Um aplicativo pode especificar o número de réplicas de um arquivo no instante em que ele é criado e é possível alterar esse número a qualquer momento depois disso. O nó de nome toma todas as decisões referentes à replicação de bloco.

Reconhecimento de rack

Normalmente, clusters HDFS de grande porte estão acondicionados em várias instalações (racks). O tráfego de rede entre nós diferentes dentro da mesma instalação é mais eficiente do que o tráfego de rede entre instalações. Um nó de nome tenta colocar réplicas de um bloco em várias instalações para aprimorar a tolerância a falhas. No entanto, o HDFS deixa aos administradores a decisão sobre a que instalação um nó pertence. Assim, cada nó conhece o ID do seu rack; é isso que significa reconhecimento de rack.

O HDFS usa um modelo inteligente de colocação de réplica para fins de confiabilidade e desempenho. A otimização da colocação de réplica torna o HDFS exclusivo na maioria dos outros sistemas de arquivos distribuídos e é facilitado por uma política de colocação de réplica com reconhecimento de rack que usa a largura de banda da rede de modo eficiente.

Ambientes de grande porte do HDFS normalmente operam em várias instalações de computadores. A comunicação entre dois nós de dados em instalações diferentes é, normalmente, mais lenta do que entre nós de dados na mesma instalação. Assim, o nó de nome tenta otimizar a comunicação entre nós de dados. O nó de nome identifica o local dos nós de dados pelos seus IDs de rack.


Organização de dados

Um dos principais objetivos do HDFS é suportar arquivos grandes. O tamanho de um bloco típico do HDFS é 64 MB. Assim, cada arquivo HDFS é composto por um ou mais blocos de 64 MB. O HDFS tenta colocar cada bloco em nós de dados separados.

Processo de criação de arquivo

Manipular arquivos no HDFS é similar aos processos usados com outros sistemas de arquivos. No entanto, como o HDFS é um sistema de várias máquinas que parece ser um único disco, todo o código de manipulação de arquivos no HDFS usa uma subclasse do objeto org.apache.hadoop.fs.FileSystem (veja Recursos).

O código mostrado na Listagem 1 ilustra um processo típico de criação de arquivo no HDFS.

Listagem 1. Processo típico de criação de arquivo no HDFS
  byte[] fileData = retrieveFileDataFromSomewhere();
  String filePath = retrieveFilePathStringFromSomewhere();
  Configuration config = new Configuration();  // assumes to automatically load
                                               // hadoop-default.xml and hadoop-site.xml
  org.apache.hadoop.fs.FileSystem hdfs = org.apache.hadoop.fs.FileSystem.get(config);
  org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(filePath);
  org.apache.hadoop.fs.FSDataOutputStream outputStream = hdfs.create(path);
  outputStream.write(fileData, 0, fileData.length);

Preparando-se para confirmar

Quando um cliente cria um arquivo no HDFS, ele primeiro armazena os dados em um arquivo local temporário. Em seguida, ele redireciona as gravações subsequentes para o arquivo temporário. Quando o arquivo temporário acumula dados suficientes para preencher um bloco do HDFS, o cliente informa isso para o nó de nome e este, por sua vez, converte o arquivo para um nó de dados permanente. A seguir, o cliente fecha o arquivo temporário e esvazia quaisquer dados remanescentes para o nó de dados recém-criado. A essa altura, o nó de nome confirma o nó de dados para o disco.

Enfileiramento de replicações

Quando um cliente acumula um bloco de dados do usuário repleto, ele recupera uma lista de nós de dados que contém uma réplica desse bloco no nó de nome. O cliente, por sua vez, esvazia o bloco de dados repleto para o primeiro nó de dados especificado na lista de réplica. À medida que o nó recebe chunks de dados, ele os grava no disco e transfere cópias para o próximo nó de dados na lista. O próximo nó de dados faz o mesmo. Esse processo de enfileiramento é repetido até que o fator de replicação seja satisfeito.


Confiabilidade do armazenamento de dados

Um objetivo importante do HDFS é armazenar dados de modo confiável, mesmo quando ocorrem falhas dentro dos nós de nome, dos nós de dados ou das partições de rede.

A detecção é a primeira etapa empregada pelo HDFS para superar as falhas. O HDFS usa mensagens de pulsação para detectar a conectividade entre os nós de nome e de dados.

Pulsações do HDFS

Vários motivos podem causar perda de conectividade entre os nós de nome e de dados. Consequentemente, cada nó de dados envia mensagens de pulsação periódicas para o nó de nome, de modo que este possa detectar a perda de conectividade se ele parar de recebê-las. O nó de nome marca os nós de dados que não respondem às pulsações como inativos e deixa de enviar solicitações adicionais a eles. Os dados armazenados em um nó inativo não estão mais disponíveis para um cliente HDFS nesse nó, que seja eficazmente removido do sistema. Se a inatividade de um nó fizer com que o fator de replicação de blocos de dados caia abaixo do seu valor mínimo, o nó de nome iniciará a replicação adicional para recolocar a replicação em um estado normalizado.

A Figura 2 ilustra o processo de envio de mensagens de pulsação do HDFS.

Figura 2. O processo de pulsação do HDFS
O processo de pulsação do HDFS

Rebalanceamento do bloco de dados

Nem sempre é possível colocar blocos de dados uniformemente entre nós de dados, o que significa que o espaço usado para um ou mais nós de dados pode estar subutilizado. Assim, o HDFS suporta o rebalanceamento de blocos de dados usando diversos modelos. Um modelo pode mover blocos de dados de um nó de dados para outro automaticamente quando o espaço livre em um nó fica muito reduzido. Outro modelo pode criar dinamicamente réplicas adicionais e rebalancear outros blocos de dados em um cluster, caso ocorra um aumento súbito na demanda de um determinado arquivo. O HDFS também disponibiliza o comando hadoop balance para tarefas manuais de rebalanceamento.

Um motivo comum para o rebalanceamento é a inclusão de novos nós de dados em um cluster. Ao posicionar novos blocos, os nós de nome consideram vários parâmetros antes de escolher que nós de dados os receberão. Algumas das considerações são:

  • Políticas de gravação de réplica de bloco
  • Prevenção de perda de dados devido à falha da instalação ou do rack
  • Redução da E/S da rede entre instalação
  • Difusão uniforme de dados entre os nós de dados em um cluster

O recurso de rebalanceamento de cluster do HDFS é apenas um mecanismo que ele usa para manter a integridade dos dados. Outros mecanismos são abordados a seguir.

Integridade de dados

O HDFS percorre grandes extensões para assegurar a integridade dos dados entre clusters. Ele usa validação de soma de verificação nos conteúdos dos arquivos do HDFS armazenando somas de verificação calculadas em arquivos ocultos, separados, no mesmo namespace que os dados reais. Quando um cliente recupera os dados do arquivo, é possível verificar se os dados recebidos correspondem à soma de verificação armazenada no arquivo associado.

O namespace do HDFS é armazenado usando um log de transação mantido por cada nó de nome. O namespace do sistema de arquivos, junto com os mapeamentos de blocos do arquivo e as propriedades do sistema do arquivo, são armazenados em um arquivo chamado FsImage. Quando um nó de nome é inicializado, ele lê o arquivo FsImage junto com outros arquivos e aplica as transações e informações de estado localizadas nesses arquivos.

Atualização síncrona de metadados

Um nó de nome usa um arquivo de log conhecido como EditLog para registrar persistentemente cada transação ocorrida nos metadados do sistema de arquivos do HDFS. Se os arquivos EditLog ou FsImage vierem a estar corrompidos, a instância do HDFS à qual eles pertencem deixará de funcionar. Assim, um nó de nome suporta várias cópias dos arquivos FsImage e EditLog. Com a presença de várias cópias desses arquivos, qualquer mudança em um dos arquivos será disseminada simultaneamente para todas as cópias. Quando um nó de nome reinicia, ele usa a última versão consistente do FsImage e do EditLog na sua autoinicialização.

Permissões do HDFS para usuários, arquivos e diretórios

O HDFS implementa um modelo de permissão para arquivos e diretórios que tem muito em comum com o modelo Portable Operating System Interface (POSIX); por exemplo, cada arquivo e diretório está associado a um proprietário e a um grupo. O modelo de permissões do HDFS suporta leitura (r), gravação (w) e execução (x). Como não há nenhum conceito de execução de arquivo dentro do HDFS, a permissão x assume um significado diferente. Em termos simples, o atributo x indica permissão para acessar um diretório-filho de um determinado diretório-pai. O proprietário de um arquivo ou diretório é a identidade do processo cliente que o criou. O grupo é o grupo do diretório-pai.

Capturas Instantâneas

O HDFS foi planejado originalmente para suportar capturas instantâneas que podem ser usadas para retroceder uma instância corrompida do HDFS a um estado anterior. No entanto, o suporte do HDFS para capturas instantâneas foi adiado por enquanto.


Resumo

O Hadoop é um sistema de arquivos distribuído do Apache Software Foundation e um projeto de gerenciamento de dados que se destina a armazenar e gerenciar grandes quantidades de dados. Ele usa um sistema de armazenamento denominado HDFS para conectar computadores pessoais padrão, conhecidos como nós, contidos em clusters nos quais os blocos de dados são distribuídos. É possível acessar e armazenar os blocos de dados como um sistema de arquivos contínuo que usa o modelo de processamento MapReduce.

O HDFS compartilha recursos comuns com outros sistemas de arquivos distribuídos enquanto suporta algumas diferenças importantes. Uma diferença significativa é o modelo WORM (write-once-read-many) do HDFS que afrouxa as exigências do controle de simultaneidade, simplifica a persistência de dados e habilita acesso de alto rendimento.

Para disponibilizar um modelo otimizado de acesso a dados, o HDFS foi desenvolvido de modo a posicionar a lógica de processamento próxima aos dados, ao invés de posicionar os dados próximos ao espaço do aplicativo.

Recursos

Aprender

  • O Wiki do Hadoop divulga informações da comunidade relacionadas ao Hadoop e ao HDFS.
  • O IBM InfoSphere BigInsights Basic Edition – a distribuição do Hadoop da IBM ― é um download integrado, testado e pré-configurado, e gratuito, para alguém que deseje testar e saber mais sobre o Hadoop.
  • O IBM InfoSphere BigInsights Basic Edition oferece uma plataforma de analítica eficiente e altamente escalável que pode manipular taxas de rendimento de dados incrivelmente altas que podem alcançar milhões de evento ou mensagens por segundo.
  • Localize cursos gratuitos sobre os conceitos básicos do Hadoop, stream computing, analítica de texto e mais em Big Data University.
  • O site Hadoop API documenta as classes e interfaces Java que são usadas para fazer programação para o Hadoop e para o HDFS.
  • A página MapReduce da Wikipédia é um bom lugar para iniciar a pesquisa sobre a estrutura do MapReduce.
  • Visite Amazon S3 para saber mais sobre a infraestrutura S3 da Amazon.
  • A Web development zone do developerWorks é especializada em artigos que abordam diversas soluções baseadas na web.

Obter produtos e tecnologias

  • Faça download do IBM InfoSphere BigInsights Basic Edition sem nenhum custo e desenvolva uma solução que transforme volumes grandes e complexos de dados em insight pela combinação do Apache Hadoop com tecnologias e recursos exclusivos da IBM.
  • Faça download do IBM InfoSphere Streams e desenvolva aplicativos que rapidamente alimentam, analisam e correlacionam informações de milhares de origens, em tempo real, no momento que elas chegam.
  • O site de projeto do Hadoop contém recursos valiosos que pertencem à arquitetura do Hadoop e à estrutura do MapReduce.
  • O site de projeto do Hadoop Distributed File System oferece downloads e documentação referentes ao HDFS.
  • Procure no site do CloudStore por downloads e documentação referentes à integração entre o CloudStore, o Hadoop e o HDFS.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=942118
ArticleTitle=Uma Introdução ao Hadoop Distributed File System
publish-date=08302013