O que é HDFS?
HDFS é um sistema de arquivos distribuído para armazenar arquivos de dados muito grandes, rodando em clusters de hardware comum. É tolerante a falhas, escalonável e extremamente simples de expandir. O Hadoop vem com HDFS ( Hadoop Distributed File Systems ).
Quando os dados excedem a capacidade de armazenamento em uma única máquina física, torna-se essencial dividi-los em várias máquinas separadas. Um sistema de arquivos que gerencia operações específicas de armazenamento em uma rede de máquinas é chamado de sistema de arquivos distribuído. HDFS é um desses softwares.
Neste tutorial, aprenderemos,
- O que é HDFS?
- Arquitetura HDFS
- Leia a operação
- Operação de gravação
- Acesse HDFS usando JAVA API
- Acesse HDFS usando COMMAND-LINE INTERFACE
Arquitetura HDFS
O cluster HDFS consiste principalmente em um NameNode que gerencia os metadados do sistema de arquivos e um DataNodes que armazena os dados reais .
- NameNode: NameNode pode ser considerado um mestre do sistema. Ele mantém a árvore do sistema de arquivos e os metadados de todos os arquivos e diretórios presentes no sistema. Dois arquivos 'Imagem do espaço de nomes' e 'registro de edição' são usados para armazenar informações de metadados. Namenode tem conhecimento de todos os datanodes contendo blocos de dados para um determinado arquivo, no entanto, ele não armazena localizações de blocos de forma persistente. Essas informações são reconstruídas sempre a partir dos datanodes quando o sistema é iniciado.
- DataNode: DataNodes são escravos que residem em cada máquina em um cluster e fornecem o armazenamento real. É responsável por atender, ler e escrever as solicitações dos clientes.
As operações de leitura / gravação no HDFS operam em nível de bloco. Os arquivos de dados no HDFS são divididos em blocos do tamanho de blocos, que são armazenados como unidades independentes. O tamanho do bloco padrão é 64 MB.
O HDFS opera em um conceito de replicação de dados em que várias réplicas de blocos de dados são criadas e distribuídas em nós em todo um cluster para permitir alta disponibilidade de dados em caso de falha de nó.
Você sabe? Um arquivo em HDFS, que é menor do que um único bloco, não ocupa o armazenamento total de um bloco.
Ler operação em HDFS
A solicitação de leitura de dados é atendida por HDFS, NameNode e DataNode. Vamos chamar o leitor de 'cliente'. O diagrama abaixo descreve a operação de leitura de arquivo no Hadoop.
- Um cliente inicia a solicitação de leitura chamando o método 'open ()' do objeto FileSystem; é um objeto do tipo DistributedFileSystem .
- Este objeto se conecta ao namenode usando RPC e obtém informações de metadados, como a localização dos blocos do arquivo. Observe que esses endereços são dos primeiros blocos de um arquivo.
- Em resposta a essa solicitação de metadados, os endereços dos DataNodes com uma cópia desse bloco são retornados.
- Depois que os endereços de DataNodes são recebidos, um objeto do tipo FSDataInputStream é retornado ao cliente. FSDataInputStream contém DFSInputStream que cuida das interações com DataNode e NameNode. Na etapa 4 mostrada no diagrama acima, um cliente invoca o método 'read ()' que faz com que DFSInputStream estabeleça uma conexão com o primeiro DataNode com o primeiro bloco de um arquivo.
- Os dados são lidos na forma de fluxos em que o cliente invoca o método 'read ()' repetidamente. Este processo de operação read () continua até chegar ao final do bloco.
- Uma vez que o final de um bloco é alcançado, DFSInputStream fecha a conexão e segue em frente para localizar o próximo DataNode para o próximo bloco
- Depois que o cliente termina a leitura, ele chama um método close () .
Operação de gravação em HDFS
Nesta seção, entenderemos como os dados são gravados no HDFS por meio de arquivos.
- Um cliente inicia a operação de gravação chamando o método 'create ()' do objeto DistributedFileSystem que cria um novo arquivo - Etapa no. 1 no diagrama acima.
- O objeto DistributedFileSystem se conecta ao NameNode usando uma chamada RPC e inicia a criação de um novo arquivo. Porém, a operação de criação deste arquivo não associa nenhum bloco ao arquivo. É responsabilidade do NameNode verificar se o arquivo (que está sendo criado) ainda não existe e se um cliente possui as permissões corretas para criar um novo arquivo. Se um arquivo já existe ou o cliente não tem permissão suficiente para criar um novo arquivo, IOException é enviada para o cliente. Caso contrário, a operação é bem-sucedida e um novo registro para o arquivo é criado pelo NameNode.
- Depois que um novo registro em NameNode é criado, um objeto do tipo FSDataOutputStream é retornado ao cliente. Um cliente o usa para gravar dados no HDFS. O método de gravação de dados é invocado (etapa 3 no diagrama).
- FSDataOutputStream contém o objeto DFSOutputStream que cuida da comunicação com DataNodes e NameNode. Enquanto o cliente continua gravando dados, DFSOutputStream continua criando pacotes com esses dados. Esses pacotes são enfileirados em uma fila chamada DataQueue .
- Existe mais um componente chamado DataStreamer que consome este DataQueue . O DataStreamer também pede ao NameNode a alocação de novos blocos, escolhendo assim os DataNodes desejáveis a serem usados para replicação.
- Agora, o processo de replicação começa criando um pipeline usando DataNodes. Em nosso caso, escolhemos um nível de replicação de 3 e, portanto, existem 3 DataNodes no pipeline.
- O DataStreamer despeja pacotes no primeiro DataNode no pipeline.
- Cada DataNode em um pipeline armazena pacotes recebidos por ele e os encaminha para o segundo DataNode em um pipeline.
- Outra fila, 'Ack Queue', é mantida por DFSOutputStream para armazenar pacotes que estão aguardando confirmação de DataNodes.
- Uma vez que o reconhecimento de um pacote na fila é recebido de todos os DataNodes no pipeline, ele é removido da 'Fila de Ack'. No caso de qualquer falha do DataNode, os pacotes desta fila são usados para reiniciar a operação.
- Depois que um cliente conclui a gravação dos dados, ele chama um método close () (Etapa 9 no diagrama) Chamada para close (), resulta na liberação dos pacotes de dados restantes para o pipeline seguido de espera pela confirmação.
- Assim que uma confirmação final é recebida, NameNode é contatado para informá-lo de que a operação de gravação do arquivo foi concluída.
Acesse HDFS usando JAVA API
Nesta seção, tentamos entender a interface Java usada para acessar o sistema de arquivos do Hadoop.
Para interagir com o sistema de arquivos do Hadoop programaticamente, o Hadoop fornece várias classes JAVA. O pacote denominado org.apache.hadoop.fs contém classes úteis na manipulação de um arquivo no sistema de arquivos do Hadoop. Essas operações incluem abrir, ler, gravar e fechar. Na verdade, a API de arquivos para Hadoop é genérica e pode ser estendida para interagir com outros sistemas de arquivos além do HDFS.
Ler um arquivo do HDFS de maneira programática
O objeto java.net.URL é usado para ler o conteúdo de um arquivo. Para começar, precisamos fazer o Java reconhecer o esquema de URL hdfs do Hadoop. Isso é feito chamando o método setURLStreamHandlerFactory no objeto URL e uma instância de FsUrlStreamHandlerFactory é passada para ele. Este método precisa ser executado apenas uma vez por JVM, portanto, é colocado em um bloco estático.
Um exemplo de código é-
public class URLCat {static {URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());}public static void main(String[] args) throws Exception {InputStream in = null;try {in = new URL(args[0]).openStream();IOUtils.copyBytes(in, System.out, 4096, false);} finally {IOUtils.closeStream(in);}}}
Este código abre e lê o conteúdo de um arquivo. O caminho desse arquivo no HDFS é passado para o programa como um argumento de linha de comando.
Acesse HDFS usando COMMAND-LINE INTERFACE
Esta é uma das maneiras mais simples de interagir com o HDFS. A interface de linha de comando tem suporte para operações de sistema de arquivos, como ler o arquivo, criar diretórios, mover arquivos, excluir dados e listar diretórios.
Podemos executar '$ HADOOP_HOME / bin / hdfs dfs -help' para obter ajuda detalhada sobre cada comando. Aqui, 'dfs' é um comando shell do HDFS que oferece suporte a vários subcomandos.
Alguns dos comandos mais usados estão listados abaixo, juntamente com alguns detalhes de cada um.
1. Copie um arquivo do sistema de arquivos local para HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Este comando copia o arquivo temp.txt do sistema de arquivos local para o HDFS.
2. Podemos listar os arquivos presentes em um diretório usando -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Podemos ver um arquivo 'temp.txt' (copiado anteriormente) sendo listado no diretório '/' .
3. Comando para copiar um arquivo para o sistema de arquivos local do HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Podemos ver temp.txt copiado para um sistema de arquivos local.
4. Comando para criar um novo diretório
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Verifique se um diretório foi criado ou não. Agora, você deve saber como fazer ;-)