hadoop筆記3--hdfs操作

這篇文章先記錄一下在java代碼中對hdfs的基本操作。

打開eclipse,新建一個Map/Reduce工程。后臺運行起hadoop??梢钥吹轿业哪夸浗Y構如下:

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框架

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 當數據量增大到超出了單個物理計算機存儲容量時,有必要把它分開存儲在多個不同的計算機中。那些管理存儲在多個網絡互連的...
    單行線的旋律閱讀 1,958評論 0 7
  • 先思考問題 我們處在一個大數據的時代已經是不爭的事實,這主要表現在數據源多且大,如互聯網數據,人們也認識到數據里往...
    墻角兒的花閱讀 7,422評論 0 9
  • 之前的有點忘記了,這里在云筆記拿出來再玩玩.看不懂的可以留言 大家可以嘗試下Ambari來配置Hadoop的相關環...
    HT_Jonson閱讀 3,019評論 0 50
  • 南方天氣涼了,北方天氣冷了,名正言順吃火鍋的季節已然來臨。但如果吃炭火火鍋的話,記得要保持室內通風,要是CO中毒,...
    丘岸閱讀 230評論 0 1
  • 最近有個日志收集監控的項目采用的技術棧是ELK+JAVA+Spring,客戶端語言使用的是Java,以后有機會的話...
    三劫散仙閱讀 4,780評論 1 1