楼主: 君富Theo
37 0

[作业] Hadoop之javaAPI写HDFS的shell命令 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-5-21
最后登录
2018-6-7

楼主
君富Theo 发表于 2025-11-19 14:48:53 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

IDE远程管理HDFS

1. 概述

通常情况下,我们在IDE(集成开发环境)中使用Java、Python等编程语言对Hadoop进行操作。本文将介绍如何利用IDE工具实现HDFS文件系统的管理和操作。

2. 添加依赖

为了确保兼容性,建议添加的Hadoop相关依赖包版本与您的Hadoop服务器版本保持一致。具体的依赖配置代码可以参考其他相关文档或文章。

3. 获取文件系统对象

首先,我们需要通过Hadoop客户端API获取文件系统对象,这是执行所有HDFS操作的基础。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import java.io.IOException;

public class testGetFileSystem {
    
    public void testGetFileSystem() throws IOException {
        //1.创建配置对象,?于加载配置信息(四个默认的配置?件:core-default.xml,hdfs-default.xml
        //,mapred-default.xml,yarn-default.xml)
        Configuration conf = new Configuration();
        //2.修改fs.defaultFS属性的值
        conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
        //3.使?FileSystem类的静态?法get(Configuration conf),返回fs.defaultFS定义的?件系统
        FileSystem fs = FileSystem.get(conf);
        System.out.println("?件系统对象的类型名:"+fs.getClass().getName());
    }
    
    public static void main(String[] args) throws IOException {
        testGetFileSystem test = new testGetFileSystem();
        test.testGetFileSystem();
    }
}

4. 文件上传

使用Hadoop API可以轻松地将本地文件上传到HDFS中,以下示例展示了如何实现这一功能。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

public class testFileUpload {
    
    public void testFileUpload() throws IOException {
        // 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
        System.setProperty("HADOOP_USER_NAME", "root");
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
        FileSystem fs = FileSystem.get(conf);
        //将本地的?个?件E:/file1,上传到HDFS上 /file1
        //1.使?Path描述两个?件
        Path localPath = new Path("F:/file1.txt");
        Path hdfsPath = new Path("/file1");
        //2.调?上传?法
        fs.copyFromLocalFile(localPath,hdfsPath);
        //3.关闭
        fs.close();
        System.out.println("上传成功");
    }
    
    public static void main(String[] args) throws IOException {
        testFileUpload test = new testFileUpload();
        test.testFileUpload();
    }
}

5. 文件下载

从HDFS下载文件到本地同样简单,下面的代码片段演示了这一过程。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

public class testFileDownload {
    
    public void testFileDownload() throws IOException {
        // 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
        System.setProperty("HADOOP_USER_NAME", "root");
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
        FileSystem fs = FileSystem.get(conf);
        //从HDFS上下载?个?件/file1,下载到本地 F:/file2
        //1.使?Path描述两个?件
        Path hdfsfile = new Path("/file1");
        Path local = new Path("F:/file2.txt");
        //2.调?下载?法进?下载
        fs.copyToLocalFile(hdfsfile,local);
        fs.close();
        System.out.println("下载成功");
    }
    
    public static void main(String[] args) throws IOException {
        testFileDownload test = new testFileDownload();
        test.testFileDownload();
    }
}

6. 创建目录

在HDFS中创建新目录是常见的操作之一,这里提供了相应的代码示例。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

public class testMkdir {
    
    public void testMkdir() throws IOException {
        // 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
        System.setProperty("HADOOP_USER_NAME", "root");
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
        FileSystem fs = FileSystem.get(conf);
        
        //1.测试创建?录,描述?个?录
        Path hdfsfile = new Path("/dir1");
        //2.调?创建?录的?法
        fs.mkdirs(hdfsfile);
        fs.close();
        System.out.println("创建成功");
    }
    
    public static void main(String[] args) throws IOException {
        testMkdir test = new testMkdir();
        test.testMkdir();
    }
}

7. 删除目录

当不再需要某个目录时,可以通过Hadoop API将其删除。以下是删除目录的具体方法。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

public class testDelete {
    
    public void testDelete() throws IOException {
        // 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
        System.setProperty("HADOOP_USER_NAME", "root");
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
        FileSystem fs = FileSystem.get(conf);
        
        //1.测试删除?录,描述?个?录
        Path hdfsfile = new Path("/dir1");
        //2.调?创建?录的?法
        fs.delete(hdfsfile,true);
        fs.close();
        System.out.println("删除成功");
    }
    
    public static void main(String[] args) throws IOException {
        testDelete test = new testDelete();
        test.testDelete();
    }
}

