上文中本人是通过Hadoop的eclipse插件来管理HDFS文件系统的,在实际生产环境通常是用编程的方式来管理hadoop的文件系统

下面我们编程方式开发一个管理hadoop文件系统的应用

首先打开eclipse开发工具,新建Map/Reduce Project项目

Hadoop1.2.0开发笔记(七)_重命名

点击Next,填写项目名称,并且配置hadoop安装目录

Hadoop1.2.0开发笔记(七)_文件系统_02

新建立的项目会自动导入hadoop的相关依赖jar文件,不必我们手动添加了

Hadoop1.2.0开发笔记(七)_hdfs_03

接下来我们调用hadoop文件系统的API来执行文件操作,我们先建立一个文件管理工具类



public class HDFSUtil {

/**
* 从本地复制文件到HDFS
* @param srcFilePath
* @param dstFilePath
* @throws IOException
*/
public static void copyFile2HDFS(String srcFilePath,String dstFilePath){
Configuration conf = new Configuration();

Path src = new Path(srcFilePath);
Path dst = new Path(dstFilePath);

FileSystem hdfs=null;
try {
hdfs = FileSystem.get(conf);
hdfs.copyFromLocalFile(src, dst);
FileStatus[] files = hdfs.listStatus(dst);
if(files!=null) {
for(int i=0;i<files.length;i++) {
System.out.println("the file is:"+files[i].getPath().getName());
}
}else {
System.out.println("no files");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
hdfs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
* 在HDFS上创建文件
* @param content
* @param dstFile
* @throws IOException
*/
public static void createFileInHDFS(String content,String dstFile) {
Configuration conf = new Configuration();
//conf.addResource(new Path("/home/chenying/hadoop-1.2.0/conf/core-site.xml"));
Path dst = new Path(dstFile);
FileSystem hdfs = null;
FSDataOutputStream out = null;
try {
hdfs=FileSystem.get(conf);
out = hdfs.create(dst);
// out.writeBytes(content);
out.write(content.getBytes("UTF-8"));
out.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(hdfs != null) {
try {
hdfs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 在HDFS上创建目录
* @param content
* @param dstFile
* @throws IOException
*/
public static void createDirectoryInHDFS(String dstDir) {
Configuration conf = new Configuration();
Path dst = new Path(dstDir);
FileSystem hdfs = null;
try {
hdfs=FileSystem.get(conf);
hdfs.mkdirs(dst);
} catch (IOException e) {
e.printStackTrace();
//throw new IOException(e);
}finally {
if(hdfs != null) {
try {
hdfs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

/**
* 重命名文件
* @param originalFile
* @param newFile
* @throws IOException
*/
public static void renameFileInHDFS(String originalFile,String newFile) {
Configuration conf = new Configuration();
Path originalPath = new Path(originalFile);
Path newPath = new Path(newFile);
FileSystem hdfs=null;
try {
//hdfs = newPath.getFileSystem(conf);
hdfs =FileSystem.get(conf);
boolean isRename=hdfs.rename(originalPath, newPath);
String result=isRename?"成功":"失败";
System.out.println("文件重命名结果为:"+result);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
hdfs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
* 获得文件的最后修改时间
* @param dstFile
* @throws IOException
*/
public static void getFileLastModifyTime(String dstFile) {
Configuration conf = new Configuration();
Path dstPath = new Path(dstFile);
FileSystem hdfs=null;
try {
//hdfs = dstPath.getFileSystem(conf);
hdfs =FileSystem.get(conf);
FileStatus file = hdfs.getFileStatus(dstPath);
long time = file.getModificationTime();
System.out.println("the last modify time is : "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time)));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
hdfs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
* 检查文件是否存在
* @param dstFile
* @throws IOException
*/
public static void checkFileIsExists(String dstFile) {
Configuration conf = new Configuration();
Path dstPath = new Path(dstFile);
FileSystem hdfs=null;
try {
//hdfs = dstPath.getFileSystem(conf);
hdfs =FileSystem.get(conf);
boolean flag = hdfs.exists(dstPath);
System.out.println("is the file exists:"+flag);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
hdfs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
* 获得文件的存放位置
* @param dstFile
* @throws IOException
*/
public static void getFileLocations(String dstFile){
Configuration conf = new Configuration();
Path dstPath = new Path(dstFile);
FileSystem hdfs=null;
try {
//hdfs = dstPath.getFileSystem(conf);
hdfs =FileSystem.get(conf);
FileStatus file = hdfs.getFileStatus(dstPath);
BlockLocation[] blkLocations = hdfs.getFileBlockLocations(file, 0, file.getLen());
if(blkLocations != null) {
int len = blkLocations.length;
for(int i=0;i<len;i++) {
String[] hosts = blkLocations[i].getHosts();
for(String host:hosts) {
System.out.println("the location'host is : "+host);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
hdfs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
* 删除文件
* @throws IOException
*/
public static void deleteFile(String dstFile){
Configuration conf = new Configuration();
Path dstPath = new Path(dstFile);
FileSystem hdfs=null;
try {
//hdfs = dstPath.getFileSystem(conf);
hdfs =FileSystem.get(conf);
boolean flag = hdfs.delete(dstPath, true);////如果是目录则递归删除
System.out.println("is deleted : "+flag);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
hdfs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


(如果你愿意折腾,可以尝试将上面的方法改造成接口回调,本人就不做这个无谓的折腾了)

如果遇到Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs expected: file:///之类的异常,需要将${hadoop.root}/conf/目录的hadoop配置文件core-site.xml、hdfs-site.xml、mapred-site.xml拷贝到eclipse项目的bin目录里面

下面是测试类



public class HdfsClient {

/**
* 上传文件
* @throws IOException
*/
@Test
public void testCopyFile2HDFS() throws IOException {
String srcFilePath = "/home/chenying/FetchTask.java";
String dstFilePath = "hdfs://localhost:9000/user/coder/in";
HDFSUtil.copyFile2HDFS(srcFilePath, dstFilePath);
}
/**
* 创建文件
*/
@Test
public void testCreateFileInHDFS() {
String content = "hey,Hadoop. 测试中文";
String dstFile = "hdfs://localhost:9000/user/coder/input/hey";
HDFSUtil.createFileInHDFS(content, dstFile);
}
/**
* 重命名文件
*/
@Test
public void testRenameFileInHDFS() {
String originalFile = "hdfs://localhost:9000/user/coder/input/hey";
String newFile = "hdfs://localhost:9000/user/coder/input/hey_hadoop";
HDFSUtil.renameFileInHDFS(originalFile, newFile);
}
/**
* 获取文件的最后修改时间
*/
@Test
public void testGetFileLastModifyTimme() {
String dstFile = "hdfs://localhost:9000/user/coder/input/hey_hadoop";
HDFSUtil.getFileLastModifyTime(dstFile);
}
/**
* 检查文件是否存在
*/
@Test
public void testCheckFileIsExists() {
String dstFile = "hdfs://localhost:9000/user/coder/input/hey_hadoop";
HDFSUtil.checkFileIsExists(dstFile);
}
/**
* 获取文件的存放位置
*/
@Test
public void testGetFileLocations() {
String dstFile = "hdfs://localhost:9000/user/coder/input/hey_hadoop";
HDFSUtil.getFileLocations(dstFile);
}
/**
* 删除文件
*/
@Test
public void testDeleteFile(){
String dstFile = "hdfs://localhost:9000/user/coder/output";
HDFSUtil.deleteFile(dstFile);
}

}


运行该测试类,正常情况下,上面的测试用例会显示绿色

后面部分,本人打算采用HDFS开发一个图片服务器 

---------------------------------------------------------------------------