[Hadoop] notas de estudio (b) hdfs principio de funcionamiento y

Aprender portero, notas tomadas de los  cursos de construcción de laboratorio

 

1, principio HDFS

HDFS (Hadoop Distributed File System) es un sistema de archivos distribuido. Tiene una alta tolerancia a fallos y proporciona un alto rendimiento de acceso a datos, ideal para su uso en grandes conjuntos de datos, que proporciona un alto grado de tolerancia a fallos y soluciones de almacenamiento masivo de datos de alto rendimiento.

  • 高吞吐量访问: Cada bloque HDFS distribuida en diferentes Rack, cuando un usuario accesos, HDFS se calcularán utilizando el más reciente y el acceso a la mínima cantidad de usuarios del servidor. Puesto que el bloque se copia de seguridad en diferentes Rack, ya no es un único acceso a los datos, la velocidad y la eficiencia es muy rápido. Además HDFS pueden leerse en paralelo desde un clúster de servidores, mayor ancho de banda de acceso de lectura y escritura de archivos.
  • 高容错性: Fallo del sistema es inevitable, cómo hacerlo datos después de la conmutación por error y tolerancia a fallos son críticos. A través de varios HDFS garantizar la fiabilidad de datos, múltiples copias distribuidas a diferentes servidores y la ubicación física de los datos de error de función, la función de auto-test fondo continuo proporciona la consistencia de datos puede ser alta tolerancia a fallos.
  • 线性扩展: Debido a la información HDFS bloque se almacena en NameNode, archivos de bloque distribuye a DataNode, cuando la expansión del número sólo se suman DataNode, el sistema puede hacerse sin detener la expansión de los servicios, sin intervención humana.

1.1 Arquitectura HDFS

Información de la imagen Descripción

Anterior es un maestro y esclavo de la estructura HDFS, divididos NameNode, NameNode Secundaria y DataNode tres funciones.

  • NameNode: Sólo hay un nodo maestro, y la gestión de espacio de nombres hdfs información de asignación de bloque de datos Hadoop1.X, la copia de la solicitud de configuración y de política de cliente;
  • Secondary NameNode: Auxiliar NameNode, la cuota de trabajo NameNode regularmente fsimage fusión y fsedits y empujó a NameNode, situaciones de emergencia pueden ayudar NameNode recuperación;
  • DataNode: El nodo esclavo, los datos se almacenan realmente, y leyendo y escribiendo el bloque de datos para el informe NameNode almacenamiento de la información;

2.2 HDFS leen

Información de la imagen Descripción

  1. Client desea abrir el archivo leído por el método de llamada open () objeto FileSystem, por HDFS, este objeto es una instancia del sistema de archivos distribuido;
  2. DistributedFileSystem mediante RPC para llamar NameNode para determinar la ubicación del bloque de inicio del archivo, de acuerdo con el número de repeticiones de un mismo bloque de retorno múltiples ubicaciones que siguen topología de clúster Hadoop tipo, desde el lado del cliente cerca de la superficie superior;
  3. Los dos primeros pasos devolverá un objeto FSDataInputStream se encapsulan en objetos DFSInputStream, DFSInputStream puede manejar fácilmente y DataNode corriente NameNode, el cliente llama al método de lectura () de la corriente de entrada;
  4. DFSInputStream DataNode dirección de bloque de inicio archivo almacenado inmediatamente cercana DataNode conectado, a través de un conjunto de datos corriente llamada leen repetidamente () método, puede transferir datos desde el cliente al DataNode;
  5. Al llegar al final de la manzana, DFSInputStream cierra la conexión con el DataNode y buscar la siguiente mejor DataNode bloque, estas operaciones son transparentes para el cliente, el punto de vista de sólo lectura de un flujo continuo del cliente;
  6. Una vez que el cliente ha completado la lectura, sobre el método correcto llamada FSDataInputStream close () para cerrar el archivo leído.

 

2.3 HDFS escriben operación

 

