HDFS的JAVA API操作
HDFS作为Hadoop实现的其中一个文件系统,除了能使用Shell操作HDFS的文件和目录之外,还可以通过HDFS提供的Java API操作HDFS的文件和目录。
在HDFS Java API中,常用的一个核心包为org.apache.hadoop.fs,该包提供了常用的FileSystem、FileStatus、FSDataInputStream、FSDataOutputStream和Path类。
FileSystem类:用于介绍为对文件进行一系列操作。
FileStatus类:该类用于向客户端展示HDFS中文件和目录的元数据,包括文件大小、Block大小、副本信息和修改时间等。
FSDataInputStream类:表示HDFS输入流,用于实现HDFS写入文件的操作。
FSDataOutputStream类:表示HDFS输出流,用于实现HDFS读取文件的操作。
Path类:表示HDFS中的一个目录或一个文件路径。
HDFS中对文件的一系列操作,通常使用org.apache.hadoop.fs包下的FileSystem类实现,以下是FileSystem常用的几个方法介绍:

直接next,采用默认的安装方式就可以了。打开Idea

创建完maven项目之后,会生成pom.xml文件,编辑pom文件,配置jar包的版本号和名称,把运行hadoop程序所依赖的jar包配置好之后重新加载,idea就会自动下载所需要的jar包,显示在External Libraries文件列表中。
下面是pom的具体内容:
<?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>org.example</groupId>
<artifactId>hadooptest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
由于maven默认配置的是国外的镜像库,如果下载不下来相应的jar包,可以更改maven的仓库源地址
可以右键创建setting.xml,或者是打开C:\Users\Administrator.m2\目录,在这个目录里面创建setting.xml,更改settting.xml为下面内容,这里把maven的镜像源设置为阿里云的公共仓库从而实现Hadoop的jar包下载
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
</settings>
新建HDFS_CURD类去测试用java操作HDFS
package cn.itcast.hdfsdemo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;
import java.io.FileNotFoundException;
import java.io.IOException;
public class HDFS_CURD {
FileSystem fs = null;
@Before
public void init() throws Exception {
//获取config对象
Configuration conf = new Configuration();
//设置hadoop集群的通信地址,采用的是用虚拟机已经搭建好的hadoop集群,通信端口是hadoop1:9000
conf.set("fs.defaultFS", "hdfs://hadoop1:9000");
//设置hadoop的用户操作
System.setProperty("HADOOP_USER_NAME", "root");
//获取filesystem对象
fs = FileSystem.get(conf);
}
//注解Test用于在Junit单元测试框架中测试方法testAddFileToHdfs()
@Test
public void testAddFileToHdfs() throws IOException {
// 指定本地文件系统上传的文件
Path src = new Path("D:\\upload\\test.txt");
// 指定将文件上传到HDFS的目录
Path dst = new Path("/testFile");
fs.copyFromLocalFile(src, dst);
// 关闭资源
fs.close();
}
@Test
public void testDownloadFileToLocal() throws IllegalArgumentException,
IOException {
fs.copyToLocalFile(
new Path("/testFile/test.txt"),
new Path("D:\\downloadFile"));
}
@Test
public void testMkdirAndDeleteAndRename() throws Exception {
fs.mkdirs(new Path("/a/b/c"));
fs.mkdirs(new Path("/a2/b2/c2"));
fs.rename(new Path("/a"), new Path("/a3"));
fs.delete(new Path("/a2"), true);
}
@Test
public void testListFiles() throws FileNotFoundException,
IllegalArgumentException, IOException {
RemoteIterator<LocatedFileStatus> listFiles =
fs.listFiles(new Path("/car"), true);
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("文件名:" + fileStatus.getPath().getName());
System.out.println("文件的副本数:" + fileStatus.getReplication());
System.out.println("文件的权限:" + fileStatus.getPermission());
System.out.println("文件大小:" + fileStatus.getLen() + "字节");
BlockLocation[] blockLocations =
fileStatus.getBlockLocations();
for (BlockLocation bl : blockLocations) {
String[] hosts = bl.getHosts();
System.out.println("文件的Block所在虚拟机的主机名:");
for (String host : hosts) {
System.out.println(host);
}
}
System.out.println("----------------------------");
}
}
}
更多推荐


所有评论(0)