這篇文章先記錄一下在java代碼中對hdfs的基本操作。
打開eclipse,新建一個Map/Reduce工程。后臺運行起hadoop。可以看到我的目錄結構如下:
eclipse中的目錄
我新建了一個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框架。