8. 文件重命名

在HDFS中对文件进行重命名也是可行的,下面的代码展示了如何执行文件重命名操作。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

public class testRename {
    
    public void testRename() throws IOException {
        // 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
        System.setProperty("HADOOP_USER_NAME", "root");
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
        FileSystem fs = FileSystem.get(conf);
        
        //1.测试重命名,将file1改为file01
        Path oldName = new Path("/file1");
        Path newName = new Path("/file01");
        //2.调?重命名?法
        fs.rename(oldName,newName);
        fs.close();
        System.out.println("命名成功");
    }
    
    public static void main(String[] args) throws IOException {
        testRename test = new testRename();
        test.testRename();
    }
}

9. 使用IOUtil上传文件

除了直接使用Hadoop API,还可以借助IOUtil类来简化文件上传的过程。下面是一个使用IOUtil上传文件的例子。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class testPutFile {
    
    public void testPutFile() throws IOException, URISyntaxException {
        FileSystem fs = null;
        FileInputStream input = null;
        FSDataOutputStream out = null;
        try {
            // 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
            System.setProperty("HADOOP_USER_NAME", "root");
            // 1.连接HDFS?件系统
            Configuration conf = new Configuration();
            // 2.创建输?流,读取输??件
            File file = new File("F://a.txt");
            input = new FileInputStream(file);
            // 3.获得?件系统
            fs = FileSystem.get(new URI("hdfs://192.168.215.130:9820"), conf);
            // 4.创建输出流
            out = fs.create(new Path("/gg.txt"));
            // 5.IO流拷?
            IOUtils.copyBytes(input, out, 4096, false); // 第三个参数是缓冲区??,第四个参数指定是否关闭流
            System.out.println("上传完毕");
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        } finally {
            // 6.关闭资源
            IOUtils.closeStream(input);
            IOUtils.closeStream(out);
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public static void main(String[] args) throws IOException, URISyntaxException {
        testPutFile test = new testPutFile();
        test.testPutFile();
    }
}

10. 使用IOUtil下载文件

同样地,使用IOUtil也可以方便地从HDFS下载文件。以下是使用IOUtil下载文件的示例代码。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class testGetFile {
    
    public void testGetFile() throws IOException, URISyntaxException {
        // 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
        System.setProperty("HADOOP_USER_NAME", "root");
        // 1.连接HDFS?件系统
        Configuration conf = new Configuration();
        // 2.获得?件系统
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.215.130:9820"), conf);
        // 3.获取输?流,从HDFS上读取
        FSDataInputStream input=fs.open(new Path("/file01"));
        // 4.获取输出流
        FileOutputStream out=new FileOutputStream(new File("F://gg.txt"));
        // 5.流拷?
        IOUtils.copyBytes(input, out, conf);
        // 6.关闭流
        IOUtils.closeStream(input);
        IOUtils.closeStream(out);
        System.out.println("下载完成");
    }
    
    public static void main(String[] args) throws IOException, URISyntaxException {
        testGetFile test = new testGetFile();
        test.testGetFile();
    }
}

11. 查看文件状态

了解HDFS中文件的状态信息对于管理和维护文件非常重要。下面的代码示例说明了如何查看文件的状态。

package org.shell;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.BlockLocation;
import java.io.IOException;
import java.util.Arrays;

public class testFileStatus {
    
    public void testFileStatus() throws IOException {
        // 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
        System.setProperty("HADOOP_USER_NAME", "root");
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
        FileSystem fs = FileSystem.get(conf);
        //1.描述你要读取的?件 /file02
        Path path = new Path("/file01");
        //获取?件的状态信息
        RemoteIterator<LocatedFileStatus> it = fs.listLocatedStatus(path);
        while(it.hasNext()){
            // 取出对象
            LocatedFileStatus status = it.next();
            System.out.println("name:"+status.getPath());
            //获取位置
            BlockLocation[] locate = status.getBlockLocations();
            for(BlockLocation bl:locate){
                System.out.println("当前块的所有副本位置:"+Arrays.toString(bl.getHosts()));
                System.out.println("当前块??:"+bl.getLength());
                System.out.println("当前块的副本的ip地址信息:"+ Arrays.toString(bl.getNames()));
            }
            System.out.println("系统的块??:"+status.getBlockSize());
            System.out.println("?件总?度:"+status.getLen());
        }
    }
    
    public static void main(String[] args) throws IOException {
        testFileStatus test = new testFileStatus();
        test.testFileStatus();
    }
}
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Hadoop Shell AAPI Shel Java

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-27 04:54