Java Big Data Road--Explicação detalhada do HDFS (5)--Processo de execução e operação da API

HDFS (Distributed File Storage System) - processo de execução e operação de API

Índice

HDFS (Distributed File Storage System) - processo de execução e operação de API

processo

1. Leia o processo/faça o download

2. Processo de gravação/carregamento

3. Processo de exclusão

operação da API

1. Etapas de preparação

2. Operação da API


processo

1. Leia o processo/faça o download

  1. O cliente inicia uma solicitação RPC para o NameNode
  2. NameNode verificará após receber a solicitação:
    1. Verifique se o caminho especificado existe
    2. Verifique se o arquivo existe
  3. Se o arquivo existir, o NameNode lê os metadados e envia um sinal para o cliente
  4. O cliente pedirá ao NameNode o endereço do primeiro bloco
  5. NameNode lerá os metadados após receber a solicitação e, em seguida, colocará o endereço do primeiro bloco na fila para o cliente
  6. Por padrão, um bloco possui três endereços (3 cópias). Após receber a fila, o cliente seleciona um nó mais próximo para ler o primeiro bloco. Após a conclusão da leitura, o bloco será verificado por checksum; se a verificação falhar, o o cliente envia um sinal para o NameNode e, em seguida, seleciona novamente o endereço para reler; se a verificação for bem-sucedida, o cliente solicitará ao NameNode o endereço do segundo bloco e repetirá os três processos de 4, 5, e 6.
  7. Após o cliente ter lido todos os blocos, ele enviará um sinal de fim ao NameNode, e o NameNode fechará o arquivo após receber o sinal

2. Processo de gravação/carregamento

  1. O cliente inicia uma solicitação RPC para o NameNode
  2. NameNode verificará após receber a solicitação:
    1. Verifique se o caminho especificado existe
    2. Verifique se o caminho de gravação tem permissão
    3. Verifique se existe um arquivo com o mesmo nome no caminho especificado
  3. Se a verificação falhar, uma exceção é lançada.Se a verificação for bem-sucedida, os metadados são registrados e o NameNode enviará um sinal ao cliente.
  4. Após receber o sinal, o cliente solicitará ao NameNode o local de armazenamento do primeiro Bloco.
  5. Após o NameNode receber a requisição, ele irá aguardar o heartbeat do DataNode, selecionar o endereço do DataNode, colocá-lo na fila e devolvê-lo ao cliente. Por padrão, o NameNode escolherá 3 endereços.
  6. O cliente recebe 3 endereços na fila e seleciona um nó mais próximo (distância da topologia da rede) desses endereços para gravar na primeira cópia do primeiro Bloco.
  7. O nó onde a primeira cópia está localizada gravará a segunda cópia em outros nós através do pipeline (pipeline, na verdade Canal em NIO), e o nó onde a segunda cópia está localizada está gravando na terceira cópia.
  8. Após a escrita, o nó onde está a terceira cópia retornará um ACK para o nó onde está a segunda cópia.Após receber o ACK, o nó onde está a segunda cópia retornará um ACK para o nó onde está a primeira cópia. A primeira cópia O nó onde está está retornando ack para o cliente
  9. Depois de escrever o primeiro bloco, o cliente solicitará ao NameNode o local de armazenamento do segundo bloco e, em seguida, repetirá o processo de 5, 6, 7 e 8.
  10. Quando todos os blocos forem gravados, o cliente enviará um sinal de fim para o NameNode, e o NameNode fechará o arquivo/fluxo. Após o fechamento do fluxo, o arquivo não pode ser modificado.

3. Processo de exclusão

  1. O cliente inicia uma solicitação RPC para o NameNode.

  2. Após o NameNode receber a requisição , ele irá gravar a requisição no arquivo edits , e então atualizar os metadados na memória . Após a atualização da memória ser bem sucedida, o cliente irá retornar um sinal de ACK . Neste momento, o bloco correspondente ao arquivo ainda está armazenado no DataNode .

  3. Quando o NameNode receber o heartbeat do DataNode , o NameNode verificará as informações do Bloco e enviará uma resposta de heartbeat ao DataNode , solicitando a exclusão do Bloco correspondente. O DataNode não excluirá realmente o bloco até receber a resposta de pulsação .

operação da API

Rendimento ----- a quantidade total de dados lidos e gravados por nós ou clusters por unidade de tempo 1s leitura e gravação 100M --- 100M/s

Alta simultaneidade não é necessariamente alta taxa de transferência, mas alta taxa de transferência geralmente é alta simultaneidade

1. Etapas de preparação

  1. Os pacotes jar dependentes que precisam ser importados para o HDFS:

hadoop-2.7.1\share\hadoop\common\*.jar

hadoop-2.7.1\share\hadoop\common\lib\*.jar

hadoop-2.7.1\share\hadoop\hdfs\*.jar

hadoop-2.7.1\share\hadoop\hdfs\lib\*.jar

2. Operação da API

ler arquivo

@Test

public void testConnectNamenode() throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"), conf);

    InputStream in=fs.open(new Path("/park/1.txt"));

    OutputStream out=new FileOutputStream("1.txt");

    IOUtils.copyBytes(in, out, conf);

}

 

fazer upload de arquivos

@Test

public void testPut() throws Exception{

    Configuration conf=new Configuration();

    conf.set("dfs.replication","1");

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"),conf,"root");

    ByteArrayInputStream in=new ByteArrayInputStream("hello hdfs".getBytes());

    OutputStream out=fs.create(new Path("/park/2.txt"));

    IOUtils.copyBytes(in, out, conf);

}

 

Deletar arquivos

@Test

public void testDelete()throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"),conf,"root");

    //true表示无论目录是否为空,都删除掉。可以删除指定的文件

    fs.delete(new Path("/park01"),true);

    //false表示只能删除不为空的目录。

    fs.delete(new Path("/park01"),false);

    fs.close();

}

 

criar pasta em hdfs

@Test

public void testMkdir()throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"),conf,"root");

    fs.mkdirs(new Path("/park02"));

}

 

Consulte os arquivos no diretório especificado de hdfs

@Test

public void testLs()throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"),conf,"root");

    FileStatus[] ls=fs.listStatus(new Path("/"));

    for(FileStatus status:ls){

        System.out.println(status);

    }

}

 

Exibir recursivamente os arquivos no diretório especificado

@Test

public void testLs()throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.214:9000"),conf,"root");

    RemoteIterator<LocatedFileStatus> rt=fs.listFiles(new Path("/"), true);

    while(rt.hasNext()){

        System.out.println(rt.next());

    }

}

 

nome duplo

@Test

public void testCreateNewFile() throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.176:9000"),conf,"root");

    fs.rename(new Path("/park"), new Path("/park01"));

}

 

Obter as informações de bloco de um arquivo

@Test

public void testCopyFromLoaclFileSystem() throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.176:9000"),conf,"root");

    BlockLocation[] data=fs.getFileBlockLocations(new Path("/park01/1.txt"),0,Integer.MaxValue);

    for(BlockLocation bl:data){

        System.out.println(bl);

    }

}

Você também pode usar plug-ins para operar hdfs

Acho que você gosta

Origin blog.csdn.net/a34651714/article/details/102821803
Recomendado
Clasificación