[Hadoop] notas de estudo (b) hdfs princípio de funcionamento e

Aprender porter, notas retiradas dos  cursos de construção de laboratório

 

1, o princípio HDFS

HDFS (Hadoop Distributed File System) é um sistema de arquivos distribuídos. Ele tem alta tolerância a falhas e oferece um alto rendimento de acesso a dados, ideal para uso em grandes conjuntos de dados, ele oferece um alto grau de tolerância a falhas e soluções de armazenamento de dados em massa de alto rendimento.

  • 高吞吐量访问: Cada bloco HDFS distribuído em rack diferente, quando um usuário acessa, HDFS será calculada utilizando a mais recente e acesso à quantidade mínima de usuários do servidor. Desde o Bloco são apoiados na cremalheira diferente, ele não é mais um acesso de dados único, rapidez e eficiência é muito rápido. Além disso HDFS podem ser lidos em paralelo a partir de um cluster de servidor, maior largura de banda de acesso de leitura e arquivos de gravação.
  • 高容错性: Falha do sistema é inevitável, como fazer dados após failover e tolerância a falhas são críticas. Através de vários HDFS garantir a fiabilidade dos dados, múltiplas cópias distribuídos a diferentes servidores e a localização física dos dados verificar a função, a função de auto-teste de fundo contínua proporciona a consistência dos dados pode ser alta tolerância a falhas.
  • 线性扩展: Por causa de informações HDFS bloco é armazenado no NameNode, bloquear arquivos distribuídos para DataNode, quando a expansão do número só adicionar DataNode, o sistema pode ser feito sem parar a expansão dos serviços, sem intervenção humana.

1.1 arquitetura HDFS

Imagem Informações

Acima, é um Mestre e Slave da estrutura HDFS, divididos NameNode, NameNode Secundário e DataNode três papéis.

  • NameNode: Não é apenas um nó mestre e gerenciamento namespace HDFS informações de mapeamento de bloco de dados Hadoop1.X, a cópia do pedido de configuração e política de cliente;
  • Secondary NameNode: Auxiliar NameNode, compartilhar trabalho NameNode regularmente fsimage fusão e fsedits e empurrou para NameNode, situações de emergência pode ajudar NameNode recuperação;
  • DataNode: O nó escravo, os dados são realmente armazenados, e lendo e escrevendo o bloco de dados para o relatório NameNode armazenamento das informações;

2.2 HDFS ler

Imagem Informações

  1. Cliente desejado para abrir o ficheiro lido pelo () chamada de método aberto FileSystem objecto, para HDFS, este objecto é um exemplo de sistema de ficheiros distribuído;
  2. DistributedFileSystem usando RPC para chamar NameNode para determinar a localização do bloco de início de arquivo, de acordo com o número de repetições do mesmo bloco retornar vários locais que seguem topologia de cluster Hadoop espécie, do lado do cliente perto da superfície da parte superior;
  3. As duas primeiras etapas irá retornar um objeto FSDataInputStream é encapsulado em objetos DFSInputStream, DFSInputStream pode facilmente gerenciar e DataNode fluxo namenode, o cliente chama o método read () do fluxo de entrada;
  4. DFSInputStream DataNode endereço armazenado bloco inicial arquivo imediatamente mais próximo DataNode conectado, através de um fluxo de dados chamado repetidamente ler () método, pode transferir dados a partir do cliente para o DataNode;
  5. Quando chegar ao fim do bloco, DFSInputStream fecha a conexão com o DataNode e olhar para a próxima melhor DataNode bloco, essas operações são transparentes para o cliente, o ponto de vista de apenas ler um fluxo contínuo do cliente;
  6. Assim que o cliente tenha concluído a leitura, sobre o método correto chamada FSDataInputStream close () para fechar o arquivo ler.

 

2.3 HDFS escrever operação

 

