IDEA使用HDFS的JavaApi

注:以下代码操作是利用junit在java测试文件夹中实现。

1. 准备工作

1.1 创建测试类

创建测试类,并定义基本变量

public class HDFSJAVAAPI {// 定义后续会用到的基本变量public final String HDFS_PATH = "hdfs://hadoop00/";Configuration conf = null;FileSystem fs = null;
}

1.2 定义资源初始化方法

注释@Before的作用是在后续每次测试方法之前先执行此方法,进行资源初始化。

    @Before// 用于初始化HDFS配置,执行打开资源的操作public void Init() throws Exception {System.out.println("打开资源初始化完成!");// 如果是无参构造函数,那么将加载默认的配置文件conf = new Configuration();//获取FileSystem实例//对于文件的操作都会在 hdfs://user/root/ 文件夹下进行fileSystem = FileSystem.get(URI.create(HDFS_PATH), conf, "root");}

1)关于Configuration

Hadoop使用org.apache.hadoop.conf.Configuration处理配置信息。这个类是作业的配置信息类,任何作用的配置信息必须通过Configuration传递,因为通过Configuration可以实现在多个mapper和多个reducer任务之间共享信息。

Configuration对象封装了客户端或服务器的配置,通过设置配置文件读取类路径来实现(如 etc/hadoop/core-site.xml)。

2)关于FileSystem

FileSystem是一个通用的文件系统API,这里使用的文件系统是HDFS,获取FileSystem实例有下面这几个静态方法。

public static FileSystem get(Configuration conf) throws IOException
public static FileSystem get(URI uri, Configuration conf) throws IOException
public static FileSystem get(URI uri, Configuration conf, String )
  • 第一个方法返回的是默认文件系统(在core-site.xml中指定的,如果没有指定,则使用默认的本地文件系统)。
  • 第二个方法通过给定的URI方案和权限来确定要使用的文件系统,如果给定URI中没有指定方案,则默认返回文件系统。
  • 第三个方法作为给定用户来访问文件系统,对安全来说至关重要。

1.3 定义资源关闭方法

注释@After的作用是每次测试完成一个方法后都执行此操作,将资源关闭。

@After
// 用于关闭资源
public void Shot() throws Exception {// 将对象都置空fs = null;conf = null;System.out.println("资源已关闭!");
}

2. 利用Java操作HDFS

2.1 创建目录

@Test
public void mkdir() throws Exception {fs.mkdirs(new Path("HDFSAPI/test"));
}

执行结果:

在这里插入图片描述

1)FileSystem实例提供了创建目录的方法:

public boolean mkdirs(Path f) throws IOException

这个方法可以一次性创建所有必要但还没有的父目录,就像java.io.File类的mkdirs()方法。如果目录(以及所有父目录)都已经创建成功,则返回true。

注:因为指定了用户root所以新键的文件夹默认放在/user/root/下

