HDFS Api
在这之前客户端需要下个idea软件 IntelliJ IDEA | 其他版本https://www.jetbrains.com/zh-cn/idea/download/other.html
idea有两个版本一个 为社区版本
这图如下为专业版本
安装社区版足矣,如需专业版本也可以版本自由选择
创建一个项目
选择Maven 项目jdk版本要1.8+
然后点击Next
然后需要点击Finish
项目图例 1
然后我们配置一下这个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>org.example</groupId>
<artifactId>HadoopDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--hadoop基础依赖 版本为3.1.4-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.4</version>
</dependency>
<!--添加hadoop的HDFS依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.1.4</version>
</dependency>
<!--添加hadoop的Client依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.4</version>
</dependency>
<!--Junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--编写mapreduce程序的核心依赖库-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>3.1.4</version>
</dependency>
</dependencies>
</project>
首次下载可能比较慢
可以在本地配置maven环境可参考往期发布内容 如何在 IntelliJ IDEA 中配置 Maven 项目并使用 Java 8_idea配置java8-CSDN博客https://blog.csdn.net/qq_57629629/article/details/143734290?spm=1001.2014.3001.5501
在项目图例 1中我们点击java右击新建包
输入你的包名 我这选择包名 是cn.itcast.hdfsdemo
然后在cn.itcast.hdfsdemo新建类 我这边类名是HDFS_Test
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.IOException;
/**
* @author 小周
*/
public class HDFS_Test {
// private FileSystem fs;
FileSystem fs=null;
@Before
//初始化
public void init() throws IOException {
//固定方法 获取获取客户端对象构建参数对象
// 指定HDFS配置信息
Configuration conf = new Configuration();
// 指定HDFS中NameNode节点的通信地址,连接HDFS
conf.set("fs.defaultFS", "hdfs://master:8020");
// 指定具有操作HDFS权限的用户root
System.setProperty("HADOOP_USER_NAME", "root");
// 调用FileSystem类的get方法获取conf对象指定的配置信息,并创建HDFS的对象fs
fs = FileSystem.get(conf);
System.out.println("HDFS客户端初始化成功");
}
@Test //在Junit单元测试框架方法
public void testAddFileToHDFS() throws Exception {
// 本地文件系统上传的文件
Path src = new Path("I:\\HadoopDemo\\upload\\test.txt");
//指定将文件上传到HDFS的目录
Path dst = new Path("/testFile");
//put 对象 上传 实现上传文件功能 如果目录被创建 会重命名
fs.copyFromLocalFile(src, dst);
System.out.println("文件上传到HDFS成功");
//关闭资源
fs.close();
}
@Test
public void testDownloadFileToLocal() throws Exception {
//get方法
// hdfs路径
fs.copyToLocalFile(new Path("/testFile/test.txt"),
//目录路径 windows路径
new Path("I:\\HadoopDemo\\download"));
System.out.println("文件从HDFS下载到本地成功");
//释放资源
fs.close();
}
@Test
public void testMkdirAndDeleteAndRename() throws IOException {
// 在hdfs 创建目录
fs.mkdirs(new Path("/a/b/c"));
//Path pa1=new Path("/a/b/c"); fs.mkdirs(pa1);
System.out.println("在HDFS创建目录成功");
fs.mkdirs(new Path("/a2/b2/c2"));
System.out.println("创建目录成功");
//重命名目录
fs.rename(new Path("/a"), new Path("/a3"));
System.out.println("重命名成功");
//递归删除目录
fs.delete(new Path("/a2/b2"), true);
System.out.println("删除成功");
fs.close();
}
@Test //查看文件中的目录信息
public void testListFiles() throws IOException {
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/data"),true );
while (listFiles.hasNext()) {
//fs.listFiles方法,返回LocatedFileStatus的迭代器
LocatedFileStatus fileStatus =listFiles.next();
//LocaledFileStatus只能列出文件
System.out.println("文件名:"+fileStatus.getPath().getName() + ",长度为:"+fileStatus.getLen());
System.out.println("文件的副本数"+fileStatus.getReplication());
System.out.println("文件的修改时间"+fileStatus.getModificationTime());
System.out.println("文件的权限"+fileStatus.getPermission());
System.out.println("文件的大小"+fileStatus.getLen()+"字节");
System.out.println("文件的主机地址"+fileStatus.getPath());
BlockLocation[]blocks = fileStatus.getBlockLocations();
//getBlockLocations()方法获取文件的块位置信息,
// 将其存储在一个BlockLocation数组中。块位置信息包括块所在的数据节点
for (BlockLocation bl:blocks){
String[]hosts = bl.getHosts();
System.out.println("文件的Block所在虚拟机的主机名");
for (String host: hosts) {
System.out.println(host);
}
System.out.println("-----------------------------");
}
}
}
}