Hadoop学习篇(二)——HDFS编程操作1

在前两篇文章中,我们已经介绍了HDFS的理论基础以及命令行的基本操作。

但是,在实际中我们使用HDFS的平台时,是不可能全部进行命令行操作的。一定是要与编程结合起来进行的。所以,本篇将介绍HDFS相关的一些编程操作。

上篇链接:

Hadoop学习篇(二)——HDFS

Hadoop学习篇(二)——HDFS实践操作

Hadoop学习篇(二)——HDFS编程操作1

说明:如涉及到侵权,请及时联系我,并在第一时间删除文章。

2.3 HDFS编程操作

HDFS有很多常用的Java API,这里我们用Java API模拟Shell操作。

2.3.1 环境配置
2.3.1.1 maven配置

首先进行编译环境配置。这里创建maven项目,通过远程仓库下载对应jar包。

<dependency>
  		<groupId>org.apache.hadoop</groupId>
  		<artifactId>hadoop-client</artifactId>
  		<version>${hadoop_version}</version>
</dependency>
<dependency>
  		<groupId>org.apache.hadoop</groupId>
  		<artifactId>hadoop-common</artifactId>
  		<version>${hadoop_version}</version>
</dependency>
<dependency>
  		<groupId>org.apache.hadoop</groupId>
  		<artifactId>hadoop-hdfs</artifactId>
  		<version>${hadoop_version}</version>
</dependency>

(注意:这里的${hadoop_version}需要更换成你下载的Hadoop的版本)

2.3.1.2 手动导入

这里我们也可以通过手动倒入jar包进行。

需要导入的jar包位置有:

hadoop_path/share/hadoop/common/lib/*.jar
hadoop_path/share/hadoop/client/lib/*.jar
hadoop_path/share/hadoop/hdfs/lib/*.jar
2.3.1.3 常用API
  • org.apache.hadoop.fs.FileSystem 通用文件系统的抽象基类,可悲分布式文件系统继承。
  • org.apache.hadoop.fs.FileStatus 一个接口,用于客户端展示系统中文件和目录的元数据,可通过FileSystem.ListStatus()方法获得具体的实例对象。
  • org.apache.hadoop.fs.FSDataInputStream 文件输入流,用于读取Hadoop文件。
  • org.apache.hadoop.fs.FSDataOutputStream 文件输出流,用于写Hadoop文件。
  • org.apache.hadoop.fs.Path 用于表示Hadoop文件系统中的一个文件或目录的路径。
  • org.apache.hadoop.fs.PathFilter 一个接口,实现PathFilter.accept(Path path)来判断是否接收路径path对应的文件或目录
  • org.apache.hadoop.conf.Configuration 访问配置项。以core-site.xml文件为准。
2.3.2 编程操作

HDFS的编程操作,实际上就是用高级语言模拟HDFS的命令行操作,从而做到机器代替人工的大量处理。

我们的编程操作主要进行模拟的有:

  • 判断文件是否存在
  • 实现ls命令
  • 实现cat命令
  • 写入HDFS
  • HDFS文件的下载与上传
2.3.2.1 判断文件是否存在
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;

public class HadoopOp {

    private static Configuration conf;
    private static FileSystem fs;

    public static void main(String[] args) {
        isExist(conf, fs, "/user");
    }

    public static void isExist(Configuration conf, FileSystem fs, String filePath) {
        try {
            conf = new Configuration();
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
            fs = FileSystem.get(conf);
            if (fs.exists(new Path(filePath)) {
                System.out.println("File Exists");
            } else{
                System.out.println("File None");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果有:
在这里插入图片描述

2.3.2.2 实现ls命令

这里递归输出文件全部信息,包括权限、创建时间、所属等。

借用FileStatus创建数组,存放路进行新。采用递归思想,遍历每一个目录。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;

public class HadoopOp {
    
    private static Configuration conf;
    private static FileSystem fs;
    
    public static void main(String[] args) {
        conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        fs = FileSystem.get(conf);
        listStatus(conf, fs, "/user");
    }
    
    public static void listStatus(Configuration conf, FileSystem fs, String filePath) {
        try {
            FileStatus[] fileStatuses = fs.listStatus(new Path(filePath));
            for (FileStatus fileStatus:fileStatuses) {
                if (fileStatus.isDirectory()) {
                    String dir = fileStatus.getPath().toString();
                    System.out.println("---------------------------");
                    System.out.println("The directory path:\t" + dir);
                    listStatus(conf, fs, dir);
                } else {
                    System.out.println("The file path:\t" + fileStatus.getPath().toString());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果有:
在这里插入图片描述

2.3.2.3 实现cat命令

这里将HDFS文件内容转换为FSDataInputStream数据输入流,传至Java的InputStreamReader数据输入流中,并转换为BufferedReader进行读取。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class HadoopOp {

    private static Configuration conf;
    private static FileSystem fs;
    
    public static void main(String[] args) {
        conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        fs = FileSystem.get(conf);
        ReadFile(conf, fs, "/user/hadoop/Exp/test/f1.txt");
    }
    
    public static void ReadFile(Configuration conf, FileSystem fs, String filePath) {
        try {
            FSDataInputStream fsDataInputStream = fs.open(new Path(filePath));
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fsDataInputStream));
            String content = null;
            while ((content = bufferedReader.readLine()) != null) {
                System.out.println(content);
            }
            bufferedReader.close();
            fs.close();
        } catch (IOExpection e) {
            e.printStackTrace();
        }
    }
}

文件内容为:
在这里插入图片描述
程序运行结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HDFSHadoop分布式文件系统,它提供了Java API来进行文件读写操作。在HDFS中,文件被分成多个块并存储在不同的节点上,因此需要使用分布式文件系统的API来进行文件读写操作HDFS Java API提供了以下几个类来进行文件读写操作: 1. FileSystem:表示一个文件系统对象,可以通过它来获取文件系统的配置信息、创建文件、删除文件等操作。 2. Path:表示一个文件或目录的路径。 3. FSDataInputStream:表示一个输入流,可以用来读取HDFS中的文件。 4. FSDataOutputStream:表示一个输出流,可以用来向HDFS中写入数据。 下面是一个简单的示例代码,演示如何使用HDFS Java API进行文件读写操作: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; public class HdfsExample { public static void main(String[] args) throws Exception { // 创建一个Configuration对象,用于获取Hadoop配置信息 Configuration conf = new Configuration(); // 获取HDFS文件系统对象 FileSystem fs = FileSystem.get(conf); // 创建一个Path对象,表示要读取的文件路径 Path inputPath = new Path("/input/test.txt"); // 创建一个FSDataInputStream对象,用于读取文件 FSDataInputStream in = fs.open(inputPath); // 读取文件内容 byte[] buffer = new byte[1024]; int len = in.read(buffer); while (len > 0) { System.out.write(buffer, 0, len); len = in.read(buffer); } // 关闭输入流 in.close(); // 创建一个Path对象,表示要写入的文件路径 Path outputPath = new Path("/output/test.txt"); // 创建一个FSDataOutputStream对象,用于写入文件 FSDataOutputStream out = fs.create(outputPath); // 写入文件内容 String content = "Hello, HDFS!"; out.write(content.getBytes()); // 关闭输出流 out.close(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值