初学Hadoop,利用Junit对HDFS的基本操作做一个示例。
我的文件系统:
Eclipse中的项目截图:
java源码:
package com.lee.hadoop.junittest;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.vafer.jdeb.ant.Data;
public class HdfsTest {
private String path = "hdfs://192.168.41.28:9000/lee/test01";
private Configuration conf = null;
FileSystem fs = null;
/**
* 连接至文件系统
*/
@Before
public void linkToFileSystem() {
conf = new Configuration();// 配置文件在src下
try {
fs = FileSystem.get(conf);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("连接文件系统出错。。。");
e.printStackTrace();
}
}
/**
* 创建文件夹mk002
*
* @throws IOException
*/
@Test
public void makeDir() throws IOException {
fs.mkdirs(new Path(path + "/output01/mk001"));
}
/**
* 创建文件
*
* @throws IOException
*/
@Test
public void createdFile() throws IOException {
String str = "Hello World";
fs.create(new Path(path + "/output01/a.txt")).writeBytes(str);
}
/**
* 文件的从命名
*
* @throws IOException
*/
@Test
public void renameFile() throws IOException {
// a.txt重命名为b.txt
fs.rename(new Path(path + "/output01/a.txt"), new Path(path
+ "/output01/b.txt"));
}
/**
* 获取文件最后修改时间
*
* @throws IOException
*/
@Test
public void lastWriteTime() throws IOException {
long lestWriteTime = fs.getFileStatus(
new Path(path + "/output01/b.txt")).getModificationTime();
System.out.println(lestWriteTime);
}
/**
* 从本地上传文件至文件系统
*
* @throws IOException
*/
@Test
public void copyFile() throws IOException {
fs.copyFromLocalFile(new Path("C:/Users/man/Desktop/b.txt"), new Path(
path + "/output01/mk001/"));
}
/**
* 查找文件在HDFS中的物理位置,即文件所存储在的节点
*
* @throws IOException
*/
@Test
public void serchFile() throws IOException {
BlockLocation[] blockLocation = fs.getFileBlockLocations(fs
.getFileStatus(new Path(path + "/output01/mk001/b.txt")), 0, fs
.getFileStatus(new Path(path + "/output01/mk001/b.txt"))
.getLen());
for (BlockLocation b : blockLocation) {
String[] host = b.getHosts();
for (String str : host)
System.out.println(str);
}
}
/**
* 获取集群中的所有的节点名称
*
* @throws IOException
*/
@Test
public void findHostName() throws IOException {
DistributedFileSystem dfs = (DistributedFileSystem) fs;
DatanodeInfo[] datanodeStatus = dfs.getDataNodeStats();
String[] name = new String[datanodeStatus.length];
for (int i = 0; i < datanodeStatus.length; i++) {
name[i] = datanodeStatus[i].getHostName();
System.out.println(name[i]);
}
}
/**
* 清理以上测试产生的垃圾
* 1.判断文件及文件夹是否存在
* 2.删除文件或问价夹
*
* @throws IOException
*/
@Test
public void clearTestFileSystem() throws IOException {
// 判断问价b.txt是否存在,存在则删除
if (fs.exists(new Path(path + "/output01/mk001/b.txt"))) {
System.out.println("文件b.txt存在,现在清除。。。");
fs.delete(new Path(path + "/output01/mk001/b.txt"), false);
} else {
System.out.println("文件b.txt不存在。。。");
}
// 判断文件夹mk002是否存在,存在则删除
if (fs.exists(new Path(path + "/output01/mk002"))) {
fs.delete(new Path(path + "/output01/mk002"), false);
}
}
/**
* 关闭连接
*/
@After
public void closeFileSystem() {
try {
// System.out.println("关闭文件系统。。。");
fs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("文件系统未能正常关闭。。。");
e.printStackTrace();
}
}
}