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
1. Leia o processo/faça o download
2. Processo de gravação/carregamento
processo
1. Leia o processo/faça o download
- O cliente inicia uma solicitação RPC para o NameNode
- NameNode verificará após receber a solicitação:
- Verifique se o caminho especificado existe
- Verifique se o arquivo existe
- Se o arquivo existir, o NameNode lê os metadados e envia um sinal para o cliente
- O cliente pedirá ao NameNode o endereço do primeiro bloco
- 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
- 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.
- 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
- O cliente inicia uma solicitação RPC para o NameNode
- NameNode verificará após receber a solicitação:
- Verifique se o caminho especificado existe
- Verifique se o caminho de gravação tem permissão
- Verifique se existe um arquivo com o mesmo nome no caminho especificado
- 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.
- Após receber o sinal, o cliente solicitará ao NameNode o local de armazenamento do primeiro Bloco.
- 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.
- 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.
- 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.
- 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
- 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.
- 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
-
O cliente inicia uma solicitação RPC para o NameNode.
-
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 .
-
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
- 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