Imagem Informações

  1. DistributedFileSystem cliente chamando o método create () cria um novo arquivo;
  2. DistributedFileSystem por chamada RPC para criar um novo NameNode arquivo não associado Blocks, criado antes NameNode fará uma variedade de verificação, como um arquivo existe, o cliente ou sem permissão para criar e assim por diante. Se o cheque, NameNode registra um recorde para criar um novo arquivo, caso contrário ele irá lançar uma exceção IO;
  3. Após o retorno dos dois primeiros objetos FSDataOutputStream, e semelhante ao ao ler um arquivo, é empacotado em FSDataOutputStream DFSOutputStream, DFSOutputStream NameNode pode coordenar e DataNode. Comece a escrever dados para o cliente dados DFSOutputStream, DFSOutputStream vai cortar um pequeno pacote e escrito para a fila interna referido como "fila de dados" (fila de dados);
  4. DataStreamer vai lidar com fila de dados aceitável, seu primeiro NameNode inquérito do novo bloco loja mais adequado onde DataNode vários anos, tais como o número de repetições é 3, em seguida, encontrar o DataNode três mais adequado, colocá-los organizados em um oleoduto. Packet DataStreamer a saída fila na primeira conduta DataNode, a primeira saída para um pacote DataNode novamente DataNode segundo, e assim por diante;
  5. DFSOutputStream há uma fila chamada Ack Quene, também composta pelo Packet, espera DataNode para a resposta é recebida, quando tudo DataNode Pipeline no tempo disseram já recebeu, então Akc Quene irá remover o correspondente Packet pacote para fora;
  6. O cliente chama o método completo close () para escrever dados após fluxo de finalização;
  7. DataStreamer os pacotes restantes na escova e depois esperar para Pipeline informação ACK, ACK recebidas após o último, aviso NameNode o arquivo marcada como concluída.

2.4 HDFS comandos usados

1. fs Hadoop

hadoop fs -ls /
hadoop fs -lsr
hadoop fs -mkdir /user/hadoop
hadoop fs -put a.txt /user/hadoop/
hadoop fs -get /user/hadoop/a.txt /
hadoop fs -cp src dst
hadoop fs -mv src dst
hadoop fs -cat /user/hadoop/a.txt
hadoop fs -rm /user/hadoop/a.txt
hadoop fs -rmr /user/hadoop/a.txt
hadoop fs -text /user/hadoop/a.txt
hadoop fs -copyFromLocal localsrc dst  # 与hadoop fs -put 功能类似
hadoop fs -moveFromLocal localsrc dst  # 将本地文件上传到 hdfs,同时删除本地文件

2. hadoop dfsadmin

HDFS está a executar um cliente de dfsadmin

# 报告文件系统的基本信息和统计信息
hadoop dfsadmin -report

hadoop dfsadmin -safemode enter | leave | get | wait 
# 安全模式维护命令。安全模式是 Namenode 的一个状态,这种状态下,Namenode 
# 1. 不接受对名字空间的更改(只读)
# 2. 不复制或删除块
# Namenode 会在启动时自动进入安全模式,当配置的块最小百分比数满足最小的副本数条件时,会自动离开安全模式。安全模式可以手动进入,但是这样的话也必须手动关闭安全模式。

3. hadoop fsck

ferramenta de verificação do sistema de arquivos Run HDFS.

uso:

hadoop fsck [GENERIC_OPTIONS] <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]

4. start-balancer.sh

Apache HDFS API pode ser relacionado para o site oficial para visualização:

Imagem Informações

 

3, um caso de teste

Em compilar e executar Hadoop aglomerado Exemplo 3.2, "The Definitive Guide" na leitura HDFS conteúdo do arquivo.

3.1 código em execução

import java.io.InputStream;

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;

