HDFS文件系統基本文件命令、編程讀寫HDFS

基本文件命令:html

格式爲:hadoop fs -cmd <args>java

cmd的命名一般與unix對應的命令名相同。例如,文件列表命令: hadoop fs -lsapache

一、添加目錄和文件編程

HDFS有一個默認的工做目錄 /user/$USER,其中$USER是你的登陸用戶名。不過目錄不會自動創建,咱們如今用mkdir創建它,我使用的是chen做爲用戶名。oop

hadoop fs -mkdir /user/chenspa

(hadoop的mkdir命令會自動建立父目錄,相似於帶-p的unix命令)unix

咱們如今放本地文件系統的一個文件進去。code

hadoop fs -put example.txt .htm

最後一個參數是句點,至關於放入了默認的工做目錄,等價於 hadoop fs -put example.txt /user/chen對象

當你把文件放入HDFS上後,你就能夠運行Hadoop程序來處理它。

二、檢索文件

get命令與put命令相反,它從HDFS複製文件回到本地文件系統。

hadoop fs -get example.txt .

複製到本地的當前工做目錄中。

另外一種是顯示數據,用cat

hadoop fs -cat example.txt

三、刪除文件

rm命令

hadoop fs -rm example.txt

也能夠用來刪除空目錄

編程讀寫HDFS

利用HDFS給咱們提供的API,咱們一樣能夠訪問它。

在Hadoop中用做文件操做的主類位於org.apache.hadoop.fs軟件包中。包括常見的open、read、write、close。Hadoop文件的API起點是FileSystem類,這是一個與文件系統交互的抽象類,咱們經過調用factory的方法FileSystem.get(Configuration conf)來取得所需的FileSystem實例,以下咱們能夠得到與HDFS接口的FileSystem對象:

Configuration conf = new Configuration();

FileSystem hdfs = FileSystem.get(conf);//得到HDFS的FileSystem對象

若是咱們要實現HDFS與本地文件系統的交互,咱們還須要獲取本地文件系統的FileSystem對象

FileSystem local = FileSystem.getLocal(conf);//得到本地文件系統的FileSystem對象

如下代碼講解了一個例子,咱們開發一個PutMerge程序,用於合併本地文件後放入HDFS,由於大文件HDFS處理起來比較容易,因此這個程序常常會在之後的開發中用到

 

import java.io.IOException;   
import org.apache.hadoop.conf.Configuration;   
import org.apache.hadoop.fs.FSDataInputStream;   
import org.apache.hadoop.fs.FSDataOutputStream;   
import org.apache.hadoop.fs.FileStatus;   
import org.apache.hadoop.fs.FileSystem;   
import org.apache.hadoop.fs.Path;   
public class PutMerge {   
    public static void main(String[] args) throws IOException {   
    Configuration conf = new Configuration();   
    FileSystem hdfs =FileSystem.get(conf); //得到HDFS文件系統的對象   
    FileSystem local = FileSystem.getLocal(conf);//得到本地文件系統的對象   
    Path inputDir = new Path(args[0]);//設定輸入目錄   
    Path hdfsFile = new Path(args[1]);//設定輸出目錄   
   try{   
       FileStatus[] inputFiles = local.listStatus(inputDir);//FileStatus的listStatus()方法得到一個目錄中的文件列表   
      FSDataOutputStream out = hdfs.create(hdfsFile);//生成HDFS輸出流   
      for(int i = 0; i < inputFiles.length; i ++){   
            System.out.println(inputFiles[i].getPath().getName());   
            FSDataInputStream in = local.open(inputFiles[i].getPath());//打開本地輸入流   
          byte[] buffer = new byte[256];   
            int bytesRead = 0;   
            while((bytesRead = in.read(buffer))>0){   
            out.write(buffer,0,bytesRead);//經過一個循環來寫入   
          }   
            in.close();   
         }   
         out.close();   
     }catch (IOException e) {   
           e.printStackTrace();   
     }   
 }

 

 

Hadoop:第一個程序操做HDFS

http://www.cnblogs.com/fora/archive/2011/07/20/2111870.html

相關文章
相關標籤/搜索