前言
由于Hadoop是使用Java语言编写的,因此可以使用Java API操作Hadoop文件系统。
使用HDFS提供的Java API构造一个访问客户端对象,然后通过客户端对象对HDFS上的文件进行操作(增、删、改、查)。
准备工作
Hadoop集群搭建
请参考文章 https://www.bilibili.com/read/cv7591643
hadoop-win-2.7.7 window简化阉割版(up主提供,下载链接请见文末)
步骤
1.在Window系统下,配置hadoop环境,使用Java开发工具编写代码,相当于Hadoop客户端
在win系统下不配置hadoop环境,直接运行代码会报错,显示缺少winutils.exe 和 hadoop.dll 两个文件
步骤
1-将hadoop-win-2.7.7文件夹拷贝到一个没有中文的路径中;
比如
D:\Program Files\hadoop-win-2.7.7\bin
2-在windows系统,配置hadoop的环境变量: HADOOP_HOME,并将%HADOOP_HOME%\bin添加到path中
3-:把hadoop-win-2.7.7文件夹中bin目录下的hadoop.dll 放到系统盘: C:Windows \System32目录下
4-关闭windows重启
2. 搭建项目环境
创建一个项目名为“HadoopDemo”,包名为“com.wukong”的Maven项目,并在项目的pom.xml文件中引入hadoop-common、hadoop-hdfs、hadoop-client以及单元测试junit的依赖。
补充
使用Idea中自带的maven插件,构建maven项目,比较方便。
创建maven项目时候,选择maven-quickstart 原型。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.7</version>
</dependency>
3. 初始化客户端对象
首先在项目src文件夹下创建com.wukong.hdfsdemo包,并在该包下创建HDFS_CRUD.java文件,编写Java测试类,构建Configuration和FileSystem对象,初始化一个客户端实例进行相应的操作。
4. 上传文件到HDFS
由于采用Java测试类来实现JavaApi对HDFS的操作,因此可以在HDFS_CRUD.java文件中添加一个testAddFileToHdfs()方法来演示本地文件上传到HDFS的示例。
5. 从HDFS下载文件到本地
在HDFS_CRUD.java文件中添加一个testDownloadFileToLocal()方法,来实现从HDFS中下载文件到本地系统的功能。
6. 目录操作
在HDFS_CRUD.java文件添加一个testMkdirAndDeleteAndRename()方法,实现目录的创建、删除、重命名的功能。
7. 查看目录中的文件信息
在HDFS_CRUD.java文件中添加一个testListFiles()方法,实现查看目录中所有文件的详细信息的功能。
package com.wukong.hdfsdemo;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Before;
import org.junit.Test;
public class HDFS_CRUD {
FileSystem fs = null;
@Before
public void init() throws Exception {
// 构造一个配置参数对象,设置一个参数:我们要访问的hdfs的URI
Configuration conf = new Configuration();
// 这里指定使用的是HDFS文件系统
conf.set("fs.defaultFS", "hdfs://hadoop01:9000");
// 通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME", "root");
// 通过FileSystem的静态方法获取文件系统客户端对象
fs = FileSystem.get(conf);
}
@Test
public void testAddFileToHdfs() throws IOException {
// 要上传的文件所在本地路径
Path src = new Path("D:/test.txt");
// 要上传到hdfs的目标路径
Path dst = new Path("/testFile");
// 上传文件方法
fs.copyFromLocalFile(src, dst);
// 关闭资源
fs.close();
}
// 从hdfs中复制文件到本地文件系统
@Test
public void testDownloadFileToLocal() throws IllegalArgumentException, IOException {
// 下载文件
fs.copyToLocalFile(new Path("/testFile"), new Path("D:/"));
}
// 创建,删除,重命名文件
@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"));
// 删除文件夹,如果是非空文件夹,参数2必须给值true
fs.delete(new Path("/a2"), true);
}
// 查看目录信息,只显示文件
@Test
public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {
// 获取迭代器对象
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
// 打印当前文件名
System.out.println(fileStatus.getPath().getName());
// 打印当前文件块大小
System.out.println(fileStatus.getBlockSize());
// 打印当前文件权限
System.out.println(fileStatus.getPermission());
// 打印当前文件内容长度
System.out.println(fileStatus.getLen());
// 获取该文件块信息(包含长度,数据块,datanode的信息)
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
for (BlockLocation bl : blockLocations) {
System.out.println("block-length:" + bl.getLength() + "--" + "block-offset:" + bl.getOffset());
String[] hosts = bl.getHosts();
for (String host : hosts) {
System.out.println(host);
}
}
System.out.println("----------------------------");
}
}
// 查看文件及文件夹信息
@Test
public void testListAll() throws FileNotFoundException, IllegalArgumentException, IOException {
// 获取HDFS系统中文件和目录的元数据等信息
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus fstatus : listStatus) {
String flag = "d-- ";
// 判断是文件还是文件夹
if (fstatus.isFile()) {
flag = "f-- ";
}
System.out.println(flag + fstatus.getPath().getName());
}
}
}
总结
B站有配套视频讲解,欢迎关注B站
资源索取: 搜索公–Z–号:悟空非空也,键盘输入:hdoopwin013
若有疑问,欢迎评论区留言,感谢转发、评论、点赞+收藏+投币,一键三连哈。