Información de la imagen Descripción

  1. DistributedFileSystem cliente llamando al método create () crea un nuevo archivo;
  2. DistributedFileSystem por llamada RPC para crear un nuevo archivo no asociado NameNode bloques, creada antes NameNode va a hacer una gran variedad de verificación, como la que existe un archivo, el cliente o sin permiso para crear y así sucesivamente. Si el cheque, NameNode registra un récord para la creación de un nuevo archivo, de lo contrario se producirá una excepción IO;
  3. Tras el regreso de los dos primeros objetos FSDataOutputStream, y similar a la lectura de un archivo, se empaqueta en FSDataOutputStream DFSOutputStream, DFSOutputStream NameNode puede coordinar y DataNode. Comience a escribir datos al cliente los datos DFSOutputStream, DFSOutputStream cortarán un pequeño paquete y se escriben en la cola interna conocida como "cola de datos" (Cola de datos);
  4. DataStreamer va a tratar con aceptables datos de cola, su primera consulta NameNode la nueva tienda más adecuado bloque donde DataNode varios años, tales como el número de repeticiones es 3, entonces encontrar el DataNode tres más adecuado, ponerlos dispuestos en una tubería. Paquete DataStreamer la salida de cola en el primer conducto DataNode, la primera salida a un paquete DataNode de nuevo DataNode segundo, y así sucesivamente;
  5. DFSOutputStream hay una cola llamada Ack Quene, también compuesta por el paquete, se recibe de espera DataNode para la respuesta, cuando todo Pipeline DataNode en el tiempo se han dicho ya recibido, entonces Akc Quene eliminará el correspondiente paquete de paquete a cabo;
  6. El cliente llama al método completo close () para escribir datos después de la finalización corriente;
  7. DataStreamer los paquetes restantes en el cepillo y luego esperar a Pipeline Ack de información, Ack recibido después de la última, aviso NameNode el archivo marcado como completado.

2.4 HDFS comandos comúnmente 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 se está ejecutando un cliente de dfsadmin

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

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

3. Hadoop fsck

herramienta de prueba del sistema de ejecución HDFS.

uso:

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

4. start-balancer.sh

API Apache HDFS puede estar relacionado con la página web oficial del arte:

Información de la imagen Descripción

 

3, un caso de prueba

En compilar y ejecutar Hadoop cúmulo Ejemplo 3.2, "La guía definitiva" en la lectura hdfs contenido del archivo.

3.1 código que se ejecuta

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 aplicación

3.2.1 Creación Directorio de Código

Configurando el nombre de host hadoop locales, shiyanlou tendrá que introducir la contraseña del usuario cuando sudo. Hadoop se sumará a la final de la última línea.

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

Utilice el siguiente comando para iniciar el Hadoop

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

Establecer miclase y el directorio de entrada utilizando el siguiente comando en el catálogo /app/hadoop-1.1.2:

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

Información de la imagen Descripción

3.2.2 Ejemplos de establecimiento de subir el archivo a los HDFS

Entra en el directorio /app/hadoop-1.1.2/input, crear un archivo en el directorio que quangle.txt

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

dice:

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

Información de la imagen Descripción

Utilice el siguiente comando para crear el directorio / class4 en los hdfs

hadoop fs -mkdir /class4
hadoop fs -ls /

说明: En caso de no hadoop comando de error, hacer de nuevo source hadoop-env.sh. experimentos mismo modo subsiguientes.

(Si es necesario utilizar el mando directo hadoop, necesidad de ser añadido a la ruta Ruta /app/hadoop-1.1.2)

Información de la imagen Descripción

Ejemplos subir archivos a la carpeta hdfs / class4

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

Información de la imagen Descripción

3.2.3 Configuración del entorno local

Hadoop-env.sh de configuración de directorio /app/hadoop-1.1.2/conf, como se muestra a continuación:

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

Añadir HADOOP_CLASPATH valor de la variable, el valor /app/hadoop-1.1.2/myclass, establecido después de compilar el archivo de configuración, para validar la configuración

