Hadoop----java API文件

java API操作HDFS文件

package com.immoc.hadoop.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;


/**
 * Hadoop HDFS java API操作
 */
public class HDFSApp {
    //HDFS文件系统操作对象
    FileSystem fileSystem=null;
    //配置对象
    Configuration configuration=null;
    //HDFS文件系统服务器的地址以及端口
    public static final String HDFS_PATH="hdfs://hadoop000:8020";

    /**
     * 准备环境
     * 单元测试之前
     */
    @Before
    public void setUp() throws Exception {
        configuration=new Configuration();
         // 第一参数是服务器的URI,第二个参数是配置对象,第三个参数是文件系统的用户名
        fileSystem=FileSystem.get(new URI(HDFS_PATH), configuration,"hadoop");
        System.out.println("HDFSApp.setUp");
    }

    /**
     * 创建HDFS目录
     */
    @Test
    public void mkdir() throws Exception {
        // 需要传递一个Path对象
        fileSystem.mkdirs(new Path("/hdfsapi/test"));
    }

    /**
     * 创建文件
     */
    @Test
    public void create()throws Exception{
        //创建文件夹
        FSDataOutputStream output=fileSystem.create(new Path("/hdfsapi/test/a.txt/"));
        // 写入一些内容到文件中
        output.write("hello hadoop".getBytes());
        output.flush();//刷新
        output.close();//关闭
    }

    /**
     * 查看HDFS里某个文件的内容
     */
    @Test
    public void cat() throws Exception {
         // 读取文件
        FSDataInputStream in=fileSystem.open(new Path("/hdfsapi/test/a.txt"));
        // 将文件内容输出到控制台上,第三个参数表示输出多少字节的内容
        IOUtils.copyBytes(in,System.out,1024);
        in.close();//关闭
    }

    /**
     * 重命名文件
     */
    @Test
    public void rename()throws Exception{
        Path oldPath=new Path("/hdfsapi/test/a.txt");
        Path newPath=new Path("/hdfsapi/test/b.txt");
        fileSystem.rename(oldPath,newPath );
    }

    /**
     * 上传到HDFS
     */
    @Test
    public void copyFromLocalFile()throws Exception{
        Path localPath=new Path("C:\\Learning\\bigData\\10 hours to get started with big data\\hello.txt");
        Path hdfsPath=new Path("/hdfsapi/test/");
        // 第一个参数是本地文件的路径,第二个则是HDFS的路径
        fileSystem.copyFromLocalFile(localPath,hdfsPath);
    }

    /**
     * 上传大文件到HDFS
     */
    @Test
    public void copyFromLocalFileWithProgress()throws Exception{
        Path localPath=new Path("C:\\Learning\\java\\idea\\jdk-8u181-windows-x64-demos.zip");//大文件夹路径
        Path hdfsPath=new Path("/hdfsapi/test/");
        fileSystem.copyFromLocalFile(localPath,hdfsPath);

        //大文件夹通过流来处理
        InputStream in=new BufferedInputStream(new FileInputStream(String.valueOf(localPath)));//本地文件夹输入流
        FSDataOutputStream output=fileSystem.create(new Path("/hdfsapi/test/jdk"), new Progressable() {//输出流
            @Override
            public void progress() {
                System.out.println(".");//带进度条提醒信息
            }
        });
        IOUtils.copyBytes(in,output,4096);//输出到文件夹中
    }

    /**
     * 下载HDFS文件
     */
    @Test
    public void copyToLocalFile() throws Exception{
        Path localPath=new Path("C:\\Learning\\bigData\\b.txt");
        Path hdfsPath=new Path("/hdfsapi/test/b.txt");
        fileSystem.copyToLocalFile(false,hdfsPath,localPath,true);
    }

    /**
     * 查看某个目录下的所有文件
     */
    @Test
    public void listFiles() throws Exception{
        FileStatus []fileStatuses=fileSystem.listStatus(new Path("/hdfsapi/test/"));
        for(FileStatus fileStatus:fileStatuses){
            String isDir=fileStatus.isDirectory() ? "文件夹" : "文件";//判断是文件还是文件夹
            short replication=fileStatus.getReplication();//查看副本数量
            long len=fileStatus.getLen();//查看文件大小
            String path=fileStatus.getPath().toString();//查看文件路径

            System.out.println("一个"+isDir+"\t"+"副本系数:"+replication+"\t"+"大小:"+len+"\t"+"路径"+path);
        }
    }

    /**
     * 删除文件
     */
    @Test
    public void delete() throws Exception{
        // 第二个参数指定是否要递归删除,false=否,true=是
        fileSystem.delete(new Path("/hdfsapi/test/"),true);
    }


    /**
     * 清理资源文件和资源文件的关闭操作
     * 释放资源
     * 单元测试之后
     */
    @After
    public void tearDown() {
        configuration = null;
        fileSystem = null;
        System.out.println("HDFSApp.tearDown");
    }
}

通过Java API上传:文件 3 0 hdfs://hadoop000:8020/hdfsapi/test
通过hdfs shell上传:文件 1 40762 hdfs://hadoop000:8020/install.log
我们已经在hdfs-site.xml中设置了副本系数为1,但是当使用Java API上传,则副本系数为3,因为在本地并没有手工设置副本系数,所以采用的是hadoop默认的副本系数3

猜你喜欢

转载自blog.csdn.net/mys_mys/article/details/82792346