3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java

这篇具有很好参考价值的文章主要介绍了3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Hadoop系列文章目录

1、hadoop3.1.4简单介绍及部署、简单验证
2、HDFS操作 - shell客户端
3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java
4、HDFS-java操作类HDFSUtil及junit测试(HDFS的常见操作以及HA环境的配置)
5、HDFS API的RESTful风格–WebHDFS
6、HDFS的HttpFS-代理服务
7、大数据中常见的文件存储格式以及hadoop中支持的压缩算法
8、HDFS内存存储策略支持和“冷热温”存储
9、hadoop高可用HA集群部署及三种方式验证
10、HDFS小文件解决方案–Archive
11、hadoop环境下的Sequence File的读写与合并
12、HDFS Trash垃圾桶回收介绍与示例
13、HDFS Snapshot快照
14、HDFS 透明加密KMS
15、MapReduce介绍及wordcount
16、MapReduce的基本用法示例-自定义序列化、排序、分区、分组和topN
17、MapReduce的分区Partition介绍
18、MapReduce的计数器与通过MapReduce读取/写入数据库示例
19、Join操作map side join 和 reduce side join
20、MapReduce 工作流介绍
21、MapReduce读写SequenceFile、MapFile、ORCFile和ParquetFile文件
22、MapReduce使用Gzip压缩、Snappy压缩和Lzo压缩算法写文件和读取相应的文件
23、hadoop集群中yarn运行mapreduce的内存、CPU分配调度计算与优化



本示例介绍java通过api操作hdfs。
主要包含HDFS的读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等。
本文分为2个部分,即环境准备和示例。

一、配置Windows下Hadoop环境

在windows上做HDFS客户端应用开发,需要设置Hadoop环境,而且要求是windows平台编译的Hadoop,不然会报以下的错误:

#缺少winutils.exe
Could not locate executable null \bin\winutils.exe in the hadoop binaries
#缺少hadoop.dll
Unable to load native-hadoop library for your platform… using builtin-Java classes where applicable

1、解压hadoop-3.1.4_winutils.zip文件

将已经编译好的Windows版本Hadoop解压到到一个没有中文、没有空格的路径下面
该文件由于不能上传,可以参考我的笔记:https://note.youdao.com/s/Tp6Y92QO
hdfs下载整个目录,# hadoop专栏,hdfs,java,hadoop,mapreduce,大数据
hdfs下载整个目录,# hadoop专栏,hdfs,java,hadoop,mapreduce,大数据

2、配置环境变量

在windows上面配置hadoop的环境变量: HADOOP_HOME,并将%HADOOP_HOME%\bin添加到path中。
hdfs下载整个目录,# hadoop专栏,hdfs,java,hadoop,mapreduce,大数据
hdfs下载整个目录,# hadoop专栏,hdfs,java,hadoop,mapreduce,大数据

3、复制hadoop.dll文件

把hadoop3.1.4文件夹中bin目录下的hadoop.dll文件放到系统盘: C:\Windows\System32 目录
hdfs下载整个目录,# hadoop专栏,hdfs,java,hadoop,mapreduce,大数据
以上,完成了windows环境的配置。

二、示例

核心是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件。

1、客户端核心类

  • Configuration 配置对象类,用于加载或设置参数属性
  • FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。

在Java中操作HDFS,主要涉及以下Class:

  • Configuration:该类的对象封转了客户端或者服务器的配置
  • FileSystem:该类的对象是一个文件系统对象,可以用该对象的一些方法来对文件进行操作,通过FileSystem的静态方法get获得该对象。
FileSystem fs = FileSystem.get(conf);
  • get方法

从conf中的一个参数 fs.defaultFS的配置值判断具体是什么类型的文件系统。如果我们的代码中没有指定fs.defaultFS,并且工程classpath下也没有给定相应的配置,conf中的默认值就来自于hadoop的jar包中的core-default.xml,默认值为: file:///,则获取的将不是一个DistributedFileSystem的实例,而是一个本地文件系统的客户端对象。文章来源地址https://www.toymoban.com/news/detail-575800.html