2.2 上传本地文件到HDFS

    public void copyFromLocalFile() throws Exception {Path src = new Path("D:\\天\\Documents\\文本文件\\登岳阳楼.txt");Path dst = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/");fs.copyFromLocalFile(src, dst);}

执行结果:

在这里插入图片描述

2.3 读取文件

    @Testpublic void readFile() {FSDataInputStream in = null;try {in = fs.open(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/登岳阳楼.txt"));IOUtils.copyBytes(in, System.out, 4096, false);} catch (IOException e) {e.printStackTrace();} finally {IOUtils.closeStream(in);}}

执行结果:

在这里插入图片描述

1)FSDataInputStream对象:

FileSystem对象中的open()方法返回的是FSDataInputStream对象,而不是标准的java.io类对象。这个类是继承了java.io.DataInputStream的一个特殊类,并支持随机访问,由此可以从流的任意位置读取数据。

package org.apache.hadoop.fs;public class FSDataInputStream extends DataInputStream implements Seekable, PositionedReadable{
}

Seekabel接口支持在文件中找到指定位置,并提供一个查询当前位置相对于文件起始位置偏移量(getPos())的查询方法:

public interface Seekable {void seek(long pos) throws IOException;long getPos() throws IOException;
}

调用seek()来定位大于文件长度的位置会引发IOException异常。与java.io.InputStreamskip()不同,seek()可以移到文件中的任意一个绝对位置,skip()则只能相对于当前位置定位到一个新位置。

// 使用seek()方法,将HDFS中的一个文件在标准输出上显示两次@Testpublic void readFileTwice() {FSDataInputStream in = null;try {in = fs.open(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/登岳阳楼.txt"));IOUtils.copyBytes(in, System.out, 4096, false);in.seek(0); //回到文件的开头IOUtils.copyBytes(in, System.out, 4096, false);} catch (IOException e) {e.printStackTrace();} finally {IOUtils.closeStream(in);}}

执行结果:

在这里插入图片描述

2.4 重命名文件

@Test
public void rename() throws Exception {Path oldPath = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/登岳阳楼.txt");Path newPath = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/ClimbingTheYueyangTower.txt");System.out.println(fs.rename(oldPath, newPath));
}

执行结果:

在这里插入图片描述

1)FileSystem实例提供了重命名文件的方法:

public boolean rename(oldPath f1, newPath f2)

2.5 创建文件

@Test
public void create() throws Exception {//FSDataOutputStream类是Hadoop对于写操作提供的一个类,这个类重载了很多write方法用于写入不同类型的数据//像FSDataIntputStream类一样,要获得FSDataOutputStream类的对象,就必须通过FileSystem类来和HDFS建立连接,然后//通过路径返回FSDataOutputStream实例(对象)。FSDataOutputStream output = fs.create(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/hello.txt"));output.write("hello world".getBytes());output.flush();output.close();
}

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

1)FSDataOutputStream对象

FileSystem实例的create()方法返回FSDataOutputStream对象,与FSDataInputStream类相似,它也有一个查询文件当前位置的方法:

package org.apache.hadoop.fs;
public class FSDataOutputStream extends DataOutputStream implements Syncable {public long getPos() throws IOException {}
}

但与FSDataInputStream类不同的是,FSDataOutputStream类不允许在文件中定位。这是因为HDFS只允许一个已打开的文件顺序写入,或在现有文件的末尾追加数据。

2.6 查询文件系统

查看某个目录下的所有文件

@Test
public void listFile() throws Exception {//FileStatus对象封装了文件系统中文件和目录的元数据,包括文件的长度、块大小、备份数、修改时间、所有者以及权限等信息。//FileStatus对象一般由FileSystem的getFileStatus()方法获得,调用该方法的时候要把文件的Path传递进去。FileStatus[] listStatus = fs.listStatus(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test"));for (FileStatus fileStatus : listStatus) {String isDir = fileStatus.isDirectory()?"文件夹":"文件"; // 文件 / 文件夹String permission = fileStatus.getPermission().toString();// 权限short replication = fileStatus.getReplication(); // 副本系数long len = fileStatus.getLen(); //长度String path = fileStatus.getPath().toString();   // 路径System.out.println(isDir + "\t" +permission + "\t" + replication + "\t" + len + "\t" + path);}
}

执行结果:

在这里插入图片描述

1)列出文件:

查找一个文件或目录的信息很实用,但通常还需要能够列出目录中的内容。这就是FileSystemlistStatus()方法的功能:

public FileStatus[] listStatus(Path f) throws IOException
public FileStatus[] listStatus(Path f, PathFilter filter) throws IOException
public FileStatus[] listStatus(Path[] files) throws IOException
public FileStatus[] listStatus(Path[] files, PathFilter filter) throws IOException

