hdfs对文件的增删改查
源代码:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.idcast</groupId> <artifactId>hdfs_api_demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <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-hdfs</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-mapreduce-client-core</artifactId> <version>3.1.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> </dependencies> <build> <plugins> <!--java编译插件--> <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> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <minimizeJar>true</minimizeJar> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
java:
package cn.idcast.hdfs_api; import com.jcraft.jsch.IO; import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org.apache.kerby.util.IOUtil; import org.apache.log4j.BasicConfigurator; import org.junit.Test; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class HdfsApiDemo { //获取FileSystem--方法1 @Test public void getFileSystem1() throws IOException { Configuration configuration=new Configuration(); configuration.set("fs.defaultFS","hdfs://node1:8020"); FileSystem fileSystem = FileSystem.get(configuration); System.out.println(fileSystem.toString()); } //获取FileSystem--方法2 @Test public void getFileSystem2() throws IOException, URISyntaxException { FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),new Configuration()); System.out.println(fileSystem); } //获取FileSystem--方法3 @Test public void getFileSystem3() throws IOException { Configuration configuration=new Configuration(); configuration.set("fs.defaultFS","hdfs://node1:8020"); FileSystem fileSystem = FileSystem.newInstance(configuration); System.out.println(fileSystem.toString()); } //获取FileSystem--方法4 @Test public void getFileSystem4() throws IOException, URISyntaxException { FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://node1:8020"),new Configuration()); System.out.println(fileSystem.toString()); } //遍历所有文件 @Test public void listMyFiles() throws Exception, URISyntaxException { //1:获取FileSystem实例 FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),new Configuration(),"root"); //2:调用方法listFiles 获取 / 目录下所有文件信息 RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("/"), true); //遍历迭代器 while(locatedFileStatusRemoteIterator.hasNext()){ LocatedFileStatus next = locatedFileStatusRemoteIterator.next(); System.out.println(next.getPath().toString()); } fileSystem.close(); } //创建文件目录 @Test public void mkdirs() throws IOException, URISyntaxException, InterruptedException { FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),new Configuration(),"root"); boolean mkdirs = fileSystem.mkdirs(new Path("/hello/mydir/test")); System.out.println(mkdirs); fileSystem.close(); } //创建文件夹 @Test public void mkdirsTest() throws IOException, URISyntaxException, InterruptedException { FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),new Configuration(),"root"); fileSystem.create(new Path("/hello/mydir/test/a.txt")); // System.out.println(mkdirs); //fileSystem.close(); } //实现文件的下载 @Test public void downloadFile() throws URISyntaxException, IOException, InterruptedException { FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),new Configuration(),"root"); FSDataInputStream inputStream = fileSystem.open(new Path("/hello/mydir/test/a.txt")); FileOutputStream outputStream = new FileOutputStream("D://a.txt"); IOUtils.copy(inputStream,outputStream); IOUtils.closeQuietly(inputStream); IOUtils.closeQuietly(outputStream); fileSystem.close(); } //实现文件的下载--简单方法 @Test public void downloadFile2() throws URISyntaxException, IOException, InterruptedException { FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),new Configuration(),"root"); fileSystem.copyToLocalFile(new Path("/hello/mydir/test/a.txt"),new Path("D://a.txt")); fileSystem.close(); } //实现文件的上传 @Test public void uploadFile() throws URISyntaxException, IOException, InterruptedException { FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),new Configuration(),"root"); fileSystem.copyFromLocalFile(new Path("D://hdfs-site.txt"),new Path("/")); fileSystem.close(); } //小文件的合并 @Test public void mergeFile() throws URISyntaxException, IOException, InterruptedException { //1:获取FileSystem(分布式文件系统) FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),new Configuration(),"root"); //2:获取hdfs大文件的输出流 FSDataOutputStream outputStream = fileSystem.create(new Path("/big_txt.txt")); //3:获取一个本地文件系统 LocalFileSystem localFileSystem = FileSystem.getLocal(new Configuration()); //4:获取本地文件夹下所有文件的详情 FileStatus[] fileStatuses = localFileSystem.listStatus(new Path("D://input")); //5:遍历每个文件,获取每个文件的输入流 for (FileStatus fileStatus : fileStatuses) { FSDataInputStream inputStream = localFileSystem.open(fileStatus.getPath()); //6:将小文件的数据复制到文件 IOUtils.copy(inputStream,outputStream); IOUtils.closeQuietly(inputStream); } //7:关闭流 IOUtils.closeQuietly(outputStream); localFileSystem.close(); fileSystem.close(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!