hadoop-day02

1 JAVA-HDFS-API 

1.1 maven快速入门 (项目构建工具)

1 构建项目

2 管理项目的依赖的jar包

hadoop-day02

hadoop-day02

使用本地的一个文件夹来存储jar包 称为本地仓库

hadoop-day02

 在d盘创建文件夹

hadoop-day02

将settting.xml文件复制到和repository平级的目录下

hadoop-day02

修改setting文件的55行 , 改成自己的目录

hadoop-day02

创建一个项目 然后修改本地仓库的位置

hadoop-day02

hadoop-day02

点击刷新按钮 等待下载插件完毕

hadoop-day02

添加项目的依赖

  mysqlmysql-connector-java5.1.47

1.2 创建maven项目  操作HDFS

1 添加依赖

2 创建类  修改类的模板

按照顺序打开File–>settings–>Editor–>File and Code Templates–>Includes

/**
 * @Classname ${NAME}
 * @Description TODO
 * @Date ${DATE} ${TIME}
 * @Created by ${USER}
 */

hadoop-day02

hadoop-day02

1,3 入门程序

1.3.1 添加依赖 

 org.apache.maven.pluginsmaven-compiler-plugin88org.apache.hadoophadoop-common3.1.1org.apache.hadoophadoop-hdfs3.1.1org.apache.hadoophadoop-mapreduce-client-core3.1.1org.apache.hadoophadoop-mapreduce-client-common3.1.1org.apache.hadoophadoop-mapreduce-client-jobclient3.1.1

1.3.2 入门程序

/**
 * @Classname Demo2
 * @Date 2020/9/20 0020 11:03
 * @Created by 多易教育-DOIT18
 * @Description:
 * 使用hadoop提供的就java API 操作HDFS系统
 * 1 导入HDFS的依赖
 * 2 获取一个代表 HDFS文件系统的对象
 *    1) URI hdfs://linux01:8020
 *    2) 用户自定义设置参数
 * 3 对象.方法操作
 * 4 释放资源
 * ls
 * put
 * get
 * rm
 * mkdir
 */
public class Demo2 {

    public static void main(String[] args) throws Exception {
        //  1创建一个配置对象
        Configuration conf = new Configuration();
        // 2 创建一个代码分布式文件系统的对象
        /**
         * 1 不能直接new 有创建实例的静态方法
         * 2三个参数
         *   2.1 参数一 指定的HDFS文件系统的URI
         *   2.2 配置信息对象
         *   2.3 windows上运行程序  , 用户名  root
         */
        FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root");
        // 3 调用方法
        // 创建层级文件夹
        fs.mkdirs(new Path("/aaa/bbb/ccc/ddd"));

        //4 释放资源
        fs.close();

    }
}

1.4 创建文件夹

 /**
     * 创建文件夹
     * @throws Exception
     */
    private static void testMkdirs() throws Exception {
        FileSystem fs = DoitUtils.getHDFSfs();
        fs.mkdirs(new Path("/a/b/c")) ;
        fs.close();
    }

1.5 删除内容

   private static void testDelete2(FileSystem fs) throws IOException {
        fs.delete(new Path("/a"), true);
    }

    /**
     * 删除文件夹
     * @throws Exception
     */
    private static void testDelete() throws Exception {
        FileSystem fs = DoitUtils.getHDFSfs();
        testDelete2(fs);
        fs.close();
    }

1.6 判断路径是否存在

 public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        URI uri = new URI("hdfs://linux01:8020");
        String  user = "root" ;
        FileSystem fs = FileSystem.newInstance(uri, conf, user);
        boolean exists = fs.exists(new Path("/aaa"));
        System.out.println(exists);
        fs.close();
    }

1.7 工具类封装

/**
 * @Classname DoitUtils
 * @Date 2020/9/20 0020 11:49
 * @Created by 多易教育-DOIT18
 * @Description:
 * 1 获取 hdfs://linux01:8020 文件系统的客户端对象
 */
public class DoitUtils {
    /**
     * 获取 分布式文件系统客户端
     * @return
     * @throws Exception
     */
    public  static FileSystem  getHDFSfs() throws Exception {
        Configuration conf = new Configuration();
        URI uri = new URI("hdfs://linux01:8020");
        String  user = "root" ;
        FileSystem fs = FileSystem.newInstance(uri, conf, user);
        return fs ;
    }

}

1.8 上传

private static void put(FileSystem fs) throws IOException {
        // 将本地的文件上传到HDFS中
        /**
         * 参数一是否删除源文件
         * 参数二 是否覆盖已有的文件
         * 参数三 要上传的文件   Path[]
         * 参数四  HDFS的目标位置
         */
        Path[] ps = new Path[]{new Path("d://word.txt") , new  Path("d://a.txt")} ;
        fs.copyFromLocalFile(false , true , ps,new Path("/"));
    }

1.9 下载

在下载文件的时候需要在本地配置HADOOP的系统环境变量

解压压缩文件,配置系统环境变量 