export HADOOP_CLASSPATH=/app/hadoop-1.1.2/myclass

Información de la imagen Descripción

3.2.4 código de escritura

/App/hadoop-1.1.2/myclass en el directorio, el establecimiento de archivos de código FileSystemCat.java en ese directorio, el comando es el siguiente:

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

Introduzca el contenido del código:

Información de la imagen Descripción

3.2.5 código compilado

En el directorio /app/hadoop-1.1.2/myclass, utilice el comando para compilar el código siguiente:

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

Información de la imagen Descripción

3.2.6 usando el código compilado lee el archivo HDFS

Con el siguiente comando para leer el contenido de la /class4/quangle.txt HDFS:

hadoop FileSystemCat /class4/quangle.txt

Información de la imagen Descripción

 

4, Ejemplo de ensayo 2

En el sistema de archivos local genera un archivo de texto de alrededor de 100 bytes, escribir un programa para leer el contenido del archivo y escribirlo a 101-120 bytes de HDFS como un nuevo archivo.

código de aplicación 4.1

//注意:在编译前请先删除中文注释!
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 aplicación

4.2.1 código de escritura

/App/hadoop-1.1.2/myclass en el directorio, el establecimiento de archivos de código LocalFile2Hdfs.java en ese directorio, el comando es el siguiente:

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

Introduzca el contenido del código:

Información de la imagen Descripción

4.2.2 código compilado

En el directorio /app/hadoop-1.1.2/myclass, utilice el comando para compilar el código siguiente:

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

Información de la imagen Descripción

4.2.3 crear un archivo de prueba

/App/hadoop-1.1.2/input en el directorio, fichero de construcción local2hdfs.txt en ese directorio

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

dice:

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.

Información de la imagen Descripción

4.2.4 usando el código compilado para cargar el contenido del archivo a HDFS

Local2hdfs comandos siguientes para leer el contenido del primer byte escrito a HDFS 101-120 en un nuevo archivo:

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

Información de la imagen Descripción

4.2.5 si la validación es correcta

Utilice el siguiente comando para leer el contenido local2hdfs_part.txt:

hadoop fs -cat /class4/local2hdfs_part.txt

Información de la imagen Descripción

 

5, Ejemplo de ensayo 3

Ejemplo de ensayo 2 es la operación inversa, el HDFS genera un archivo de texto de aproximadamente 100 bytes, escribir un programa para leer el archivo y escribe el contenido del primer byte del sistema de archivos local 101-120 para convertirse en un nuevo archivo.

código de aplicación 5.1

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 aplicación

5.2.1 código de escritura

/App/hadoop-1.1.2/myclass en el directorio, el establecimiento de archivos de código Hdfs2LocalFile.java en ese directorio, el comando es el siguiente:

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

Introduzca el contenido del código:

Información de la imagen Descripción

5.2.2 código compilado

En el directorio /app/hadoop-1.1.2/myclass, utilice el comando para compilar el código siguiente:

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

Información de la imagen Descripción

5.2.3 crear un archivo de prueba

/App/hadoop-1.1.2/input en el directorio, fichero de construcción hdfs2local.txt en ese directorio

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

dice:

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."

Información de la imagen Descripción

En el directorio /app/hadoop-1.1.2/input para cargar el archivo a los hdfs / carpeta / class4:

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

Información de la imagen Descripción

5.2.4 código compilado generan a través de los contenidos del archivo al sistema de archivos HDFS

Hdfs2local.txt comando siguiente para leer el contenido de 101-120 bytes de escritura en el sistema de archivos local en un nuevo archivo:

hadoop Hdfs2LocalFile /class4/hdfs2local.txt hdfs2local_part.txt

Información de la imagen Descripción

5.2.5 si la validación es correcta

Utilice el siguiente comando para leer el contenido hdfs2local_part.txt:

cat hdfs2local_part.txt

Información de la imagen Descripción

Publicado 44 artículos originales · elogios ganado 16 · Vistas a 10000 +

Supongo que te gusta

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