hadoop详细文档(六) hadoop之HDFS的java客户端(附带详细讲解视频)

免费视频教程 https://www.51doit.com/ 或者联系博主微信 17710299606

使用idea创建java项目

添加hdp需要的jar包

或者创建maven项目添加依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-common</artifactId>
        <version>2.8.5</version>
    </dependency>
</dependencies>

0 在windows中配置HDP环境

注意: 从HDFS中下载内容到windows系统 , 跨系统操作,需要在本地安装hdp的环境

在windows系统环境变量中配置HADOOP_HOME

0.1 解压到指定的目录中

0.2 配置系统环境变量

扫描二维码关注公众号,回复: 11706675 查看本文章

1 入门程序 (创建文件夹)  mkdirs

package com._51doit.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.net.URI;
/**
 * @Auther: 多易教育-行哥
 * @Date: 2020/7/8
 * @Description:  使用java程序 操作HDFS文件系统
 * 1 获取代表这个文件系统的对象
 *    1)hdfs的位置 2) 配置对象 3)  用户名
 * 2 操作
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        // 指定hdfs的位置   alt+enter 抛出异常
        URI uri = new URI("hdfs://linux01:9000");
        // 用户的配置设置对象
        Configuration conf = new Configuration();
        // 当前操作客户端的用户名
        String username = "root" ;
        /**
         * 参数一  URI  指定HDFS文件系统的位置
         * 参数二 配置对象  用户的自定义设置  文件上传的副本个数
         * 参数三 用户名  root
         */
        FileSystem fs = FileSystem.newInstance(uri, conf, username);
        // 创建一个文件夹  new File("") ; new Path("") ;
        // Path对象是hdfs中对路径的抽象
        Path path = new Path("/doit16/hdp");

        // 创建层级文件夹
        boolean b = fs.mkdirs(path);
        if(b){
            System.out.println("创建成功");
        }else{
            System.out.println("创建失败");
        }
        // 释放资源
        fs.close();
    }
}

2 上传文件 copyFromLocalFile

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.net.URI;
/**
 * @Auther: 多易教育-行哥
 * @Date: 2020/7/8
 * @Description:
 */
public class Upload2Hdfs {
    public static void main(String[] args) throws Exception {
        // 1 创建文件系统的对象
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:9000"), conf, "root");
        Path src = new Path("d://hadoop-2.8.1.zip"); // 本地路径  待上传的内容
        Path dis = new Path("/doit16/hdp/");// HDFS系统的路径
        /**
         * 参数一 本地路径  待上传的内容
         * 参数二 HDFS系统的路径
         */
      //  fs.copyFromLocalFile(src, dis); // 没有返回值
        /**
         * 参数一  是否删除上传的文件   默认 是false 不删除   true 删除(剪切)
         * 参数二  是否覆盖HDFS中已存在的内容  默认 true
         * 参数三  本地路径  待上传的内容
         * 参数四  HDFS系统的路径
         */
        fs.copyFromLocalFile(true , true ,src, dis);
        fs.close();
    }
}

3 下载

import com._51doit.utils.DoitUtils;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 * @Auther: 多易教育-行哥
 * @Date: 2020/7/8
 * @Description:
 *    配置本地hdp环境
 */
public class DownLoad {

    public static void main(String[] args) throws Exception {
        // 获取客户端对象
        FileSystem fs = DoitUtils.getFs();
        Path p1 = new Path("/doit16/hdp/hadoop-2.8.1.zip");
        Path p2 = new Path("d://");
        /**
         * 参数一  HDFS的路径
         * 参数二  本地路径
         */
       // fs.copyToLocalFile(p1, p2);
        /**
         * 参数一  是否删除HDFS中下载的文件
         * 参数二  HDFS的路径
         * 参数三  本地路径
         * 参数四  是否不生成校验文件  默认是false 生成
         */
        fs.copyToLocalFile(false, p1 , p2 , true);
        fs.close();
    }
}

4 删除

import com._51doit.utils.DoitUtils;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 * @Auther: 多易教育-行哥
 * @Date: 2020/7/8
 * @Description:  删除HDFS中的内容
 */
public class DeleteDemo {
    public static void main(String[] args) throws Exception {
        FileSystem fs = DoitUtils.getFs();
        /**
         * 参数一  要删除的内容文件  文件夹
         * 参数二 是否递归删除(强制)  true
         * 返回值 删除成功返回true
         */
        Path path = new Path("/doit16");
        if(fs.exists(path)){ // 判断内容是否存在
            boolean b = fs.delete(path, true);
            if(b){
                System.out.println("删除内容成功");
            }else{
                System.out.println("删除内容失败");
            }
        }else{
            System.out.println("删除的内容不存在");
        }
        fs.close();
    }
}

5 移动+重命名

5.1 重命名

        Path path1 = new Path("/a.txt");
        Path path2 = new Path("/aa.txt");
        *//**
         * 参数一  要改名的文件
         * 参数二   改名后的文件名
         *//*
        fs.rename(path1 , path2)

5.2 移动

        Path path1 = new Path("/aa.txt");
        Path path2 = new Path("/aaaa/");
       /**
         * 参数一  要改名的文件
         * 参数二   改名后的文件名
         *//*
        fs.rename(path1 , path2);

5.3 移动+重命名

        Path path1 = new Path("/aaaa/aa.txt");
        Path path2 = new Path("/a.doc");
        /**
         * 参数一  要改名的文件
         * 参数二   改名后的文件名
         */
        fs.rename(path1 , path2);

