Operaciones de la API de Java en HDFS de Hadoop

1. Preparación

1.1, descomprimir

Descomprima el paquete de instalación de hadoop en una ruta que no sea china (por ejemplo: D: \ users \ hadoop-2.6.0-cdh5.14.2)

1.2, variables de entorno

Configure la variable de entorno HADOOP_HOME en Windows (
similar al método de configuración de la variable de entorno jdk en Windows )

1.3. Nueva construcción

Utilice herramientas de desarrollo para crear un proyecto Maven

1.4, paquetes dependientes

Importe las dependencias correspondientes, que son las siguientes:

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>2.8.2</version>
	</dependency>
	<dependency>
		<groupId>org.apache.hadoop</groupId>
		<artifactId>hadoop-common</artifactId>
		<version>2.6.0-cdh5.14.2</version>
	</dependency>
	<dependency>
		<groupId>org.apache.hadoop</groupId>
		<artifactId>hadoop-client</artifactId>
		<version>2.6.0-cdh5.14.2</version>
	</dependency>
	<dependency>
		<groupId>org.apache.hadoop</groupId>
		<artifactId>hadoop-hdfs</artifactId>
		<version>2.6.0-cdh5.14.2</version>
	</dependency>
</dependencies>

Nota: El repositorio de Maven no admite dependencias relacionadas con cdh. Cloudera ha creado un
repositorio relacionado por sí mismo y es necesario agregar el repositorio de cloudera por separado al pom.

<repositories>
	 <repository>
		 <id>cloudera</id>
		 <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
	 </repository>
</repositories>

1,5, prueba

Cree un paquete cn.big.data, cree la clase HdfsClient y utilice el método Junit para probar
Crear un directorio

package cn.big.data;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class HdfsClient {
    
    
    @Test
    public void testMkdirs() throws IOException, InterruptedException, URISyntaxException {
    
    

        // 1 获取文件系统
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"), conf, "root");

        // 2 创建目录
        fs.mkdirs(new Path("/myApi"));

        // 3 关闭资源
        fs.close();
    }
}

1.6, asuntos que requieren atención

Si idea no puede imprimir el registro, solo se mostrará la siguiente información en la consola

1.log4j:WARNNoappenderscouldbefoundforlogger(org.apache.hadoop.
util.Shell).
2.log4j:WARNPleaseinitializethelog4jsystemproperly.
3.log4j:WARNSeehttp://logging.apache.org/log4j/1.2/faq.html#noconfi
gformoreinfo.

Necesita crear un nuevo archivo en el directorio src / main / resources del proyecto,
asígnele el nombre "log4j.properties" y complete el archivo:

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

2. Cómo usar

2.1, carga de archivos HDFS

@Test
    public void upLoad() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        // 设置副本存储数量为1,默认是3
        configuration.set("dfs.replication","1");
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");
        //上传文件
        fs.copyFromLocalFile(new Path("D:\\study\\codes\\hadoop\\HdfsClientDemo\\data\\hdfsDemo\\test.txt"),new Path("/myApi/"));
        //关闭资源
        fs.close();

        System.out.println("ok");
    }

2.2, descarga de archivo HDFS

@Test
    public void downLoad() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        //下载文件
        // boolean delSrc 指是否将原文件删除
        // Path src 指要下载的文件路径
        // Path dst 指将文件下载到的路径
        // boolean useRawLocalFileSystem 是否开启文件校验
        fs.copyToLocalFile(false,new Path("/myApi/test.txt"),new Path("D:\\study\\codes\\hadoop\\HdfsClientDemo\\HdfsTest"),true);
        fs.close();
    }

2.3, eliminación de carpetas HDFS

@Test
    public void dRemove() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        //删除文件夹
        fs.delete(new Path("/myApi/remove"),true);
        fs.close();
    }

2.4, cambio de nombre de archivo HDFS

public void fRename() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        //修改文件名
        fs.rename(new Path("/myApi/test.txt"),new Path("/myApi/testRename.txt"));
        fs.close();
    }

2.5, vista de detalles de archivo HDFS