public class FileSystemCat {
    public static void main(String[] args) throws Exception {
        String uri = args[0];
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem. get(URI.create (uri), conf);
        InputStream in = null;
        try {
            in = fs.open( new Path(uri));
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }
}

3.2 implementação

3.2.1 Criando Repertório

Configurando o nome do host hadoop local, shiyanlou precisa digitar a senha do usuário quando sudo. Hadoop irá acrescentar ao fim da última linha.

sudo vim /etc/hosts
# 将hadoop添加到最后一行的末尾,修改后类似:(使用 tab 键添加空格)
# 172.17.2.98 f738b9456777 hadoop
ping hadoop

Use o seguinte comando para iniciar o Hadoop

cd /app/hadoop-1.1.2/bin
./start-all.sh
jps # 查看启动的进程,确保 NameNode 和 DataNode 都有启动

Estabelecer myclass e diretório de entrada usando o seguinte comando no catálogo /app/hadoop-1.1.2:

cd /app/hadoop-1.1.2
rm -rf myclass input
mkdir -p myclass input

Imagem Informações

3.2.2 Exemplos de estabelecer carregar o arquivo para os HDFS

Digite diretório /app/hadoop-1.1.2/input, crie um arquivo em que quangle.txt diretório

cd /app/hadoop-1.1.2/input
touch quangle.txt
vi quangle.txt

diz:

On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.

Imagem Informações

Use o seguinte comando para criar o diretório / class4 nas hdfs

hadoop fs -mkdir /class4
hadoop fs -ls /

说明: Em caso de nenhum comando de erro Hadoop, fazer de novo source hadoop-env.sh. Da mesma forma experiências subsequentes.

(Se você precisa usar o comando direto do Hadoop, necessidade de ser adicionado ao caminho Caminho /app/hadoop-1.1.2)

Imagem Informações

Exemplos upload de arquivos para a pasta class4 hdfs /

cd /app/hadoop-1.1.2/input
hadoop fs -copyFromLocal quangle.txt /class4/quangle.txt
hadoop fs -ls /class4

Imagem Informações

3.2.3 Configurando o ambiente local

Hadoop-env.sh de configuração directório /app/hadoop-1.1.2/conf, como mostrado abaixo:

cd /app/hadoop-1.1.2/conf
sudo vi hadoop-env.sh

Adicionar valor da variável HADOOP_CLASPATH, o valor /app/hadoop-1.1.2/myclass, criada após compilar o arquivo de configuração, para validar a configuração

export HADOOP_CLASSPATH=/app/hadoop-1.1.2/myclass

Imagem Informações

código 3.2.4 write

/App/hadoop-1.1.2/myclass para o diretório, a criação de arquivos de código FileSystemCat.java nesse diretório, o comando é o seguinte:

cd /app/hadoop-1.1.2/myclass/
vi FileSystemCat.java

Digite o conteúdo de código:

Imagem Informações

3.2.5 código compilado

No diretório /app/hadoop-1.1.2/myclass, use o comando para compilar o seguinte código:

javac -classpath ../hadoop-core-1.1.2.jar FileSystemCat.java

Imagem Informações

3.2.6 usando código compilado lê o arquivo HDFS

Usando o comando a seguir para ler o conteúdo do /class4/quangle.txt HDFS:

hadoop FileSystemCat /class4/quangle.txt

Imagem Informações

 

4, Exemplo de Teste 2

No sistema de arquivos local gera um arquivo de texto de cerca de 100 bytes, escrever um programa para ler o conteúdo do arquivo e escrevê-lo para 101-120 bytes de HDFS como um novo arquivo.

código 4.1 implementação

//注意:在编译前请先删除中文注释!
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class LocalFile2Hdfs {
    public static void main(String[] args) throws Exception {

        // 获取读取源文件和目标文件位置参数
        String local = args[0];
        String uri = args[1];

        FileInputStream in = null;
        OutputStream out = null;
        Configuration conf = new Configuration();
        try {
            // 获取读入文件数据
            in = new FileInputStream(new File(local));

            // 获取目标文件信息
            FileSystem fs = FileSystem.get(URI.create(uri), conf);
            out = fs.create(new Path(uri), new Progressable() {
                @Override
                public void progress() {
                    System.out.println("*");
                }
            });

            // 跳过前100个字符
            in.skip(100);
            byte[] buffer = new byte[20];

            // 从101的位置读取20个字符到buffer中
            int bytesRead = in.read(buffer);
            if (bytesRead >= 0) {
                out.write(buffer, 0, bytesRead);
            }
        } finally {
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
        }
    }
}

4.2 implementação

código 4.2.1 write

/App/hadoop-1.1.2/myclass para o diretório, a criação de arquivos de código LocalFile2Hdfs.java nesse diretório, o comando é o seguinte:

cd /app/hadoop-1.1.2/myclass/
vi LocalFile2Hdfs.java

Digite o conteúdo de código:

Imagem Informações

4.2.2 código compilado

No diretório /app/hadoop-1.1.2/myclass, use o comando para compilar o seguinte código:

javac -classpath ../hadoop-core-1.1.2.jar LocalFile2Hdfs.java

Imagem Informações

4.2.3 criar um arquivo de teste

/App/hadoop-1.1.2/input para o diretório, arquivo de construção local2hdfs.txt nesse diretório

cd /app/hadoop-1.1.2/input/
vi local2hdfs.txt

diz:

Washington (CNN) -- Twitter is suing the U.S. government in an effort to loosen restrictions on what the social media giant can say publicly about the national security-related requests it receives for user data.
The company filed a lawsuit against the Justice Department on Monday in a federal court in northern California, arguing that its First Amendment rights are being violated by restrictions that forbid the disclosure of how many national security letters and Foreign Intelligence Surveillance Act court orders it receives -- even if that number is zero.
Twitter vice president Ben Lee wrote in a blog post that it's suing in an effort to publish the full version of a "transparency report" prepared this year that includes those details.
The San Francisco-based firm was unsatisfied with the Justice Department's move in January to allow technological firms to disclose the number of national security-related requests they receive in broad ranges.

Imagem Informações

4.2.4 usando o código compilado para carregar o conteúdo do arquivo para HDFS

Local2hdfs comando a seguir para ler o conteúdo do primeiro byte escrito para HDFS 101-120 em um novo arquivo:

cd /app/hadoop-1.1.2/input
hadoop LocalFile2Hdfs local2hdfs.txt /class4/local2hdfs_part.txt
hadoop fs -ls /class4

Imagem Informações

4.2.5 se a validação for bem sucedida

Use o comando a seguir para ler o conteúdo local2hdfs_part.txt:

hadoop fs -cat /class4/local2hdfs_part.txt

Imagem Informações

 

5, Exemplo de Teste 3

Exemplo de Ensaio 2 é a operação inversa, o HDFS gera um arquivo de texto de aproximadamente 100 bytes, escrever um programa para ler o arquivo, e escreve o conteúdo do primeiro byte do sistema de arquivos local 101-120 para se tornar um novo arquivo.

código 5.1 implementação

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class Hdfs2LocalFile {
    public static void main(String[] args) throws Exception {

        String uri = args[0];
        String local = args[1];

        FSDataInputStream in = null;
        OutputStream out = null;
        Configuration conf = new Configuration();
        try {
            FileSystem fs = FileSystem.get(URI.create(uri), conf);
            in = fs.open(new Path(uri));
            out = new FileOutputStream(local);

            byte[] buffer = new byte[20];
            in.skip(100);
            int bytesRead = in.read(buffer);
            if (bytesRead >= 0) {
                out.write(buffer, 0, bytesRead);
            }
        } finally {
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
        }   
    }
}

5.2 implementação

código 5.2.1 write

/App/hadoop-1.1.2/myclass para o diretório, a criação de arquivos de código Hdfs2LocalFile.java nesse diretório, o comando é o seguinte:

cd /app/hadoop-1.1.2/myclass/
vi Hdfs2LocalFile.java

Digite o conteúdo de código:

Imagem Informações

5.2.2 código compilado

No diretório /app/hadoop-1.1.2/myclass, use o comando para compilar o seguinte código:

javac -classpath ../hadoop-core-1.1.2.jar Hdfs2LocalFile.java

Imagem Informações

5.2.3 criar um arquivo de teste

/App/hadoop-1.1.2/input para o diretório, arquivo de construção hdfs2local.txt nesse diretório

cd /app/hadoop-1.1.2/input/
vi hdfs2local.txt

diz:

The San Francisco-based firm was unsatisfied with the Justice Department's move in January to allow technological firms to disclose the number of national security-related requests they receive in broad ranges.
"It's our belief that we are entitled under the First Amendment to respond to our users' concerns and to the statements of U.S. government officials by providing information about the scope of U.S. government surveillance -- including what types of legal process have not been received," Lee wrote. "We should be free to do this in a meaningful way, rather than in broad, inexact ranges."

Imagem Informações

No diretório /app/hadoop-1.1.2/input fazer o upload do arquivo para as hdfs / / pasta class4:

hadoop fs -copyFromLocal hdfs2local.txt /class4/hdfs2local.txt
hadoop fs -ls /class4/

Imagem Informações

5.2.4 código compilado emitidas o conteúdo do arquivo para o sistema de arquivos HDFS

comando Hdfs2local.txt seguinte para ler o conteúdo de 101-120 byte de gravação para o sistema de arquivos local em um novo arquivo:

hadoop Hdfs2LocalFile /class4/hdfs2local.txt hdfs2local_part.txt

Imagem Informações

5.2.5 se a validação for bem sucedida

Use o comando a seguir para ler o conteúdo hdfs2local_part.txt:

cat hdfs2local_part.txt

Imagem Informações

Publicado 44 artigos originais · ganhou elogios 16 · vê 10000 +

Acho que você gosta

Origin blog.csdn.net/YYIverson/article/details/101109081
Recomendado
Clasificación