hadoop-day02

  private static void get(FileSystem fs) throws IOException {
        // 下载 从HDFS 下载内容到windows  需要在windows上配置HDP的环境
        /**
         * 参数一  是否删除HDFS上要下载的文件
         * 参数二 HDFS上要下载的文件
         * 参数三  本地的路径
         * 参数四 是否生成校验文件 默认是false   true 不会生成校验文件
         */
        fs.copyToLocalFile(false , new Path("/a.txt") , new Path("f://"),true);
    }

1.10 配置详解

hadoop-day02

/**
 * @Classname Config
 * @Date 2020/9/20 0020 14:45
 * @Created by 多易教育-DOIT18
 * @Description:
 * 用户想自定义配置参数   Configuration用于用户的定制化设置
 *    上传    6个副本
 *  1 可以使用Configuration来自定义设置参数
 *  2 不设置采用默认的配置参数
 *  3 如果用户在代码中没有设置参数  但是在项目的resources文件夹下有hdfs-site.xml  core-site.xml hdfs-default.xml
 *  就会自动的读取配置参数
 *  顺序
 *   代码中 >>> 配置文件 >>>>默认的
 *
 *  范围
 *  默认的 >>> 配置文件 >>> 代码中
 */
public class Config {
    public static void main(String[] args) throws Exception {
        //
        Configuration conf = new Configuration();
        //设置存储副本的个数
       // conf.set("dfs.replication" ,"2" );
        // 设置物理切块的大小
      //  conf.set("dfs.blocksize","64M");
        FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root");
        fs.copyFromLocalFile(new Path("d://mrdata.zip") ,new Path("/aa/a.zip"));
        fs.close();
    }

}

1.11 读取数据 

/**
 * @Classname ReadHdfsData
 * @Date 2020/9/20 0020 15:24
 * @Created by 多易教育-DOIT18
 * @Description: open()  输入的字节流
 * 使用java读取hdfs上的文件数据(输入流)
 * 1 输入流
 *   字节流
 *   字符流
 *   转换流
 *  2 读取数据 随机读 skip seek
 *  3 记录读取数据的长度
 *  4 line.length()不包含换行符  +1 / +2
 *
 */
public class ReadHdfsData {
    public static void main(String[] args) throws Exception {
        FileSystem fs = DoitUtils.getHDFSfs();
        FSDataInputStream fis = fs.open(new Path("/word.txt"));
        fis.seek(3); // skip
       /* fis.read();
        fis.read();
        fis.read();
        int i = fis.read();
        System.out.println(i); //97*/
        // 使用缓冲字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
        long len = 0 ;
        String line = null ;
         while((line=br.readLine())!=null){
             // line.length() 一行数据的内容长度  每行需要+ 换行长度 在windows中+2 rn  在linux中的文件 +1 r
             len+= line.length()+ 2 ;
             if(len >= 100){
                 break ;
             }
             System.out.println(line);
         }
        System.out.println(len);

        fis.close();
        fs.close();

    }
}

1.12 写数据 

不能随机写 ,创建一个文件写 , 向文件的后面追加写

 private static void append() throws Exception {
        FileSystem fs = DoitUtils.getHDFSfs();
        //append 向文件的末尾追加内容
        FSDataOutputStream fout = fs.append(new Path("/word.txt"));
        fout.write("nihao".getBytes());
        fout.close();
        fs.close();
    }

    private static void testCreate(FileSystem fs) throws IOException {
        // create 创建一个文件获取输出流
        //参数1  hdfs的文件
        // 参数2 是否要覆盖写  默认是true  false 不允许覆盖写
        FSDataOutputStream fout = fs.create(new Path("/a.txt"),true);
        fout.write("hello".getBytes());
        fout.close();
    }

 

1.13 遍历路径下所有的文件

/**
 * @Classname ListDemo
 * @Date 2020/9/20 0020 16:30
 * @Created by 多易教育-DOIT18
 * @Description: fs.listFiles
 * 遍历指定路径写下所有的文件
 * 1 获取文件名
 * 2 获取文件的路径
 * 3 获取文件的长度
 * 4 文件的副本个数
 * 5 获取文件的物理切块
 * 6 获取修改时间 访问时间  获取拥有者 组  权限
 * & ****获取文件的元数据信息
 */
public class ListDemo {
    public static void main(String[] args) throws Exception {
        FileSystem fs = DoitUtils.getHDFSfs();
        /**
         * 列出指定目录下所有的文件
         * 参数一路径
         * 参数二 是否递归遍历
         */
        RemoteIterator iterator = fs.listFiles(new Path("/"), false);
        while(iterator.hasNext()){
            // 代表一个文件
            LocatedFileStatus fileStatus = iterator.next();
            // 获取文件路径和文件名
            Path path = fileStatus.getPath();
            String name = path.getName();
            long len = fileStatus.getLen();
            //System.out.println(path+"-->"+name+":"+len);
            // 文件的物理切块大小
            long blockSize = fileStatus.getBlockSize();
            short replication = fileStatus.getReplication();
            System.out.println(name+"--"+blockSize/1024/1024+"M"+"--:"+replication) ;
        }
        fs.close();
    }
}

 

 

 

 

 

 

 

 

本文由 @不成功的猿人[Vip] 发布于 职涯宝 ,未经作者许可,禁止转载,欢迎您分享文章

发表评论

登录后才能评论
小程序
小程序
微信客服
微信客服
QQ客服 建站服务
分享本页
返回顶部