@Test
    public void testListFiles() throws IOException, URISyntaxException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        //获取文件详情
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"),true);
        while (listFiles.hasNext()){
    
    
            LocatedFileStatus status = listFiles.next();
            //输出详情
            //文件名称
            System.out.println(status.getPath().getName());
            //长度
            System.out.println(status.getLen());
            //权限
            System.out.println(status.getPermission());
            //组
            System.out.println(status.getGroup());
            //获取存储的块信息
            BlockLocation[] blockLocations = status.getBlockLocations();
            for (BlockLocation blockLocation : blockLocations) {
    
    
                //获取块存储的主机节点
                String[] hosts = blockLocation.getHosts();
                for (String host : hosts) {
    
    
                    System.out.println(host);
                }
            }
            System.out.println("-------------------------------");
        }
    }

2.6, juicio de carpetas y archivos HDFS

@Test
    public void testListStatus() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        //判断是文件还是文件夹
        FileStatus[] listStatus = fs.listStatus(new Path("/"));
        for (FileStatus fileStatus : listStatus) {
    
    
            if (fileStatus.isFile()){
    
    
                System.out.println("f:"+fileStatus.getPath().getName());
            }else {
    
    
                System.out.println("d:"+fileStatus.getPath().getName());
            }
        }
        fs.close();
    }

2.7, operaciones de flujo de E / S HDFS

2.7.1 Carga de archivos

@Test
    public void putFileToHDFS() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        //创建输入流
        FileInputStream fis = new FileInputStream(new File("D:\\study\\codes\\hadoop\\HdfsClientDemo\\HdfsTest\\test.txt"));
        //获取输出流
        FSDataOutputStream fos = fs.create(new Path("/myApi/testIO.txt"));
        //执行流拷贝
        IOUtils.copyBytes(fis,fos,configuration);
        //关闭资源
        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);
    }

2.7.2 Descarga de archivos

@Test
    public void getFileFromHDFS() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        //获取输入流
        FSDataInputStream fis = fs.open(new Path("/myApi/testIO.txt"));
        //获取输出流
        FileOutputStream fos = new FileOutputStream(new File("D:\\study\\codes\\hadoop\\HdfsClientDemo\\HdfsTest\\IODownload.txt"));
        //流的对拷
        IOUtils.copyBytes(fis,fos,configuration);
        //关闭资源
        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);
        fs.close();
    }

2.8, lectura de archivos de posicionamiento

Se enfatiza aquí que puede establecer cualquier ubicación para leer el archivo hdfs, lo cual es útil para comprender cómo mapreduce divide las entradas divididas y las particiones de chispa.
Primero cargue el paquete de instalación de hadoop en el sistema de archivos HDFS
Descarga la primera pieza

@Test
    public void readFileSeek1() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        FSDataInputStream fis = fs.open(new Path("/myApi//hadoop-2.6.0-cdh5.14.2.tar.gz"));
        FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\Dongue\\Desktop\\seek\\hadoop-2.6.0-cdh5.14.2.tar.gz.part1"));
        //流的拷贝
        byte[] buf = new byte[1024];
        for (int i = 0; i < 1024 * 128; i++) {
    
    
            fis.read(buf);
            fos.write(buf);
        }
        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);
    }

descarga exitosa
Inserte la descripción de la imagen aquí
Descarga la segunda pieza

@Test
    public void readFileSeek2() throws URISyntaxException, IOException, InterruptedException {
    
    
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.247.130:9000"),configuration,"root");

        FSDataInputStream fis = fs.open(new Path("/myApi//hadoop-2.6.0-cdh5.14.2.tar.gz"));
        //定位输入数据位置
        fis.seek(1024*1024*128);
        FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\Dongue\\Desktop\\seek\\hadoop-2.6.0-cdh5.14.2.tar.gz.part2"));
        //流的对拷
        IOUtils.copyBytes(fis,fos,configuration);

        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);
    }

Fusionar archivos
Ejecutar en la ventana de comandos de la ventana

type hadoop-2.6.0-cdh5.14.2.tar.gz.part2 >> hadoop-2.6.0-cdh5.14.2.tar.gz.part1

Después de la fusión está el archivo completo del paquete de instalación de hadoop
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_48482704/article/details/111089319
Recomendado
Clasificación