- 1.概述
- 2.客户端核心类
- 3.代码实现
- 3.1.使用IDEA创建一个Maven项目
- 3.2.配置pom.xml文件
- 3.3.编写代码
HDFS在生产应用中主要是Java客户端的开发,其核心步骤是从HDFS提供的API中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(例如增删改查)HDFS上的文件。 在编写代码操作HDFS之前,个人电脑上的开发环境如下: (1)在CentOS中安装好hadoop-3.1.4,并搭建好hadoop集群; (2)在windows中安装好JDK1.8、Maven3.8.1以及IDEA2019;
2.客户端核心类(1)Configuration:配置对象类,用于加载或设置参数属性。 (2)FileSystem:文件系统对象基类,针对不同文件系统有不同的具体实现。此外,该类封装了文件系统的相关操作方法。
3.代码实现 3.1.使用IDEA创建一个Maven项目(1)点击Create New Project (2)选择Maven,点击Next
(3)根据自己的实际情况为自己的项目取名(Name和ArtifactId一般相同),然后点击Finish。
根据需要向pom.xml文件中添加以下依赖和插件(在< project >标签下)
org.apache.hadoop
hadoop-common
3.1.4
org.apache.hadoop
hadoop-client
3.1.4
org.apache.hadoop
hadoop-hdfs
3.1.4
junit
junit
4.13
org.apache.maven.plugins
maven-compiler-plugin
3.1
1.8
1.8
若是本地Maven仓库没有这些依赖和插件,则联网后会自动下载,然后按照下图所示,刷新项目。
创建一个名为HDFSClientTest类,然后编写代码即可。下面的代码主要从创建文件夹、上传文件以及下载文件这三个方面进行了测试。不过值得注意的是,在测试下载文件这一部分的时候,可能会出现这样的错误提示:java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset。 原因:Hadoop访问windows本地文件系统,要求Windows上的本地库能正常工作,其中Hadoop使用某些Windows API来实现类似posix的文件访问权限,而这些功能需要hadoop.dll和winutils.exe来实现。 解决办法:下载Hadoop源码在windows平台编译,编译出windows本地库。然后配置Hadoop环境变量。 使用这里提供的 《hadoop-3.1.4_winutils.zip》(提取码:hadp ),配置好之后重启IDEA即可。具体配置方法如下: 将下载的压缩包解压放在一个名称为英文的目录下(例如D盘的softwares目录),然后在电脑的环境变量中做如下配置:
HADOOP_HOME=D:\softwares\hadoop-3.1.4
path=;%HADOOP_HOME%\bin
检查方法:在windows中的命令行模式下,输入命令hadoop,然后回车,如果出现以下结果,则说明配置成功。 具体代码如下:
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;
//初始化方法,用于和HDFS集群建立连接
@Before
public void connect2HDFS() throws IOException {
//设置客户端的身份,以用于和HDFS集群建立连接
System.setProperty("HADOOP_USER_NAME","root");
//创建配置对象
conf = new Configuration();
//设置操作的文件系统时HDFS,并且指定HDFS操作地址
conf.set("fs.defaultFS","hdfs://node1.itcast.cn:8020");
//创建FileDSystem对象实例
fs = FileSystem.get(conf);
}
//测试:创建文件夹
@Test
public void mkdir() throws IOException {
//首先判断文件夹是否存在
if(!fs.exists(new Path("/itheima"))){
//创建文件夹
fs.mkdirs(new Path("/itheima"));
}
}
//测试:上传文件
@Test
public void putFile2HDFS() throws IOException {
//创建本地文件路径
Path src = new Path("E:\\testData\\1.txt");
Path dst = new Path("/it/1.txt");
//上传文件
fs.copyFromLocalFile(src,dst);
}
//测试:下载文件
@Test
public void getFile2Local() throws IOException {
//文件路径
Path src = new Path("/it/1.txt");
Path dst = new Path("E:\\");
//下载文件
fs.copyToLocalFile(src,dst);
}
//关闭客户端和HDFS的连接
@After
public void close(){
//首先判断文件系统实例是否为null
if(fs!=null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}