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;
/**
* @author xdr630
* @version 1.0
* @date 2021/4/5 21:51
*/
public class HDFSClientTest {
private static Configuration conf = null;
private static FileSystem fs = null;
/**
* 初始化方法 用于和hdfs集群建立连接
*
* @throws IOException
*/
@Before
public void connect2HDFS() throws IOException {
//创建配置对象实例
Configuration conf = new Configuration();
//设置操作的文件系统是 HDFS ,并且指定HDFS操作地址,在/export/servers/hadoop-2.7.4/etc/hadoop/ 下的core-site.xml
conf.set("fs.defaultFS","hdfs://hadoop01:9000");
//创建FileSystem对象
fs = FileSystem.get(conf);
}
/**
* 关闭客户端和hdfs连接
* @throws IOException
*/
@After
public void close(){
//首先判断文件系统实例是否为null,如果不为null,进行关闭
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 {
//设置客户端身份信息,以备在hdfs上进行操作
System.setProperty("HADOOP_USER_NAME","root");
//创建配置对象实例
conf = new Configuration();
//设置操作的文件系统是 HDFS ,并且指定HDFS操作地址,在/export/servers/hadoop-2.7.4/etc/hadoop/ 下的core-site.xml
conf.set("fs.defaultFS","hdfs://192.168.121.134:9000");
//创建FileSystem对象
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;
/**
* @author xdr630
* @version 1.0
* @date 2021/4/5 21:51
*/
public class HDFSClientTest {
private static Configuration conf = null;
private static FileSystem fs = null;
/**
* 初始化方法 用于和hdfs集群建立连接
*
* @throws IOException
*/
@Before
public void connect2HDFS() throws IOException {
//设置客户端身份信息,以备在hdfs上进行操作
System.setProperty("HADOOP_USER_NAME","root");
//创建配置对象实例
conf = new Configuration();
//设置操作的文件系统是 HDFS ,并且指定HDFS操作地址,在/export/servers/hadoop-2.7.4/etc/hadoop/ 下的core-site.xml
conf.set("fs.defaultFS","hdfs://192.168.121.134:9000");
//创建FileSystem对象
fs = FileSystem.get(conf);
}
/**
* 创建文件夹操作
*
*/
@Test
public void mkdir() throws IOException {
//首先判断文件夹是否存在,如果不存在再创建
if(!fs.exists(new Path("/xdr630"))){
//创建文件夹
fs.mkdirs(new Path("/xdr630"));
}
}
/**
* 关闭客户端和hdfs连接
* @throws IOException
*/
@After
public void close(){
//首先判断文件系统实例是否为null,如果不为null,进行关闭
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");
// hdfs上传路径
Path dst = new Path("/xdr630/xdr01.txt");
//文件上传(local->hdfs)
fs.copyFromLocalFile(src,dst);
}
10. 下载文件
/**
* 下载文件
*/
@Test
public void getFile2Local() throws IOException {
//hdfs路径
Path src = new Path("/xdr630/xdr01.txt");
// 本地路径
Path dst = new Path("E:/xdr01.txt");
//文件下载(hdfs->local)
fs.copyToLocalFile(src,dst);
}