hadoop hdfs的shell命令与java 常用api的操作与思想保持一致,故对比,易于理解与记忆
主要区别点:
shell命令行,一般在虚拟机集群或者远程连接工具Xshell上操作,被操作对象分别为 Linux文件系统本地 + HDFS文件系统
Java API,一般在Windows系统下idea软件上编写代码操作,被操作对象分别为 Windows文件系统本地 + HDFS文件系统

(一)HDFS的Shell命令行操作:
1,查看所有的hdfs命令
hadoop dfs 或者 hdfs dfs ,一般用hadoop fs,而不是hadoop dfs
使用具体命令语法
hadoop dfs 具体命令 或者 hdfs dfs 具体命令

2,查看某条命令的参数
hadoop fs -help rm 或者 hdfs dfs -help rm

3,显示根目录信息
hdfs dfs -ls /

4,-mkdir:在hdfs上创建目录,多级目录前面加 -p参数
hdfs dfs -mkdir -p /ouyangtao/bigdata

5,-moveFromLocal:从本地剪切粘贴到HDFS
先在本地创建文件hadoop.txt文件,然后剪切粘贴到hdfs上
touch hadoop.txt
hdfs dfs -moveFromLocal ./hadoop.txt /ouyangtao/bigdata

6, -appendToFile:追加一个文件到已经存在的文件末尾
先在本地创建文件hdfs.txt文件,然后剪切粘贴到hdfs上的hadoop.txt中
touch hdfs.txt
写入内容
vim hdfs.txt
追加到hdfs上的hadoop.txt中
hdfs dfs -appendToFile ./hdfs.txt /ouyangtao/bigdata/hadoop.txt

7,-cat:显示文件内容,显示上一个命令中追加的内容
hdfs dfs -cat /ouyangtao/bigdata/hadoop.txt

8, -chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
hdfs dfs -chmod 777 /ouyangtao/bigdata/hadoop.txt
hdfs dfs -chown root:root /ouyangtao/bigdata/hadoop.txt

9, -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
hdfs dfs -copyFromLocal hdfs.txt /ouyangtao/bigdata

10, -copyToLocal:从HDFS拷贝到本地
hdfs dfs -copyToLocal /ouyangtao/bigdata/hadoop.txt ./

11, -cp :从HDFS的一个路径拷贝到HDFS的另一个路径
hdfs dfs -cp /ouyangtao/bigdata/hadoop.txt /ouyangtao/hdfs.txt

12, -mv:在HDFS目录中移动文件,遇到根目录
hdfs dfs -mv /ouyangtao/hdfs.txt /

13, -get:等同于copyToLocal,就是从HDFS下载文件到本地
hdfs dfs -get /ouyangtao/bigdata/hadoop.txt ./

14,-put:等同于copyFromLocal
hdfs dfs -put hadoop.txt /ouyangtao

15, -tail:显示一个文件的末尾
hdfs dfs -tail /ouyangtao/hadoop.txt

16, -rm:删除文件或文件夹
hdfs dfs -rm /ouyangtao/hadoop.txt

17, -rmdir:删除空目录
hdfs dfs -mkdir /test
hdfs dfs -rmdir /test

18,-du统计文件夹的大小信息
hdfs dfs -du -s -h /ouyangtao

19 ,-setrep:设置HDFS中文件的副本数量
hdfs dfs -setrep 10 /ouyangtao/bigdata/hadoop.txt

(二)Java 常用API操作:
1,将资源链接与关闭提出来,@Before 和 @After

//定义全局变量
FileSystem fileSystem;
Configuration configuration;
//将获取文件系统资源集中放在一块
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
    //1 创建配置环境对象
    configuration = new Configuration();
    //参数配置优先级:代码>资源配置>hdfs默认配置
    //configuration.set("dfs.replication", "2");
    //2 配置在集群上运行
    fileSystem = FileSystem.get(new URI("hdfs://hadoop101:9000"),configuration,"root");
}

//统一关闭资源
@After
public void destory() throws IOException {
    //4 关闭文件资源
    fileSystem.close();
}

2,开始测试常用API
2.1 在集群上创建一个空文件夹

@Test
public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
    //3 在集群上创建一个空文件夹
    fileSystem.mkdirs(new Path("/test1"));
}

2.2 上传文件,从本地上传文件到HDFS

@Test
public void testCopyFromLocalFile() throws IOException {
    fileSystem.copyFromLocalFile(new Path("E:/Data/speak.data"),new Path("/speak.data"));
}

2.3 下载文件,从HDFS下载文件到本地Win11系统

