如果还没有配置好Hadoop的可以点击链接查看如何配置
各大技术基础教学、实战开发教学(正在持续更新中······)
首先,启动Hadoop集群服务
然后在浏览器访问Hadoop,点击Browse the file system 查看HDFS文件系统的目录
可以看到目前HDFS文件系统的目录是空的,没有任何的文件和文件夹,下面开始今天的API操作
首先,打开IDEA,点击新建项目,在左侧中选择Maven,然后直接点击next
设置项目名称,点击Finish
点击右下角的 Enable Auto-Import(自动导入Jar包文件),一个空的Maven项目就创建完毕啦
首先编辑pom.xml(Maven项目的核心文件)文件,添加如下内容,导入依赖(所需jar包)
<dependencies> <!-- Hadoop所需依赖包 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.4</version> </dependency> <!-- junit测试依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
IDEA会自动保存文件并且导入依赖包,点击右侧的Maven,展开Dependencies,可以看到四个依赖包以及导入进来了
我们通过junit来进行测试,首先创建一个类,添加如下内容
public class JavaAPI { // 可操作HDFS文件系统的对象 FileSystem hdfs = null; // 测试方法执行前执行,用于初始化操作,避免频繁初始化 @Before public void init() throws IOException { // 构造一个配置参数对象,设置一个参数:要访问的HDFS的URI Configuration conf = new Configuration(); // 指定使用HDFS访问 conf.set("fs.defaultFS","hdfs://hadoop01:9000"); // 进行客户端身份的设置(root为虚拟机的用户名,hadoop集群节点的其中一个都可以) System.setProperty("HADOOP_USER_NAME","root"); // 通过FileSystem的静态get()方法获取HDFS文件系统客户端对象 hdfs = FileSystem.get(conf); } // 测试方法执行后执行,用于处理结尾的操作,关闭对象 @After public void close() throws IOException { // 关闭文件操作对象 hdfs.close(); } }
注意,上面代码中的参数"hdfs://hadoop01:9000"是hadoop配置文件中core-site.xml的配置信息,不记得的可以翻看我以往的hadoop配置文章
(1)上传文件到HDFS文件系统
@Test public void testUploadFileToHDFS() throws IOException { // 待上传的文件路径(windows) Path src = new Path("F:/HDFS/test.txt"); // 上传之后存放的路径(HDFS) Path dst = new Path("/test.txt"); // 上传 hdfs.copyFromLocalFile(src,dst); System.out.println("上传成功"); }
我在F盘的HDFS文件夹下面创建了个test.txt文本
运行一下测试方法,文件上传成功了
(2)从HDFS下载文件到本地
@Test public void testDownFileToLocal() throws IOException { // 待下载的路径(HDFS) Path src = new Path("/test.txt"); // 下载成功之后存放的路径(windows) Path dst = new Path("F:/HDFS/test1.txt"); // 下载 hdfs.copyToLocalFile(false,src,dst,true); ystem.out.println("下载成功"); }
运行一下,下载成功
(3)创建目录
@Test public void testMkdirFile() throws IOException { // 待创建目录路径 Path src = new Path("/HDFS"); // 创建目录 hdfs.mkdirs(src); System.out.println("创建成功"); }
运行测试方法,创建成功
(4)重命名
@Test public void testRenameFile() throws IOException { // 重命名之前的名字 Path src = new Path("/HDFS"); // 重命名之后的名字 Path dst = new Path("/HDFS1"); // 重命名 hdfs.rename(src,dst); System.out.println("重命名成功"); }
运行测试方法,重命名成功
(5)删除目录
@Test public void testDeleteFile() throws IOException { // 待删除目录路径(HDFS) Path src = new Path("/HDFS1"); // 删除 hdfs.delete(src,true); System.out.println("删除成功"); }
运行测试方法,成功删除了HDFS1目录
(6)查看HDFS目录中的文件信息
为了方便查看,多创建几个文件
@Test public 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("-----------------分割线-----------------"); } }
运行测试方法