本次实战涉及使用Java操作Hadoop HDFS,包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务,成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践,如检查文件存在性以避免重复创建,以及处理HDFS安全模式下的异常情况。整个过程加深了对Hadoop文件系统操作的理解,并提高了解决实际问题的能力。
用Maven项目比用Java项目更方便,在pom.xml
添加2个依赖即可
- 项目对象模型文件 -
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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.huawei</groupId>
<artifactId>Test</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Test</name>
<dependencies>
<!--hadoop客户端-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.4</version>
</dependency>
<!--单元测试框架-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
</project>
- 日志属性文件 -
log4j.properties
log4j.rootLogger=stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/hdfs.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
- 创建文件类 -
CreateFileOnHDFS
package net.huawei.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.net.URI;
/**
* 功能:在HDFS上创建文件
* 作者:华卫
* 日期:2024年11月15日
*/
public class CreateFileOnHDFS {
@Test
public void create1() throws Exception {
// 创建配置对象
Configuration conf = new Configuration();
// 创建统一资源标识符
String uri = "hdfs://master:9000";
// 创建HDFS文件系统对象
FileSystem fs = FileSystem.get(new URI(uri), conf);
// 创建路径对象(指向文件)
Path file = new Path(uri + "/ied02/hadoop.txt");
// 基于路径对象创建文件
boolean result = fs.createNewFile(file);
// 判断文件是否创建成功
if (result) {
System.out.println("恭喜,文件[" + file + "]创建成功~");
} else {
System.out.println("遗憾,文件[" + file + "]创建失败~");
}
}
@Test
public void create2() throws Exception {
// 创建配置对象
Configuration conf = new Configuration();
// 创建统一资源标识符
String uri = "hdfs://master:9000";
// 创建HDFS文件系统对象
FileSystem fs = FileSystem.get(new URI(uri), conf);
// 创建路径对象(指向文件)
Path file = new Path(uri + "/ied02/hadoop.txt");
// 判断文件是否存在
if (fs.exists(file)) {
System.out.println("文件[" + file + "]已经存在~");
} else {
try {
// 基于路径对象创建文件
boolean result = fs.createNewFile(file);
// 判断文件是否创建成功
if (result) {
System.out.println("恭喜,文件[" + file + "]创建成功~");
} else {
System.out.println("遗憾,文件[" + file + "]创建失败~");
}
} catch (Exception e) {
System.err.println("异常信息:" + e.getMessage());
}
}
}
}
-
删除文件,执行命令:
hdfs dfs -rm /ied02/hadoop.txt
-
运行
create1()
方法,查看结果
-
此时,文件已经创建了,再次运行
create1()
方法,提示文件创建失败
-
运行
create2()
方法,提示文件已经存在