【HDFS】Java_API使用

2021-09-10 11:18:44 浏览数 (1)

Java API使用

环境初始化

首先完成Java开发环境准备,创建工程并导入开发所需的Jar包。之后在准备好的工程中完成以下步骤。

  1. 在IDE中新建一个类,类名为HDFSApp
  1. 在类中添加成员变量保存公共信息
代码语言:javascript复制
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.io.IOUtils;

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

// 将代码中的{HDFS_HOST}:{HDFS_PORT}替换为HDFS的IP与端口,如192.168.31.41:9000
public class HDFSApp {
    public static final String HDFS_PATH="hdfs://{HDFS_HOST}:{HDFS_PORT}";
    FileSystem fileSystem = null;
    Configuration configuration = null;
}
  1. 在类中新增构造函数,初始化运行环境
代码语言:javascript复制
public HDFSApp() throws Exception{
    this.configuration = new Configuration();
    this.fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
}

API基本使用

创建目录

任务:在HDFS上创建目录“/tmp/java_data”

代码语言:javascript复制
// 添加方法mkdir(),方法中实现目录的创建
public void mkdir() throws Exception {
    fileSystem.mkdirs(new Path("/tmp/java_data"));
}

在main函数中执行测试:

代码语言:javascript复制
// 创建Main函数,对方法进行测试
public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.mkdir();
}

回到shell工具中,使用shell命令查看是否执行成功。

代码语言:javascript复制
hadoop fs -ls /tmp/
更改目录权限

任务:将HDFS目录“/tmp/java_data”的权限改为“rwxrwxrwx”

代码语言:javascript复制
// 添加方法setPathPermission,方法中实现对目录的授权
public void setPathPermission() throws Exception {
        fileSystem.setPermission(new Path("/tmp/java_data"), new FsPermission("777"));
    }

在main函数中执行测试:

代码语言:javascript复制
// 在Main函数中,对方法进行测试
public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.setPathPermission();
}

回到shell工具中,使用shell命令查看是否执行成功。

上传文件

任务:将本地文件“file.txt”上传到HDFS目录“/tmp/hdfs_data”目录中

代码语言:javascript复制
// 在本地创建file.txt文件,文件中内容为hello word
// 添加方法copyFromLocalFile,方法中完成本地文件file.txt的上传
public void copyFromLocalFile() throws Exception {
        Path localPath = new Path("path to local file.txt");
        Path hdfsPath = new Path("/tmp/java_data/");
        fileSystem.copyFromLocalFile(localPath, hdfsPath);
    }

在main函数中执行测试:

代码语言:javascript复制
// 在Main函数中,对方法进行测试
public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
    	hdfsApp.copyFromLocalFile();
}

回到shell工具中,使用shell命令查看是否执行成功。

代码语言:javascript复制
hadoop fs -ls /tmp/java_data
查看目录内容

任务:查看HDFS目录“/tmp/java_data”的内容。

代码语言:javascript复制
// 添加方法listFiles,方法中查看“/tmp/java_data”目录下的内容
public void listFiles(String dir) throws Exception {
        FileStatus[] fileStatuses = fileSystem.listStatus(new Path(dir));
        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);
        }
    }

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.listFiles("/tmp/java_data");
    }
查看文件内容

任务:查看HDFS文件“/tmp/java_data/file.txt”的内容。

代码语言:javascript复制
// 添加方法cat,方法中实现对文件file.txt的查看
public void cat(String path) throws Exception {
        FSDataInputStream in = fileSystem.open(new Path(path));
        IOUtils.copyBytes(in, System.out, 1024);
        in.close();
    }

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.cat("/tmp/java_data/file.txt");
    }
下载文件

任务:从HDFS中将“/tmp/java_data/file.txt”文件下载到本地

代码语言:javascript复制
// 添加方法copyToLocalFile,方法中实现对文件file.txt的下载
public void copyToLocalFile() throws Exception {
        Path localPath = new Path("path to save file");
        Path hdfsPath = new Path("/tmp/java_data/file.txt");
        fileSystem.copyToLocalFile(hdfsPath, localPath);
    }

