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.mzph.cn/news/584753.shtml

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

相关文章

Android studio CMakeLists.txt 打印的内容位置

最近在学习 cmake 就是在安卓中 , 麻烦的要死 , 看了很多的教程 , 发现没有 多少说对打印位置在哪里 , 先说一下版本信息 , 可能你们也不一样 gradle 配置 apply plugin: com.android.applicationandroid {compileSdkVersion 29buildToolsVersion "29.0.3"defau…

GPT编程(1)八分类图像数据集转换为二分类

一个核心问题就是要将这八类数据图片全部重命名,尝试了一步到位 有一个图像数据集,有八个类别amusement,anger,awe,contentment,disgust, excitement, fear,sadness的图片,每张图片被命名为“类别数字”。采用遍历的方式,按顺序阅…

Go语言学习第二天

Go语言数组详解 var 数组变量名 [元素数量]Type 数组变量名:数组声明及使用时的变量名。 元素数量:数组的元素数量,可以是一个表达式,但最终通过编译期计算的结果必须是整型数值,元素数量不能含有到运行时才能确认大小…

阿里云2核2G3M服务器放几个网站?

阿里云2核2g3m服务器可以放几个网站?12个网站,阿里云服务器网的2核2G服务器上安装了12个网站,甚至还可以更多,具体放几个网站取决于网站的访客数量,像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ 可定制化

工程项目管理软件是现代项目管理中不可或缺的工具,它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件,该软件采用先进的Vue、Uniapp、Layui等技术框架,涵盖了项目策划决策、规划设计、施工建设到竣工交付…

springboot整合hadoop遇错

错误一: Caused by: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. 解决: 下载:https://github.com/steveloughran/winutils 选择一个版本 例如:3.0.0 ,将里面的hadoop.dll文件复制…

在IntelliJ IDEA中精通Git配置与使用:全面指南

目录 1 前言2 idea中使用git的准备2.1 在 IntelliJ IDEA 中配置 Git2.2 配置 Git 忽略文件 3 在IntelliJ IDEA中使用Git的基本步骤3.1 项目导入到 Git3.2 查看与切换版本信息 4 在 IntelliJ IDEA 中使用分支4.1 创建分支4.2 无冲突合并4.3 冲突合并 5 结语 1 前言 版本控制是现…

Linux(ubuntu)下git / github/gitee使用

先附上git命令 linuxchenxiao:~$ cd Templates/ 先进入一个目录,也可mkdir新建一个目录:用于接下来初始化为git可以管理的仓库 这个目录就是所说的工作目录,指当前正在进行开发的项目的本地目录。 linuxchenxiao:~/Templates$ git init 已…

[每周一更]-(第79期):Apache代理的配置

反向代理逻辑类似Nginx,以下具体展示属于apache的配置和参数说明 局部代理配置方式: # 配置包含https的需要打开 SSLProxyEngine on ProxyPass /api/small https://api.web.com/version1/small/ ProxyPassReverse /api/small https://api.web.com/versio…

直方图与均衡化

直方图 统计图像中相同像素点的数量。 使用cv2.calcHist(images, channels, mask, histSize, ranges)函数 images:原图像图像格式为uint8或float32,当传入函数时应用[]括起来,例如[img]。 channels:同样用中括号括起来&#xff…

如何确保云中高可用?聊聊F5分布式云DNS负载均衡

在当今以应用为中心的动态化市场中,企业面临着越来越大的压力,不仅需要提供客户所期望的信息、服务和体验,而且要做到快速、可靠和安全。DNS是网络基础设施的重要组成部分,拥有一个可用的、智能的、安全和可扩展的DNS基础设施是至…

工程(十六)——自己数据集跑Fast_livo

一、基础环境 Ubuntu20.04 ROS noetic PCL 1.8 Eigen 3.3.4 Sophus git clone https://github.com/strasdat/Sophus.git cd Sophus git checkout a621ff mkdir build && cd build && cmake .. make sudo make install 下面两个直接把包下载下来一起编译…

2023-12-29 服务器开发-Centos部署LNMP环境

摘要: 2023-12-29 服务器开发-Centos部署LNMP环境 centos7.2搭建LNMP具体步骤 1.配置防火墙 CentOS 7.0以上的系统默认使用的是firewall作为防火墙, 关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable fire…

Windows上ModbusTCP模拟Master与Slave工具的使用

场景 Modbus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用: Modebus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用_modbus poll激活-CSDN博客 数据对接协议为Modbus TCP,本地开发需要使…

C语言编程入门 – 编写第一个Hello, world程序

C语言编程入门 – 编写第一个Hello, world程序 C Programming Entry - Write the first application called “Hello, world!” By JacksonML C语言编程很容易! 本文开始,将带领你走过C语言编程之旅,通过实例使你对她颇感兴趣,一…

GLTF编辑器实现逼真的石门模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在凹凸贴图中,每个像素点都包含了一个法线向量&#xff0…

楼宇对讲门铃选型分析

目前很多的高层住宅都使用了对讲门铃了,在频繁使用中,门铃会出现的越来越多种类,下面我就简单的介绍会有用到的几款芯片. 语音通话芯片:D34018,D34118,D5020,D31101; D34018 单片电话机通话电路,合并了必 需的放大器…

Nature | 大型语言模型(LLM)能够发现和产生新知识吗?

大型语言模型(LLM)是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络,这些神经网络由具有自注意力功能的编码器和解码器组成。编码器和解码器从一系列文本中提取含义,并理解其中的单词和短语之间的关系。通…

GPT-3: Language Models are Few-Shot Learners

GPT-3 论文 数据集 CommonCrawl:文章通过高质量参考语料库对CommonCrawl数据集进行了过滤,并通过模糊去重对文档进行去重,且增加了高质量参考语料库以增加文本的多样性。WebText:文章采用了类似GPT-2中的WebText文档收集清洗方…

BUG-由浏览器缩放引起PC端显示手机端视图

文章目录 来源解决 来源 启动Vue项目,用浏览器打开显示手机端视图,从vscode直接ctrl链接打开正常显示。 检查-未开启仿真,但仍显示错误。 解决 浏览器缩放问题。 修改为100%