2.7 查看文件块信息

    @Testpublic void getFileBlockLocation() throws Exception {FileStatus fileStatus = fileSystem.getFileStatus(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/ClimbingTheYueyangTower.txt"));BlockLocation[] blocks = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());for (BlockLocation block : blocks) {for (String host : block.getHosts()) {System.out.println(host);}for (String name : block.getNames()) {System.out.println(name);}}}

注:这里获取元数据中的主机名和主机地址。

执行结果:

在这里插入图片描述

1)文件元数据:FileStatus

FileStatus类封装了文件系统中文件和目录的元数据,包括文件长度、块大小、副本、修改时间、所有者以及权限信息。

FeilSystemgetFileStatus()方法用于获取文件或目录的FileStatus对象。


参考资料:

  • 《Hadoop权威指南–大数据分析与存储》 第四版
  • 《Hadoop应用开发基础》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CleanMyMac X 4.14.6中文版2024年最新必备的Mac系统清理工具

CleanMyMac X 4.14.6中文版是一款专业的Mac系统清理软件,可一键智能扫描清理mac系统日志缓存磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X 破解版可以强力卸载恶意软件,修复系统漏洞&…

CSI多普勒效应

CSI多普勒效应 一、定义二、应用三、计算方法1方法2STFT和DFT间的区别 一、定义 多普勒频移是指由于运动引起的信号频率的变化。当信号源相对于接收器运动时,由于多普勒效应,信号的频率会发生改变。多普勒频移可以通过以下公式表示: 二、应…

acwing 前缀差分

二维差分 构造差分时,在读入矩阵元素时同时构建差分即最初差分矩阵是一个全零矩阵的差分读入一个元素时,差分矩阵随即更新即该数组是一个含有已读入元素的矩阵的差分矩阵随后对于区间累加,执行相应操作,因为当前矩阵已经是构造好…

最小覆盖子串(LeetCode 76)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符&#xff…

再见2023,你好2024(附新年烟花python实现)

亲爱的朋友们: 写点什么呢,我已经停更两个月了。2023年快结束了,时间真的过得好快,总要写点什么留下纪念吧。这一年伴随着许多挑战和机会,给了我无数的成长和体验。坦白说,有时候我觉得自己好像是在时间的…

Kindle使用USB数据线传书封面无法显示问题

以下内容只针对USB传书(非越狱版本,越狱了有相关插件,这里不谈),不包括邮件传书。 恶心图如下: 直接把mobi/azw3/azw (epub模式不能直接拷贝,kindle无法读取)格式的电子…

机器人中的数值优化之罚函数法

欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 L2-Penalty Method 1.1等式约束 1.2不等式约束 2 L1-Penalty Method 3 Barrier Method …

Python 简易图形界面库easygui 对话框大全(续)

目录 EasyGUI库 主要特点 使用场景 对话框样式 10. 文件打开框 fileopenbox 11. 文件保存框 filesavebox 12. 目录打开框 diropenbox 13. 索引对话框 indexbox 14. 例外报告框 exceptionbox 15. 代码文本框 codebox 16. 密码输入框 passwordbox 17. 多重文本框 mul…

全球知名数字资产平台LBank 与 The Sandbox Korea 达成战略合作

全球知名数字资产平台LBank,携手韩国元宇宙创新者The Sandbox Korea,共同开启了一场数字与虚拟世界的奇妙之旅。自2023年11月22日起,这两大巨头正式结成战略联盟,以提升用户体验为核心目标,开启了全新的合作篇章。 在…

模拟控制方式(PWM)

引言 PWM(脉冲宽度调制)是一种常见的模拟控制方式,通过调节脉冲宽度来控制功率输出的占空比,从而实现模拟信号的传输和控制。在许多领域中,PWM都得到了广泛的应用,如电机控制、LED调光、音频控制等。本文将…

51系列--数码管显示的4X4矩阵键盘设计

本文介绍基于51单片机的4X4矩阵键盘数码管显示设计(完整Proteus仿真源文件及C代码见文末链接) 一、系统及功能介绍 本设计主控芯片选用51单片机,主要实现矩阵键盘对应按键键值在数码管上显示出来,矩阵键盘是4X4共计16位按键&…

《数据库系统原理》之关系数据库 【知识点罗列+关系代数例题演练】

目录 一、关系模型 1.什么是数据模型? 2.什么是关系模型? (1)字段: (2)属性 (3)记录 (4)元组 二、关系模型的数据结构和定义 1.域 2.笛卡尔积 3.…