Java API操作HDFS

这篇博客介绍了如何在Windows环境下,不配置Hadoop环境变量,通过Java API实现HDFS文件系统的操作,包括上传本地文件到HDFS、从HDFS下载文件、创建删除及重命名目录,以及查看目录文件详情。文章提供了详细的步骤和代码示例,适合初学者参考。
摘要由CSDN通过智能技术生成

 一、问题介绍

 1、基于HDFS 的Java API实现如下功能:(1)本地文件上传到HDFS;(2)从HDFS中下载文件到本地系统;(3)HDFS中目录的创建、删除、重命名;(4)查看目录中所有文件的详细信息。

二、步骤

准备:

在win系统下不配置hadoop环境,直接运行代码会报错,显示缺少winutils.exe 和 hadoop.dll 两个文件

1-将hadoop-win-2.7.7文件夹拷贝到一个没有中文的路径中;
2-在windows系统,配置hadoop的环境变量: HADOOP_HOME,并将%HADOOP_HOME%\bin添加到path中

3-:把hadoop-win-2.7.7文件夹中bin目录下的hadoop.dll 放到系统盘: C:Windows \System32目录下

4-关闭windows重启
下载地址

提取码:8o47 

1. 搭建项目环境

  创建一个项目名为“HadoopDemo”,包名为“com.itcast”的Maven项目,并在项目的pom.xml文件中引入hadoop-common、hadoop-hdfs、hadoop-client以及单元测试junit的依赖。

依赖pom.xml

 <dependencies> 
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.7.7</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>2.7.7</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.7.7</version>
    </dependency>
</dependencies> 

2. 初始化客户端对象

  首先在项目src文件夹下创建com.itcast.hdfsdemo包,并在该包下创建HDFS_CRUD.java文件,编写Java测试类,构建Configuration和FileSystem对象,初始化一个客户端实例进行相应的操作

3. 上传文件到HDFS

  由于采用Java测试类来实现JavaApi对HDFS的操作,因此可以在HDFS_CRUD.java文件中添加一个testAddFileToHdfs()方法来演示本地文件上传到HDFS的示例。

4. 从HDFS下载文件到本地

  在HDFS_CRUD.java文件中添加一个testDownloadFileToLocal()方法,来实现从HDFS中下载文件到本地系统的功能。

5. 目录操作

  在HDFS_CRUD.java文件添加一个testMkdirAndDeleteAndRename()方法,实现目录的创建、删除、重命名的功能。

6. 查看目录中的文件信息

在HDFS_CRUD.java文件中添加一个testListFiles()方法,实现查看目录中所有文件的详细信息的功能。

完整代码

package com.itheima.hdfsdemo;

import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Before;
import org.junit.Test;

public class HDFS_CRUD {
	
	FileSystem fs = null;
	
	@Before // 此注解可以保证init方法在程序中最先执行
	public void init() throws IOException{
		// 构造一个配置参数对象,设置一个参数:要访问的hdfs的uri
		Configuration conf = new Configuration();
		// 这里指定使用的是hdfs
		conf.set("fs.defaultFS", "hdfs://hadoop01:9000");// 此处使用主机名需要配置windows的host文件
		// 通过如下的方式进行客户端身份的设置
		System.setProperty("HADOOP_USER_NAME", "root");
		// 通过FileSystem的静态方法获取文件系统客户端对象
		fs = FileSystem.get(conf);
	}
	// 上传文件到hdfs
	@Test
	public void testAddFileToHdfs() throws IOException {
		
		// 要上传的文件所在的路径
		Path src = new Path("F:\\test.txt");
		// 要上传到hdfs的目标路径
		Path dst = new Path("/testFile"); // 一定注意此处的testFile就是上传到hdfs的文件的名字而不是文件夹
		// 上传
		fs.copyFromLocalFile(src, dst);
		//关闭资源
		fs.close();
	}
	// 从hdfs 中复制文件到本地文件系统
	@Test
	public void testDownloadFileToLocal() throws IOException {
		// 下载文件
		Path src = new Path("/testFile");
		Path dst = new Path("F:/");
		fs.copyToLocalFile(false,src, dst,true);
		
		// 关闭资源
		fs.close();
	}
	// 创建,删除,重命名文件
	@Test
	public void testMkdirAndDeleteAndRename() throws Exception {
		// 创建目录
		fs.mkdirs(new Path("/a/b/c"));
		fs.mkdirs(new Path("/a2/b2/c2"));
		
		// 重命名文件或文件夹
		 fs.rename(new Path("/a"), new Path("/a3"));
		
		// 删除文件夹,如果是非空文件夹,参数2必须给值为true
		// fs.delete(new Path("/a2"),true);
	}

	@Test
	public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException{
		// 获取迭代器对象
		RemoteIterator<LocatedFileStatus> listFiles = fs.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());
			// 获取该文件块信息(包括长度,数据块,datanode的信息)
			BlockLocation[] blockLocations = fileStatus.getBlockLocations();
			
			for (BlockLocation bl : blockLocations) {
				System.out.println("block-length:"+bl.getLength()+" -- "+"block-offset:"+bl.getOffset());
				String[] hosts = bl.getHosts();
				
				for (String host : hosts) {
					System.out.println(host);
				}
			}
			System.out.println("--------------分割线---------");
		}
	}
}

三、结果 

 

  • 8
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值