搭建好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