下载文件到本地,需要先将hadoop.dll文件拷贝到c:windowssystem32目录中,否则会报错java.io.IOException: (null) entry in command string: null chmod 0644。

代码语言:javascript复制
链接: https://pan.baidu.com/s/10DJzC_341ILTb_Y6EshiVw 提取码: pun1 复制这段内容后打开百度网盘手机App,操作更方便哦 
--来自百度网盘超级会员v3的分享

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.copyToLocalFile();
    }
创建文件

任务:在HDFS “/tmp/java_data”目录下创建新文件word.txt,文件内容为hello hadoop。

代码语言:javascript复制
// 添加create方法,在方法中实现word.txt的创建,并写入hello hadoop字符串
public void create() throws Exception {
        FSDataOutputStream output = fileSystem.create(new Path("/tmp/java_data/word.txt"));
        output.write("hello hadoop".getBytes());
        output.flush();
        output.close();
    }

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.create();
        hdfsApp.cat("/tmp/java_data/word.txt");
    }
文件追加

任务:对“/tmp/java_data/word.txt”文件追加内容。

代码语言:javascript复制
// 1. 在本地创建文件word_append.txt,内容为hello world append
// 2. 添加append方法,方法中实现对word.txt文件的追加
public void append() throws Exception {
        FSDataOutputStream output = fileSystem.append(new Path("/tmp/java_data/word.txt"));
        InputStream in = new BufferedInputStream(
                new FileInputStream(
                        new File("path to word_append.txt")));
        IOUtils.copyBytes(in, output, 4096);
    }

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.append();
    }

因为hdfs会有一定的延迟,所以无法使用之前编写的cat方法立即查看结果,所以需要到命令行终端中使用shell命令查看。

代码语言:javascript复制
hadoop fs -cat /tmp/java_data/word.txt
文件合并

任务:将 “/tmp/java_data/”目录下的file.txt文件合并到word.txt文件中。

代码语言:javascript复制
// 添加方法concat,方法中将file.txt文件合并到word.txt文件中
public void concat() throws Exception {
        Path[] srcPath = {new Path("/tmp/java_data/file.txt")};
        Path trgPath = new Path("/tmp/java_data/word.txt");
        fileSystem.concat(trgPath,srcPath);
    }

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.concat();
        hdfsApp.cat("/tmp/java_data/word.txt");
    }
文件改名

任务:将HDFS中的“/tmp/java_data/word.txt”改名为word_new.txt

代码语言:javascript复制
// 添加方法rename,方法中将word.txt文件改名为word_new.txt
public void rename() throws Exception {
        Path oldPath = new Path("/tmp/java_data/word.txt");
        Path newPath = new Path("/tmp/java_data/word_new.txt");
        fileSystem.rename(oldPath, newPath);
    }

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.rename();
        hdfsApp.listFiles("/tmp/java_data/");
    }
清空文件

任务:清空HDFS文件“/tmp/java_data/word_new.txt”内容。

代码语言:javascript复制
// 添加方法truncate,方法中将文件word_new.txt清空
public void truncate() throws Exception {
        fileSystem.truncate(new Path("/tmp/java_data/word_new.txt"), 0);
    }

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.truncate();
        hdfsApp.cat("/tmp/java_data/word_new.txt");
    }
删除文件

任务:将HDFS文件“/tmp/rest_data/word_new.txt”删除。

代码语言:javascript复制
// 添加方法delete,方法中将文件word_new.txt删除
public void delete() throws Exception{
        fileSystem.delete(new Path("/tmp/java_data/word_new.txt"), true);
    }

在main函数中执行测试:

代码语言:javascript复制
    // 在Main函数中,对方法进行测试
    public static void main(String[] args) throws Exception{
        HDFSApp hdfsApp = new HDFSApp();
        hdfsApp.delete();
        hdfsApp.listFiles("/tmp/java_data/");
    }

0 人点赞