1、创建Maven项目
2、修改pom.xml文件
<dependencies><!-- Hadoop所需依赖包 --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.7.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.0</version></dependency><!-- junit测试依赖,因为我只想测试HDFS是否能正常使用 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
</dependencies>
3、添加四个配置文件
为避免运行的一些错误,我们将Hadoop的四个重要配置文件添加到resources中
4、创建测试文件JavaAPI
5、初始化
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;public class JavaAPI {// 可操作HDFS文件系统的对象FileSystem hdfs = null;// 测试方法执行前执行,用于初始化操作,避免频繁初始化@Beforepublic void init() throws IOException {// 构造一个配置参数对象,设置一个参数:要访问的HDFS的URIConfiguration conf = new Configuration();// 指定使用HDFS访问conf.set("fs.defaultFS","hdfs://localhost:9000");// 进行客户端身份的设置(root为虚拟机的用户名,hadoop集群节点的其中一个都可以)System.setProperty("HADOOP_USER_NAME","root");// 通过FileSystem的静态get()方法获取HDFS文件系统客户端对象hdfs = FileSystem.get(conf);}// 测试方法执行后执行,用于处理结尾的操作,关闭对象@Afterpublic void close() throws IOException {// 关闭文件操作对象hdfs.close();}
}
因为对文件的操作我们都需要获取hdfs对象和关闭对象,所以为避免重复编写,将两个操作对立成单独方法,分别在文件相应操作执行前和执行后执行。
这里"hdfs://localhost:9000"
对应core-site.xml的配置
6、文件操作
可以在浏览器访问http://localhost:50070/,点击Browse the file system 查看HDFS文件系统的目录
文件上传
我提前在本地E:\hadoop下创建一个HDFSTest.txt文件
// 上传文件到HDFS文件系统@Testpublic void testUploadFileToHDFS() throws IOException {// 待上传的文件路径(windows)Path src = new Path("E:/hadoop/HDFSTest.txt");// 上传之后存放的路径(HDFS)Path dst = new Path("/HDFSTest.txt");// 上传hdfs.copyFromLocalFile(src, dst);System.out.println("上传成功");}
文件下载
// 从HDFS下载文件到本地@Testpublic void testDownFileToLocal() throws IOException {// 待下载的路径(HDFS)Path src = new Path("/HDFSTest.txt");// 下载成功之后存放的路径(windows)Path dst = new Path("E:/hadoop/HDFSTest1.txt");// 下载hdfs.copyToLocalFile(false,src,dst,true);System.out.println("下载成功");}
创建目录
// 创建目录@Testpublic void testMkdirFile() throws IOException {// 待创建目录路径Path src = new Path("/HDFS");// 创建目录hdfs.mkdirs(src);System.out.println("创建成功");}
目录重命名
// 重命名@Testpublic void testRenameFile() throws IOException {// 重命名之前的名字Path src = new Path("/HDFS");// 重命名之后的名字Path dst = new Path("/HDFS1");// 重命名hdfs.rename(src,dst);System.out.println("重命名成功");}
删除目录
// 删除目录@Testpublic void testDeleteFile() throws IOException {// 待删除目录路径(HDFS)Path src = new Path("/HDFS1");// 删除hdfs.delete(src, true);System.out.println("删除成功");}
查看文件信息
// 查看HDFS目录中的文件信息@Testpublic void testCheckFile() throws IOException {// 获取迭代器对象("/"表示获取全部目录下的文件)RemoteIterator<LocatedFileStatus> listFiles = hdfs.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());// 获取该文件块的信息(包含长度,数据块,DataNodes的信息)BlockLocation[] blockLocations = fileStatus.getBlockLocations();for (BlockLocation bl : blockLocations) {System.out.println("block-length:" + bl.getLength());System.out.println("block-offset:" + bl.getOffset());// 获取DataNodes的主机名String[] hosts = bl.getHosts();for (String host : hosts) {System.out.println(host);}}System.out.println("-----------------分割线-----------------");}}