6 读取数据

import com._51doit.utils.DoitUtils;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * @Auther: 多易教育-行哥
 * @Date: 2020/7/8
 * @Description:
 */
public class ReadData {
    public static void main(String[] args) throws Exception {
        FileSystem fs = DoitUtils.getFs();
        // 开启文件的输入流
        FSDataInputStream fin = fs.open(new Path("/app.txt"));
      //  fin.seek(1); 随机读取
        // 将输入流包装成缓冲字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(fin));
        String line = null;
        long len = 0l ;
        // 读取所有的数据
        while ((line = br.readLine()) != null) {
            len += line.length()+1 ; //  记录读取数据的长度
            System.out.println(line);
        }
        // 释放资源
        fin.close();
        br.close();
        fs.close();
    }
}

7 写数据

HDFS分布式文件系统,存储的一般都是一些静态文件数据, 不太建议向文件中写数据, 不支持随机写数据 , 支持追加内容

一次存储 多次读取

import com._51doit.utils.DoitUtils;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

/**
 * @Auther: 多易教育-行哥
 * @Date: 2020/7/8
 * @Description:
 */
public class WriteData {
    public static void main(String[] args) throws Exception {
        FileSystem fs = DoitUtils.getFs();
        /**
         * 参数一  hdfs文件路径   自动创建
         * 参数二  是否覆盖已经存在的文件
         */
        FSDataOutputStream fout = fs.create(new Path("/app.txt"), true);
        fout.write("hello boys \n".getBytes());
        fout.write("hello girl \n".getBytes());
        fout.close();
        fs.close();
    }

    /**
     * 追加写
     * @param fs
     * @throws IOException
     */
    private static void appendData(FileSystem fs) throws IOException {
        // 追加内容   路径中的文件 一定是存在的
        FSDataOutputStream fout = fs.append(new Path("/app.txt"));
        // 追加写
        fout.write("\nhello tom jim cat \n".getBytes());
        fout.close();
    }
}

8 查看指定目录下的内容查看文件信息

import com._51doit.utils.DoitUtils;
import org.apache.hadoop.fs.*;
import java.io.IOException;

/**
 * @Auther: 多易教育-行哥
 * @Date: 2020/7/8
 * @Description: 变量路径下所有的内容
 *   文件
 *    文件夹
 */
public class ListContents {
    public static void main(String[] args) throws Exception {
        FileSystem fs = DoitUtils.getFs();
        // 遍历文件夹下的内容 包括文件和文件夹
        FileStatus[] status = fs.listStatus(new Path("/"));
        for (FileStatus fileStatus : status) {
            Path path = fileStatus.getPath();
           //if(fs.isDirectory())  // 是否是文件夹
               if(fs.isFile(path)){// 是否是文件
                   // 获取元信息
               }else{
                   // 遍历一下
               }
        }
        fs.close();

    }

    private static void myListFile(FileSystem fs) throws IOException {
        // 遍历文件  递归遍历/ 路径下所有的文件
        RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"), true);
        while(files.hasNext()){
            LocatedFileStatus file = files.next();
            Path path = file.getPath();  // 路径
            String name = path.getName(); // 文件名
            long len = file.getLen(); // 大小
            long size = file.getBlockSize(); //  物理切块大小
            short number = file.getReplication();// 副本的个数 默认3
            /**
             * 获取文件的数据块位置
             *   数据物理切块的信息
             */
            BlockLocation[] blockLocations = file.getBlockLocations();
            // 遍历每个文件的物理块
            for (BlockLocation blockLocation : blockLocations) {
                long length = blockLocation.getLength(); // 数据物理切块的实际大小
                String[] hosts = blockLocation.getHosts();// 每个物理切块的数据三个副本
                long offset = blockLocation.getOffset(); // 数据块的起始偏移量
                for (String host : hosts) {
                    System.out.println(name+"--"+length+":"+offset+":"+host);
                }
            }

           // System.out.println(path+":"+name+":"+len+":"+size+":"+number);
        }
    }
}

9 配置对象详解

9.1  所有的操作有默认参数的

副本3  物理切块128M

9.2 可以在代码中设置

Configuration conf = new Configuration();
conf.set("dfs.replication","5");
conf.set("dfs.blocksize","32M");

9.3 默认会读取本项目中的配置文件

默认会读取classpath下的core-site.xml / core-default.xml   hdfs-site.xml   hdfs-default.xml    xxx-site.xml

9.4 配置参数生效的优先级

代码中 > 项目的配置文件中 > 默认配置参数

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

import java.net.URI;
import java.net.URISyntaxException;

/**
 * @Auther: 多易教育-行哥
 * @Date: 2020/7/8
 * @Description:
 */
public class ConfDetail {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.set("dfs.replication","5");
        conf.set("dfs.blocksize","32M");
        URI uri = new URI("hdfs://linux01:9000");
        FileSystem fs = FileSystem.newInstance(uri, conf, "root");
        /**
         * 默认物理切块是128M  文件的副本3
         */
       fs.copyFromLocalFile(new Path("d://a.json") , new Path("/z.json"));

        fs.close();


    }
}

猜你喜欢

转载自blog.csdn.net/qq_37933018/article/details/107201020
今日推荐