1. 概述
- HDFS在生产应用中主要是Java客户端的开发,其核心步骤是从HDFS提供的API中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件。
2. 客户端核心类
- Configuration 配置对象类,用于加载或设置参数属性
- FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。
3. IDEA创建工程项目
- 创建一个Maven项目

- 添加maven依赖和编译打包插件
4. 添加maven依赖和编译打包插件
<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-client</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>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
<build>
<plugins>
<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>
</configuration>
</plugin>
</plugins>
</build>
5. 创建Junit单元测试
package com.xdr630.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.After;
import org.junit.Before;
import java.io.IOException;
public class HDFSClientTest {
private static Configuration conf = null;
private static FileSystem fs = null;
@Before
public void connect2HDFS() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://hadoop01:9000");
fs = FileSystem.get(conf);
}
@After
public void close(){
if (fs!=null){
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6. 创建文件夹
@Test
public void mkdir() throws IOException {
if(!fs.exists(new Path("/xdr630"))){
fs.mkdirs(new Path("/xdr630"));
}
}
7. 执行报错:客户端没有权限

- 原因:以Windows登录用户访问HDFS,而该用户不具备在HDFS操作权限
- 解决
1、修改HDFS文件系统权限
2、或者设置客户端身份,该身份具备在HDFS操作权限
@Before
public void connect2HDFS() throws IOException {
System.setProperty("HADOOP_USER_NAME","root");
conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.121.134:9000");
fs = FileSystem.get(conf);
}
- core-site.xml

8. 创建文件夹完整代码
package com.xdr630.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class HDFSClientTest {
private static Configuration conf = null;
private static FileSystem fs = null;
@Before
public void connect2HDFS() throws IOException {
System.setProperty("HADOOP_USER_NAME","root");
conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.121.134:9000");
fs = FileSystem.get(conf);
}
@Test
public void mkdir() throws IOException {
if(!fs.exists(new Path("/xdr630"))){
fs.mkdirs(new Path("/xdr630"));
}
}
@After
public void close(){
if (fs!=null){
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 执行 @test 后 :

9. 上传文件
@Test
public void putFile2HDFS() throws IOException {
Path src = new Path("D:/input/xdr01.txt");
Path dst = new Path("/xdr630/xdr01.txt");
fs.copyFromLocalFile(src,dst);
}


10. 下载文件
@Test
public void getFile2Local() throws IOException {
Path src = new Path("/xdr630/xdr01.txt");
Path dst = new Path("E:/xdr01.txt");
fs.copyToLocalFile(src,dst);
}