#获取FileSystem方式,有2中方式
#第一种
public void getFileSystem1() throws IOException {
    Configuration configuration = new Configuration();
    //指定我们使用的文件系统类型:
    configuration.set("fs.defaultFS", "hdfs://server1:8020/");
    //获取指定的文件系统
    FileSystem fileSystem = FileSystem.get(configuration);
    System.out.println(fileSystem.toString());
}

#第二种
public void getFileSystem2() throws  Exception{
    FileSystem fileSystem = FileSystem.get(new URI("hdfs://server1:8020"), new Configuration());
    System.out.println("fileSystem:"+fileSystem);
}

2、创建工程及示例

1)、pom.xml导入Maven依赖

<dependencies>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-common</artifactId>
			<version>3.1.4</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-client</artifactId>
			<version>3.1.4</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-hdfs</artifactId>
			<version>3.1.4</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

2)、创建java测试类

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.io.IOUtils;
import org.hadoop.hdfs.sentiment.dfs.impl.MgrHdfsImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class HdfsTest {
	private static Configuration conf = null;
	private static FileSystem fileSystem = null;
	private static final String HADOOP_USER_NAME = "alanchan";
	private static final String DEFAULTFS = "hdfs://server1:8020";

	private static final String BASICPATH = "/test_hadoop_client_java";
	private static final String BASICFILEPATH = "/test_hadoop_client_java/java.txt";
	private static final String LOCALFILEPATH = "D:/workspace/bigdata-component/hadoop/testhadoopclient_java.txt";
	private static final String RENAMEILEPATH = "/test_hadoop_client_java_NEW/bigdata_rename.txt";
	private static final String COPYEILEPATH = "/test_hadoop_client_java/bigdata.txt";
	private static final String COPYEILEPATHTO = "/test_hadoop_client_java_Copy/bigdata.txt";
	private static final String COPYEILEPATHTO2 = "/test_hadoop_client_java_Copy2/bigdata.txt";

	// 初始化方法 用于和hdfs集群建立连接
	@Before
	public void connect2HDFS() throws IOException {
		// 设置客户端身份 以具备权限在hdfs上进行操作
		System.setProperty("HADOOP_USER_NAME", HADOOP_USER_NAME);
		// 创建配置对象实例
		conf = new Configuration();
		// 设置操作的文件系统是HDFS 并且指定HDFS操作地址
		conf.set("fs.defaultFS", DEFAULTFS);
		// 创建FileSystem对象实例
		fileSystem = FileSystem.get(conf);
	}

	@Test
	public void mkdir() throws IOException {
		// FileSystem.exists指定HDFS文件/文件夹是否存在
//		Path file = new Path("hdfsPath");
//		boolean isExists = fs.exists(file);

		// 首先判断文件夹是否存在,如果不存在再创建
		if (!fileSystem.exists(new Path(BASICPATH))) {
			// 创建文件夹
			fileSystem.mkdirs(new Path(BASICPATH));
		}
	}

//
	@Test
	public void putFile2HDFS() throws IOException {
		// 创建本地文件路径
		Path src = new Path(LOCALFILEPATH);
		// hdfs上传路径
		Path dst = new Path(BASICFILEPATH);
		// 文件上传动作(local--->hdfs)
		fileSystem.copyFromLocalFile(src, dst);

	}

	@Test
	public void testHdfs() throws Exception {
		MgrHdfsImpl hdfs = new MgrHdfsImpl();
		Path path = new Path(BASICPATH + "/hdfs.txt");
		String content = "hdfs://server1:8020/sentiment/data_p/task_20220830163507/weibo_data_2.txt";
		hdfs.writeFile(path, content);
		log.info(" readFile={}", hdfs.readFileToString(path));
	}

	@Test
	public void writeFile() throws Exception {
		FSDataOutputStream in = fileSystem.create(new Path(BASICPATH + "/a.txt"));
		in.write("hdfs://server1:8020/sentiment/data_p/task_20220830163507/weibo_data_2.txt".getBytes());
		in.flush();
		in.close();
	}

	@Test
	public void readFile() throws Exception {
//		FSDataInputStream out = fileSystem.open(new Path(BASICFILEPATH));
		FSDataInputStream out = fileSystem
				.open(new Path("hdfs://server1:8020/sentiment/data_p/willDoing_20220830170414"));
//        IOUtils.copyBytes(out,System.out,1024);

		BufferedReader br = new BufferedReader(new InputStreamReader(out));
		String line;
		String result = "";
		while ((line = br.readLine()) != null) {
			// 遍历抓取到的每一行并将其存储到result里面
			result += line + "\n";
		}
//		String content = out.readUTF();
		System.out.println("读文件: " + result);
//		System.out.println("读文件: " + content);

		out.close();

	}

//
//	// 获取文件夹下文件大小
	@Test
	public void getFileSize() throws IllegalArgumentException, IOException {
		log.info("summary={}", fileSystem.getContentSummary(new Path(BASICPATH)).getLength());
	}

//
	@Test
	public void getFile2Local() throws IOException {
		// 源路径:hdfs的路径
		Path src = new Path(BASICFILEPATH);
		// 目标路径:local本地路径
		Path dst = new Path(LOCALFILEPATH);
		// 文件下载动作(hdfs--->local)
		fileSystem.copyToLocalFile(src, dst);
	}

//
	@Test
	public void rename() throws Exception {
		Path srcPath = new Path(BASICFILEPATH);
		Path destpath = new Path(RENAMEILEPATH);
		if (fileSystem.exists(srcPath)) {
			fileSystem.rename(srcPath, destpath);
		}
	}

//没有递归
	@Test
	public void listFiles() throws Exception {
		Path destPath = new Path(BASICPATH);
		if (fileSystem.exists(destPath)) {
			FileStatus[] listStatus = fileSystem.listStatus(destPath);
			for (FileStatus fileStatus : listStatus) {
				if (fileStatus.isFile()) {
					log.info("file is ={}", fileStatus.getPath().getName());
				} else {
					log.info("dir is = {}", fileStatus.getPath().getName());
				}
			}
		}
	}

//
	@Test
	public void copyFiles() throws Exception {
		Path srcPath = new Path(COPYEILEPATH);
		Path destpath = new Path(COPYEILEPATHTO);

		FSDataInputStream in = fileSystem.open(srcPath);
		FSDataOutputStream out = fileSystem.create(destpath);
		IOUtils.copyBytes(in, out, conf);

		IOUtils.closeStream(in);
		IOUtils.closeStream(out);
	}

//
	public void copyFiles(String src, String dest) throws Exception {
		Path srcPath = new Path(src);
		Path destpath = new Path(dest);

		FSDataInputStream in = fileSystem.open(srcPath);
		FSDataOutputStream out = fileSystem.create(destpath);
		IOUtils.copyBytes(in, out, conf);

		IOUtils.closeStream(in);
		IOUtils.closeStream(out);
	}

//
	@Test
	public void copyFiles2() throws Exception {
		Path srcPath = new Path(COPYEILEPATH);
		Path destpath = new Path(COPYEILEPATHTO2);

		FSDataInputStream in = fileSystem.open(srcPath);
		FSDataOutputStream out = fileSystem.create(destpath);

		byte[] b = new byte[1024];
		int hasRead = 0;
		while ((hasRead = in.read(b)) > 0) {
			out.write(b, 0, hasRead);
		}

		IOUtils.closeStream(in);
		IOUtils.closeStream(out);
	}

	private static final String BASICPATH_COPYDIR_SRC = "/testhdfs_copyDir/src";
	private static final String BASICPATH_COPYDIR_DEST = "/testhdfs_copyDir/dest";

	// 递归遍历文件夹
	@Test
	public void listDir() throws Exception {
		Path path = new Path(BASICPATH_COPYDIR_SRC);
		listDir(path);
	}

	public void listDir(Path path) throws Exception {
		FileStatus[] fileStatuses = fileSystem.listStatus(path);
		for (FileStatus fileStatus : fileStatuses) {
			if (fileStatus.isDirectory()) {
				listDir(fileStatus.getPath());
				log.info("目录 = {}", fileStatus.getPath());
			} else {
				log.info("文件完整路径 = {},文件名={}", fileStatus.getPath(), fileStatus.getPath().getName());
			}
		}
	}

	// HDFS API 遍历文件夹中的文件
	@Test
	public void listDir2() throws Exception {
		RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem
				.listFiles(new Path(BASICPATH_COPYDIR_SRC), true);
		while (locatedFileStatusRemoteIterator.hasNext()) {
			LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
			log.info("2 ---------  文件完整路径 = {},文件名={}", next.getPath(), next.getPath().getName());

		}
	}

	// 文件夹拷贝,包含文件夾
	@Test
	public void copyDir() throws Exception {
		Path srcPath = new Path(BASICPATH_COPYDIR_SRC);
		Path destpath = new Path(BASICPATH_COPYDIR_DEST);
//		  public static boolean copy(FileSystem srcFS, Path src,FileSystem dstFS, Path dst,boolean deleteSource,Configuration conf) throws IOException {
		FileUtil.copy(fileSystem, srcPath, fileSystem, destpath, false, conf);

		listDir(destpath);
	}

	// 拷貝文件及目錄,但不包含BASICPATH_COPYDIR_SRC的第一層目錄
	@Test
	public void copyFilesIncludeDir() throws Exception {
		Path srcPath = new Path(BASICPATH_COPYDIR_SRC);
		Path destpath = new Path(BASICPATH_COPYDIR_DEST);

		FileStatus[] fileStatuses = fileSystem.listStatus(srcPath);
		for (FileStatus fileStatus : fileStatuses) {
			if (fileStatus.isDirectory()) {
				FileUtil.copy(fileSystem, fileStatus.getPath(), fileSystem, destpath, false, conf);
				log.info("目录 = {}", fileStatus.getPath());
			} else {
				FileUtil.copy(fileSystem, fileStatus.getPath(), fileSystem, destpath, false, conf);
				log.info("文件完整路径 = {},文件名={}", fileStatus.getPath(), fileStatus.getPath().getName());
			}
		}

		listDir(destpath);
	}

	// 拷贝源文件夹下的所有文件到目标文件夹,不含源文件夹下的文件夹
	@Test
	public void copyDirOnlyFiles() throws Exception {
		Path srcPath = new Path(BASICPATH_COPYDIR_SRC);
		Path destpath = new Path(BASICPATH_COPYDIR_DEST);

		RemoteIterator<LocatedFileStatus> sourceFiles = fileSystem.listFiles(srcPath, true);
		while (sourceFiles.hasNext()) {
			FileUtil.copy(fileSystem, sourceFiles.next().getPath(), fileSystem, destpath, false, conf);
		}

		listDir(destpath);
	}

	private static final String BASICPATH_COPYDIR = "/testhdfs_copyDir";

	// 查找文件
	@Test
	public void search() throws Exception {
		Path srcPath = new Path(BASICPATH_COPYDIR);
		String searchFileName = "2022年度本市工程系列计算机技术及应用专业高级职称评审工作已启动.docx";
		RemoteIterator<LocatedFileStatus> sourceFiles = fileSystem.listFiles(srcPath, true);
		while (sourceFiles.hasNext()) {
			Path srcFile = sourceFiles.next().getPath();
			String srcFileName = srcFile.getName();
			if (searchFileName.equals(srcFileName)) {
				log.info("文件路徑={},查找文件名={}", srcFile, searchFileName);
			}

		}

	}

	private static final String TODELETEFILE = "/test_hadoop_client_java/bigdata.txt";

	@Test
	public void delete() throws Exception {
		// 判断文件是否存在
		if (fileSystem.exists(new Path(TODELETEFILE))) {
			fileSystem.delete(new Path(TODELETEFILE), true);
		}
	}

	@After
	public void close() {
		// 首先判断文件系统实例是否为null 如果不为null 进行关闭
		if (fileSystem != null) {
			try {
				fileSystem.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

到了这里,关于3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2.php开发-个人博客项目&文件操作类&编辑器&上传下载删除读写

    ​ ​ ​ 文件上传类: form表单上传文件 --文件上传,--php接收,处理 action ---提交给谁处理 move函数移到文件 ---文件上传漏洞啊!!! ——ueditor 实现编辑器的加载 上传文件的方法: 用了编辑器,就要用编辑器去验证了(编辑器没漏洞,那就没漏洞——他有问题就有问题,

    2024年01月21日
    浏览(47)
  • 关于hdfs突然无法上传下载文件的解决方法(Couldn‘t upload the file)

    在浏览器上可以正常访问HDFS集群http://node1:9870的Web UI页面,成功进入以下界面 同时可以查看hdfs的目录和文件 但无法上传和下载文件,出现以下报错:Couldn’t upload the file. 1、刚开始是可以对文件及文件夹进行增删改操作的,现在突然操作不了的,请检查下本地电脑的hosts文件

    2024年02月12日
    浏览(62)
  • 大数据:HDFS的Shell操作,进程启动管理,文件系统操作命令,创建文件文件夹,下载上传,复制移动,删除,展示,追加内容

    2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库 这oracle比sql安全,强大多了,所以你需要学

    2024年02月07日
    浏览(70)
  • SpringBoot整合hdfs,实现文件上传下载删除与批量删除,以及vue前端发送请求,实现前后端交互功能;

    部分工具类代码参考文章:https://blog.csdn.net/qq_27242695/article/details/119683823 前端实现效果 HDFSController HDFS FileInterface (文件接口) HDFS FileImplService (文件接口实现类) HDFSConfig(从yaml读取文件) HDFSUTils 前端vue代码:

    2024年02月16日
    浏览(84)
  • 大数据技术基础实验四:HDFS实验——读写HDFS文件

    在前面的实验中我们进行了HDFS的部署,并设置了一键启动HDFS操作,本期实验我们将使用HDFS开发环境进行HDFS写、读的编写,以及程序的运行,了解HDFS读写文件的调用流程,理解HDFS读写文件的原理。 好啦废话不多说,我们开始今天的实验操作。 会在Linux环境下编写读写HDFS文

    2023年04月16日
    浏览(42)
  • Linux下sftp,下载整个目录文件

    1. 网上看了很多get -r可我就是报错就是不行 2. 可用命令 首先使用 version 命令查看sftp版本,以防版本不同导致的差异: 那么接下来我们就要自力更生,输入 help 命令,查看帮助: 我们可以看到get的命令后面是-p,并非为-r 尝试命令1: get -p basic_data 失败 × 尝试命令2: get -p

    2024年02月16日
    浏览(39)
  • 无需克隆整个仓库,下载Github特定文件夹内的文件

    注意:此方法对Git-LFS方式上传的文件可能无效!!! 在 Windows 中,可以通过以下步骤打开 PowerShell 终端: 使用搜索功能: 点击 Windows 按钮(开始菜单左下角的 Windows 图标)。 在搜索框中键入 \\\"PowerShell\\\" 或 \\\"Windows PowerShell\\\"。 在搜索结果中,选择 \\\"Windows PowerShell\\\" 或 \\\"Windows Po

    2024年02月01日
    浏览(60)
  • 【Postman】 测试文件上传、下载 一、使用PostMan测试文件上传接口

    1、、选择post请求方式,输入请求地址   二、填写Headers  一般是自动生成的 Key:Content-Type Value:multipart/form-data 如下图   三、填写body 选择form-data     然后选择文件file    点击添加文件,最后发送即可   1、反馈异常,先排查 Headers中 Conten-Type 与 ”文件类型“是否匹配  

    2024年02月11日
    浏览(62)
  • GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)

    在这篇博客中,我们将深入探讨如何从GitHub下载文件或整个项目。无论你是编程新手,还是资深开发者,本文都将提供简单易懂的指导,帮助你轻松掌握下载技巧。涵盖从单个文件下载到整个项目的下载,我们的目标是确保每位读者都能通过本文轻松实现从GitHub的下载需求。

    2024年04月10日
    浏览(93)
  • 使用Postman模拟文件上传和下载

    Postman是一款强大的HTTP请求模拟工具,它可以帮我们在没有前端界面的情况下模拟发送HTTP请求,非常适合API开发和测试。在本篇文章中,我将向你展示如何使用Postman进行文件的上传和下载。   启动Postman,点击“新建请求”按钮。 在弹出的新页面中,选择请求类型为“POST”

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包