zoukankan      html  css  js  c++  java
  • HDFS客户端操作(JAVA代码)

    环境准备

    windows需要配置hadoop的windows下的依赖

    安装包地址:

    链接:https://pan.baidu.com/s/1QtbH-x-S0QytkmaoSosdEw
    提取码:2ktw

    将安装包解压至自己所选择的目录,然后配置环境变量:

    HADOOP_HOME : 解压的目录

    PATH后新增:%HADOOP_HOME%in

    maven所需依赖

    新建Maven项目,添加以下依赖:

    <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
                <version>2.12.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>3.1.3</version>
            </dependency>
    

    实际操作

    实际操作前先讲所需要的对象设为全局变量,方便今后操作:

    private URI uri;
    private Configuration configuration;
    private String user;
    private FileSystem fileSystem;
    

    使用@Before注释的函数,可以在@Test注释下的函数运行前执行,可以进行对象的初始化:

    	@Before
        public void init() throws IOException, InterruptedException {
            uri = URI.create("hdfs://hadoop100:8020");
            configuration = new Configuration();
            user = "nevesettle";
            fileSystem = FileSystem.get(uri,configuration,user);
        }
    

    @After则相反

    	@After
        public void closeFs() throws IOException {
            fileSystem.close();
        }
    

    文件上传

    	/**
         * 上传文件
         * @throws IOException
         */
        @Test
        public void uploadFile() throws IOException {
            fileSystem.copyFromLocalFile(false,false,
                    new Path("D:\Program files\QQ\QQ Data\794133319\FileRecv\资源集合.txt"),
                    new Path("/"));
        }
    

    使用的函数为:

    copyFromLocalFile(boolean delSrc, boolean overwrite,Path src, Path dst)
    
    • delSrc:是否删除源文件
    • overwrite:目标地址有相同文件是否覆盖
    • src:源文件地址
    • dst:目标文件地址

    文件下载

    	/**
         * 文件下载
         * @throws IOException
         * @throws InterruptedException
         */
        @Test
        public void downFile() throws IOException {
            fileSystem.copyToLocalFile(false,
                    new Path("/资源集合.txt"),
                    new Path("d:\"),
                    true);
        }
    

    使用的函数为:

    copyToLocalFile(boolean delSrc, Path src, Path dst,boolean useRawLocalFileSystem)
    
    • delSrc:是否删除源文件
    • src:源文件地址
    • dst:目标文件地址
    • useRawLocalFileSystem:是否进行文件传输校验(CRC校验)

    文件更名及移动位置

    	/**
         * 文件名字修改
         * @throws IOException
         * @throws InterruptedException
         */
        @Test
        public void updateFile() throws IOException {
            fileSystem.rename(new Path("/资源集合.txt"),
                    new Path("/资源.txt"));
        }
    

    使用的函数为:

    rename(Path src, Path dst)
    
    • src:源文件
    • dst:目标文件
    • 前后目录相同,文件名不同,则是修改文件名
    • 前后目录不同,文件名相同,则是修改目录
    • 前后目录和文件名都不同,则是移动位置并修改文件名

    文件删除

    	/**
         * 文件删除
         * @throws IOException
         * @throws InterruptedException
         */
        @Test
        public void deleteFile() throws IOException {
            fileSystem.delete(new Path("/资源.txt"),false);
        }
    

    使用的函数为:

    delete(Path f, boolean recursive)
    
    • f:删除的文件或目录地址
    • recursive:是否递归删除
    • 当要删除的为文件是,递归删除为false
    • 当要删除的是目录且为空时,递归删除为false
    • 当要删除的是目录且不为空,则递归删除为true

    IO流的文件上传

       /**
         * IO流的文件上传
         * @throws IOException
         * @throws InterruptedException
         */
        @Test
        public void uploadFileByIO() throws IOException {
            //源文件地址
            String srcFilePath = "D:\资源集合.txt";
            //目标文件地址
            String destFilePath = "/资源集合.txt";
            //输入流
            FileInputStream fis = new FileInputStream(new File(srcFilePath));
            //通过hdfs封装的方法获取输出流
            FSDataOutputStream fos = fileSystem.create(new Path(destFilePath));
    
            //最原始的方法
    //        int i = 0;
    //        while ( ( i = fis.read()) != -1 ){
    //            fot.write(i);
    //        }
    
            //hdfs封装的方法
            IOUtils.copyBytes(fis,fos,configuration);
    
            //关闭IO流
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
    
        }
    
    • IOUtils 使用时注意要使用hadoop的包,不要使用错了
    • configuration 为我们的全局变量,即配置

    IO流的文件下载

    	/**
         * IO流的文件下载
         * @throws IOException
         * @throws InterruptedException
         */
        @Test
        public void downFileByIO() throws IOException {
    
            //源文件
            String srcFilePath = "/资源集合.txt";
    
            //目标文件
            String destFilePath = "d:\资源.txt";
    
            //获得输入流
            FSDataInputStream fis = fileSystem.open(new Path(srcFilePath));
    
            //获得输出流
            FileOutputStream fos = new FileOutputStream(new File(destFilePath));
    
            //传输
            IOUtils.copyBytes(fis,fos,configuration);
    
            //关闭
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
    
    
        }
    
  • 相关阅读:
    Embed标签中的symbol的作用
    loader的右键菜单不响应
    使用[frame()]数据标签制作的纯AS preLoader
    REST是什么(转)
    Ruby on Rails
    Ruby on Rails 数据库连接及mysql乱码
    Ruby On Rails——安装
    Asp.net mvc 3 beta 新特性介绍
    使用 Git 管理源代码
    Asp.net发送邮件的两种方法
  • 原文地址:https://www.cnblogs.com/wuren-best/p/13700904.html
Copyright © 2011-2022 走看看