@Test
public void testCopyToLocalFile() throws IOException {
    fileSystem.copyToLocalFile(false,new Path("/speak.data")
                               ,new Path("E:/Data/speak_copy.data"),true);
}

2.4 删除文件/文件夹

@Test
public void testDelete() throws IOException {
    //删除文件夹
   // fileSystem.delete(new Path("/test1"),true);
    //删除文件
    fileSystem.delete(new Path("/speak.data"),true);
}

2.5 查看文件名称、权限、长度、块信息

   @Test
    public void testListFiles() throws IOException {
        //获取文件详情,通过文件List获取 对应路径下的所有文件详情
        //迭代器:装有指定目录下所有文件信息
        RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/"),true);
        //循环遍历该路径下的所有文件:即遍历迭代器,将迭代器中的文件对象一一取出
        while (listFiles.hasNext()){ //判断下一个文件是否存在,否则退出循环
            //每一个LocatedFileStatus对象都对应一个文件所包含的信息
            LocatedFileStatus status =listFiles.next();
            //输出文件详情
            System.out.println(status.getPath().getName());//文件名称
            System.out.println(status.getPath());//文件路径
            System.out.println(status.getLen());//长度
            System.out.println(status.getPermission());//权限
            System.out.println(status.getGroup());//分组
            //获取文件存储的块信息,一个文件可拆分多个块存储
            BlockLocation[] blockLocations = status.getBlockLocations();
            for(BlockLocation blockLocation :blockLocations){
                //获取块存储的主机节点
                String[] hosts = blockLocation.getHosts();
                //遍历存储有该块信息的所有主机节点
                for (String host:hosts) {
                    System.out.println(host);
                }
            }
            System.out.println("-------------------文件分割线----------------");
        }
    }

2.6 判断文件夹,只能判断某个路径下的当前内容是文件还是文件夹,不能循环文件夹里的内容

@Test
public void testListStatus() throws IOException {
    //获取hdfs的一个文件路径,判断该路径下的各成分是文件还是文件夹
    FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
    for(FileStatus fileStatus: fileStatuses){
        //判断是否是文件
        if(fileStatus.isFile()){
            System.out.println("f:"+fileStatus.getPath().getName());//获取文件名
        }else {
            System.out.println("d:"+fileStatus.getPath().getName());//获取文件夹名
        }
    }
}

2.7 I/O流操作HDFS,不用HDFS系统框架封装好的API,自己写IO流上传下载文件
//文件上传:需求:把本地 E:/Data/speak_copy.data 文件上传到HDFS根目录

@Test
public void putFileToHdfs() throws IOException {
    //获取输入流
    FileInputStream fileInputStream = new FileInputStream(new File("E:/Data/speak_copy.data"));
    //获取输出流
    FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/speak_copy.data"));
    //将输入流拷到输出流
    IOUtils.copyBytes(fileInputStream,fsDataOutputStream,configuration);
    //关闭流资源,环境资源会外层统一关了
    IOUtils.closeStream(fsDataOutputStream);
    IOUtils.closeStream(fileInputStream);
}

2.8 文件下载:需求:从HDFS上下载 /speak_copy.data 文件到本地 E:/Data/speak_copy.data

@Test
public void getFileFromHdfs() throws IOException {
    //获取输入流
    FSDataInputStream fsDataInputStream = fileSystem.open(new Path("/speak_copy.data"));
    //获取输出流
    FileOutputStream fileOutputStream = new FileOutputStream(new File("E:/Data/speak_copy.data"));
    //将输入流拷到输出流
    IOUtils.copyBytes(fsDataInputStream,fileOutputStream,configuration);
    //关闭流资源,环境资源会外层统一关了
    IOUtils.closeStream(fileOutputStream);
    IOUtils.closeStream(fsDataInputStream);
}

2.9 seek 定位读取 需求:将HDFS上 /speak.data 的内容在控制台输出两次

@Test
public void readFileSeek() throws IOException {
    //打开输入流,读取数据输出到控制台
    FSDataInputStream inputStream =null;
    try {
        inputStream = fileSystem.open(new Path("/speak.data"));
        //读取第一次
        IOUtils.copyBytes(inputStream, System.out, 8192, false);
        System.out.println("-----------------------------");
        inputStream.seek(0);//从头开始读取
        IOUtils.copyBytes(inputStream, System.out, 8192, false);
    }finally {
        IOUtils.closeStream(inputStream);//长度8192若不够,可能没有读第二次,这里无论读取如何,都关闭资源
    }
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