Hadoop FileSystem常用API的使用

搭建好Hadoo的运行环境之后,我们可以使用eclipse,尝试使用FileSystem的API对HDFS进行文件和文件夹的操作。以下代码对FileSystem常用API进行了实践,使用Junit进行API的测试

首先是创建一个普通的Java工程,并把Hadoop所依赖的包导入,主要包括hadoop/lib和hadoop的core包

项目目录如下:



测试用例代码:

package com.chen.hdfs.test;

import java.io.IOException;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;

public class TestUtils{

	private static String hdfsURI = "hdfs://localhost:9000";
	private static FileSystem hdfs = null;
	
	static {
		// 获取配置信息
		Configuration conf = new Configuration();
		/**
		 * 注:如不对fs.default.name进行设置,将会报出
		 * java.io.FileNotFoundException: /tt.txt (Permission denied)异常
		 * */
		// conf.set("fs.default.name", "hdfs://localhost:9000");
		try {
			// 获取hdfs操作句柄
			// hdfs = FileSystem.get(conf)
			hdfs = FileSystem.get(URI.create(hdfsURI), conf);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 在hdfs上创建文件
	 * */
	@Test
	public void createFile() throws Exception {

		// 设置上传文件的路径
		Path file = new Path("/t1.txt");
		FSDataOutputStream outStream = hdfs.create(file);
		outStream.write("Hello, Hadoop1".getBytes());
		IOUtils.closeStream(outStream);
		System.out.println("创建t1.txt文件成功!");
	}
	
	/**
	 * 对hdfs上的文件进行重命名
	 * */
	@Test
	public void renameFile() throws Exception {
	
		Path oldFile = new Path("/t1.txt");
		Path newFile = new Path("/tt.txt");
		boolean flag = hdfs.rename(oldFile, newFile);
		System.out.println(flag?"文件重命名成功!":"文件重命名失败!");
	}
	
	/**
	 * 对hdfs上的文件进行删除
	 * */
	@Test
	public void deleteFile() throws Exception {
		
		Path file = new Path("/tt.txt");
		boolean flag = hdfs.delete(file, false);
		System.out.println(flag?"文件删除成功!":"文件删除失败!");
		
	}
	
	/**
	 * 在hdfs上创建目录
	 * @throws Exception 
	 * **/
	
	@Test
	public void mkdirs() throws Exception{
		
		Path path = new Path("/test");
		boolean flag = hdfs.mkdirs(path);
		System.out.println(flag?"创建test目录成功!":"创建test目录失败!");
		
	}
	
	/**
	 * 对hdfs上的文件夹进行重命名
	 * */
	@Test
	public void renameFolder() throws Exception{
		
		Path oldPath = new Path("/test");
		Path newPath = new Path("/test1");
		boolean flag = hdfs.rename(oldPath, newPath);
		System.out.println(flag?"重命名test目录成功!":"重命名test目录失败!");
	}
	
	/**
	 * 对hdfs上的文件夹进行删除
	 * */
	@Test
	public void deleteFolder() throws Exception {
		
		Path folder = new Path("/test1");
		boolean flag = hdfs.delete(folder, true);
		System.out.println(flag?"文件夹删除成功!":"文件夹删除失败!");
		
	}
	
	/**
	 * 上传本地文件到hdfs
	 * */
	@Test
	public void copyFromLocalFile() throws Exception {
		
		// 设置本地文件的路径
		Path src = new Path("/home/chenpz/practice/test.txt");
		// 设置上传文件的路径
		Path dst = new Path("/");
		// 上传本地文件
		hdfs.copyFromLocalFile(src, dst);
		System.out.println("上传成功!");
	}
	
	
	/**
	 * 从hdfs上取文件到本地
	 * */
	@Test
	public void copyToLocalFile() throws Exception {
		// 本地文件路径
		Path dst = new Path("/home/chenpz/practice/t1.txt");
		// hdfs上文件的路径
		Path src = new Path("/t1.txt"); 
		hdfs.copyToLocalFile(src, dst);
		System.out.println("从hdfs上取文件到本地成功!");
	}
	
	/**
	 * 判断文件或文件夹是否存在
	 * */
	@Test
	public void fileIsExists() throws Exception {
                // Path filePath = new Path("/t1.txt");
		Path filePath = new Path("/test");
		boolean flag = hdfs.exists(filePath);
		System.out.println(flag?"文件存在!":"文件不存在!");
	}
	
	
	/**
	 * 获取hdfs某目录下的文件列表
	 * */
	@Test
	public void getFileList() throws Exception {
		
		Path filePath = new Path("/");
		FileStatus[] fileStatus = hdfs.listStatus(filePath);
		
		for(int i = 0; i < fileStatus.length; i ++){
			System.out.println(fileStatus[i].getPath().toString());
		}
	}
	
	/**
	 * 查看hdfs文件的最后修改时间
	 * */
	@Test
	public void getModifyTime() throws Exception {
		Path file = new Path("/t1.txt");
		FileStatus fileStatus = hdfs.getFileStatus(file);
		Date date = new Date(fileStatus.getModificationTime());
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("t1.txt修改时间:"+format.format(date));
	}
	
	
	/**
	 * 查找hdfs某个文件在集群中的位置
	 * */
	@Test
	public void getFileLocation() throws Exception {
		
		Path filePath = new Path("/t1.txt");
		FileStatus fileStatus = hdfs.getFileStatus(filePath);
		BlockLocation[] blockLocation = hdfs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
		for(int i = 0; i < blockLocation.length; i ++){
			String[] hosts = blockLocation[i].getHosts();
			System.out.println("block_"+i+"_location:"+hosts[0]);
		}
		
	}
}

本次环境为Linux


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值