这篇文章先记录一下在java代码中对hdfs的基本操作。
打开eclipse,新建一个Map/Reduce工程。后台运行起hadoop。可以看到我的目录结构如下:
我新建了一个HdfsTest.java的类,我们就在这个类里面来实现对hdfs的基本操作。
1.hdfs上创建新文件
首先来看看利用hadoop的API如何创建新文件,主要代码如下:
public static void createFile(String dst,byte[] contents) throws IOException{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
Path dstPath = new Path(dst);
// 打开一个输出流
FSDataOutputStream outputStream = fs.create(dstPath);
outputStream.write(contents);
outputStream.close();
fs.close();
System.out.println("创建文件成功");
}
来看看那些对应的类是什么意思?(仅仅是简单描述,具体的可看官网API)
Configuration:配置类,生成配置对象。
FileSystem:文件系统的抽象类。
Path:看名字也就看得出来代表的是路径。
FSDataOutputStream:hadoop提供的输出流。
这里用到的主要的就是上面几个类,其实整个过程就是获取到hdfs上的路径,然后通过输出流的方式将数据给写入到hdfs中。除了类略有不同外,和java操作IO流时基本一样。
2.上传文件到hdfs
接下来是上传文件,同样先看看代码:
public static void uploadFile(String src,String dis) throws IOException{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
//原路径
Path srcPath = new Path(src);
//目标路径
Path disPath = new Path(dis);
fs.copyFromLocalFile(srcPath,disPath);
fs.copyFromLocalFile(true,srcPath,disPath);
//打印文件路径
System.out.println("上传的路径"+conf.get(fs.defaultFS));
//获取目录信息
FileStatus[] fileStatus = fs.listStatus(disPath);
for(FileStatus file:fileStatus){
System.out.println(file.getPath());
}
}
这代码和创建新文件的代码看上去差不多,其实也差不多。还是那么几个类,甚至还少了输出流,利用FileSystem对象的方法就能实现上传文件到hdfs。多出来的类如下:
FileStatus:该对象封装了文件系统中文件和目录的元数据,包括文件的长度、块大小、备份数、修改时间、所有者以及权限等信息。
3.hdfs上文件的删除
文件的删除操作如下:
public static void deleteFile(String filepath) throws IOException{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
Path path = new Path(filepath);
//当文件系统关闭时才真正删除此文件。
//boolean isok = fs.deleteOnExit(path);
//删除文件或目录,后面的boolean值是true,如果path是目录,则会递归删除下面的所有文件;如果path是文件,则false或true无所谓
boolean isok = fs.delete(path,true);
if(isok){
System.out.println("文件删除成功");
}else{
System.out.println("文件删除失败");
}
fs.close();
}
4.hdfs上目录的创建
代码如下:
public static void mkdir(String path) throws IOException{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
Path = path = new Path(path);
boolean isok = fs.mkdirs(path);
if(isok){
System.out.println("创建文件夹成功");
}else{
System.out.println("创建文件夹失败");
}
fs.close();
}
5.hdfs文件的读取
代码如下:
public static void readfile(String path) throws IOException{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
Path = path = new Path(path);
InputStream in = null;
try{
in = fs.open(path);
//读取到标准输出
IOUtils.copyBytes(in,System.out,4096,false);
}catch(IOException e){
e.printStackTrace();
}finally{
IOUtils.closeStream(in);
}
fs.close();
}
以上仅仅是写了些可能会常用的操作来熟悉用java操作hdfs文件系统。
下一篇记录一下关于hadoop中的mapreduce框架。