java代码对hdfs文件的基本操作

一个没有部署集群的虚拟机想要 访问集群上的hadoop时:
安装hadoop 然后配置core-site.xml 将fs.defaultFS参数改为hdfs://master:9000即可
直接执行对应的hadoop命令即可(可执行文件)
块大小和备份这些参数是要看客户端的相关配置的,与放在哪个机器无关。

package hdfs04;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;

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

public class HdfsClientDemo {
    public static void main(String[] args) throws Exception {
        //new Configuration()会从项目的classpath中加载core-default.xml hdfs-default.xml core-site.xml hdfs-site.xml等
        /*
        Configuration参数对象的机制:
        构造时,回家再jar包中的默认配置 xx-default.xml
        在加载用户配置的xx-site.xml 覆盖默认参数
        构造完成后,还可以conf.set("",""),会再次覆盖用户配置文件的参数值
         */
        Configuration conf=new Configuration();
        //指定本客户端上传文件到hdfs时需要保存的副本数为:2
        conf.set("dfs.replication","2");
        //指定本客户端上传文件到hdfs时切块的大小为
        conf.set("dfs.blocksize","64M");
        //构造一个访问指定HDFS系统的客户端对象
        //参数1:HDFS系统的URI 参数2:客户端特别指定的参数 参数3:客户端的身份(用户名)
        FileSystem fs=FileSystem.get(new URI("hdfs://master:9000/"),conf,"root");
        //上传一个文件到HDFS中
        fs.copyFromLocalFile(new Path("D:/menu.txt"),new Path("/"));
        fs.close();
    }
    FileSystem fs=null;
    @Before
    public void init() throws Exception{
        Configuration conf=new Configuration();
        conf.set("dfs.replication","2");
        fs=FileSystem.get(new URI("hdfs://master:9000"),conf,"root");
    }
    @Test //下载文件到客户端本地磁盘
    public void testGet() throws Exception {
        //需要调用hadoop里面 c语言的lib库 需要配置HADOOP_HOME 并且要用windows对应的hadoop包
        fs.copyToLocalFile(new Path("/menu.txt"),new Path("e:/"));
        fs.close();
    }
    @Test //在hdfs内移动文件/修改名称
    public void testRename() throws Exception{
        //新路径的文件夹要存在 否则没办法操作
        fs.rename(new Path("/menu.txt"),new Path("/aaa/m.txt"));
        fs.close();
    }
    @Test
    //在hdfs内创建文件夹
    public void testMkdirs() throws Exception{
        fs.mkdirs(new Path("/xx/yy"));
        fs.close();
    }
    @Test
    //在hdfs中删除文件夹
    public void TestRm() throws Exception{
        fs.delete(new Path("/xx"),true);
        fs.close();
    }
    @Test
    //查询hdfs指定目录下的文件信息(可递归查询)
    public void testLs() throws Exception{
        //只打印文件的信息 不打印文件夹的信息
        RemoteIterator<LocatedFileStatus> iter = fs.listFiles(new Path("/"), true);
        while(iter.hasNext()){
            LocatedFileStatus status=iter.next();
            System.out.println("块大小: "+status.getLen());
            //该块起始位置在文件内的偏移量 该块内存放文件的长度 该块在哪谢namende上存有。(备份数)
            System.out.println("块信息: "+Arrays.toString(status.getBlockLocations()));
            fs.close();
        }
    }
    @Test
    //查询hdfs指定目录下的文件和文件夹信息
    public void testLs2() throws Exception {
        FileStatus[] liststatus=fs.listStatus(new Path("/"));//无递归
        for(FileStatus status: liststatus){
            System.out.println("文件路径"+status.getPath());
            System.out.println(status.isDirectory()?"这是文件夹":"这是文件");
            System.out.println(status.getReplication());
            System.out.println("");
        }
    }
}

你可能感兴趣的:(hdfs)