2.HDFS操作

1. 使用命令行操作
 1)4個通用命令行
  <1>archive 歸檔文件的創建
  用途:
    由於hadoop的設計是爲了處理大數據,理想的數據應該blocksize的倍數。namenode在啓動時會將所有的元數據load到內存中
   當大量小於blocksize的文件存在的時候,,不僅佔用了大量的存儲空間,也佔用了大量的namenode內存。
   archive可以將多個小文件打包成一個大文件進行存儲,並且打包後的文件仍然可以通過mapreduce來操作,因爲
   打包後的文件由索引和存儲兩大部分組成,索引部分記錄了原有的目錄結構和文件狀態。
  用法:
   hadoop archive -archiveName test.har -p /A/B /E/F /G/G1 /home
   -archiveName test.har表示指定歸檔文件的名稱(har爲後綴名),-p指定要打包文件的路徑,可以有多個,
   最後的參數表示歸檔文件放在哪(相對路徑)
  示例:
   hadoop archive -archiveName ins.har -p hdfs://192.168.80.11:9000/user.hadoop/in in
   運行發現,也是用的mapreduce
  <2>distcp 分佈式複製
  用途:
   在相同的文件系統中並行的複製文件,且必須是相同版本。
   如果版本不一致,使用hdfs會產生錯誤,因爲rpc不兼容,這時候可以使用基於HTTP協議的hftp協議,
   但目標仍然得是hdfs的:
   hadoop distcp hftp://namenode:50070/user/hadoop/input hdfs://namenode:9000/user/hadoop/input1
   也可使用webhdfs,源地址和目標地址都可以使用webhdfs,可以完全兼容
   hadoop distcp webhdfs://namenode:50070/user/hadoop/input webhdfs://namenode:50070/user/hadoop/input1 
  用法:
   hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
   把第一個集羣中的foo目錄中的內容複製到第二個集羣的bar目錄下,如果bar不存在,則會新建一個。
   可以指定多個源路徑,源路徑必須是絕對路徑。
   默認情況下,distcp會跳過目標路徑已經存在的文件,但可以通過-overwrite選項進行覆蓋,
   也可以使用-updata來選擇只更新哪些修改過的文件。
   distcp會將一大堆文件平均分攤開交給map去執行,每個文件單獨一個map。如果總大小小於256M,
   distcp只會分配一個map。但如果平分的結果出現map和超過20的情況,每個節點的map數就會按20算。
   可以使用-m講maps設置的大一些。
   <3>jar
   用途:
    運行一個內含hadoop運行代碼的jar文件
   示例:
    hadoop jar jar包名字 主類方法 參數
    如:
    hadoop jar sample.jar mainmethod args
   <4>fs
   用途:
    運行一個常規的文件基本命令
    
    
  2)18個常用的基本命令的操作
   格式爲:hadoop fs -cmd <agrs>,可以使用hadoop fs -help來獲取幫助
   <1>-cat
   用途: 將路經指定的文件輸出到屏幕
   示例: hadoop fs -cat URI
   <2>-copyFromLocal
   用途: 將本地文件複製到HDFS中
   示例:hadoop fs -copyFromLocal localURI
   <3>-copyToLocal
   用途:將一個文件從HDFS中複製到本地文件
   示例:hadoop fs -copyToLocal localURI
   <4>-cp
   用途:將文件從原路徑複製到目標路徑,原路徑可以有多個,目標路徑只有一個
   示例:
   hadoop fs -cp /user/file /user/files
   hadoop fs -cp /user/file1 /user/file2 /user/files
   <5>-du
   用途:不指定具體文件只指定目錄時,顯示目錄下文各件的大小;指定了某個具體目錄,顯示該目錄下所有文件的大小
      什麼都不指定時,顯示HDFS所有文件大小
   示例:hadoop fs -du URI
   <6>-dus
   用途:顯示目標文件或者目錄的大小
   示例:hadoop fs -dus 或者
   hadoop fs -dus hdfs://master:9000/user/hadoop/in
   <7>-expunge
   用途:清空回收站
   示例:hadoop fs -expunge
   <8>-get
   用途:複製文件到本地文件系統
   示例:hadoop fs -get hdfs://master:9000/user/hadoop/in/ins /home/hadoop/
   <9>-ls
   用途:遍歷,如果是一個目錄,返回其子文件的一個列表
   示例:hadoop fs -ls返回文件相同中的所有文件夾列表
   hadoop fs -ls hdfs://master:9000/user/hadoop/in返回in文件夾下所有文件和文件夾
   <10>-lsr
   用途:遞歸的查閱文件
   示例:hadoop fs -lsr展示文件系統中所有的文件列表
   <11>-mkdir
   用途:創建文件夾,如果父母路不存在,則一起創建父目錄
   示例:hadoop fs -mkdir hdfs://master:9000/user/hadopp/in2
   <12>-mv
   用途:同一個文件系統中移動文件,目標可以有多個
   示例:hadoop fs -mv src target
   <13>-put
   用途:從本地文件系統複製單個或者多個路徑到目標文件系統
   示例:hadoop fs -put localfile hdfs://master:9000/user/hadoop/in
   hadoop fs -put /home/hadoop/jdk1.6.0_24/ hdfs://master:9000/user/hadoop/in
   <14>-rm
   用途:刪除指定的文件,要求非空的目錄和文件
   示例:hadoop fs -rm URI
   <15>-rmr
   用途:遞歸的刪除指定目錄及其子文件
   示例:hadoop fs -rmr URI
   <16>-setrep
   用途:改變一個文件副本數
   示例:hadoop fs -setrep -w 3 -R hdfs://master:9000/uer/hadoop/in/ins
   <17>-test
   用途:使用ezd對文件進行檢查
   示例:-e檢查文件是否存在,若存在返回0
      -z檢查文件是否是0字節,如果是,返回0
      -d檢查路徑是否是目錄,是返回1,否返回0
   <18>-text
   用途:將原文件輸出爲文本格式,運行格式爲zip或者Text類
   示例:hadoop fs -text srcfile
   
   *上述HDFS中的文件路徑可以直接寫/user/hadoop/in/ins,省略前面的hdfs://192.68.80.11:9000,
   因爲已經在core-site.xml中定義過了。
   
2.使用web瀏覽器瀏覽HDFS文件
 瀏覽器輸入http://192.168.80.11:50070即可查看HDFS的相關信息和日誌
 
3.使用FileSystem API來操作HDFS文件
 1)讀取HDFS上的數據
 

 import java.io.IOException;

  import java.net.URI;

  

  import org.apache.hadoop.conf.Configuration;

  import org.apache.hadoop.fs.FSDataInputStream;

  import org.apache.hadoop.fs.FileSystem;

  import org.apache.hadoop.fs.Path;

  import org.apache.hadoop.io.IOUtils;

  

  /**

   * 讀取數據

   */

  public class Hdfsoper1 {

   public static void main(String[] args) throws IOException {

    Configuration conf = new Configuration();

    String path = "hdfs://192.168.80.11:9000/user/hadoop/in/ins";

    FileSystem fs = FileSystem.get(URI.create(path), conf);

    

    FSDataInputStream fsin = fs.open(new Path(path));

    

    IOUtils.copyBytes(fsin, System.out, 1024);

    

   }

  }

  2)有選擇的讀取,即可以自己設置讀取位置
 

 import java.io.IOException;

  import java.net.URI;

  

  import org.apache.hadoop.conf.Configuration;

  import org.apache.hadoop.fs.FSDataInputStream;

  import org.apache.hadoop.fs.FileSystem;

  import org.apache.hadoop.fs.Path;

  import org.apache.hadoop.io.IOUtils;

  

  /**

   * 可以通過seek()方法設置讀取的位置

   */

  public class hdfsoper2 {

   public static void main(String[] args) throws IOException {

    Configuration conf=  new Configuration();

    String path = "hdfs://192.168.80.11:9000/user/hadoop/in/ins";

    FileSystem fs = FileSystem.get(URI.create(path), conf);

    FSDataInputStream fsin = fs.open(new Path(path));

    IOUtils.copyBytes(fsin, System.out, 1024);

    fsin.seek(18);

    System.out.println("*********read again**********");

    IOUtils.copyBytes(fsin, System.out, 1024);

   }

  }

  3)上傳本地文件到HDFS中

  import java.io.BufferedInputStream;

  import java.io.FileInputStream;

  import java.io.IOException;

  import java.io.InputStream;

  import java.io.OutputStream;

  import java.net.URI;

  import org.apache.hadoop.conf.Configuration;

  import org.apache.hadoop.fs.FileSystem;

  import org.apache.hadoop.fs.Path;

  import org.apache.hadoop.io.IOUtils;

  import org.apache.hadoop.util.Progressable;

  /**

   * upload file to HDFS

   */

  public class Hdfsoper3 {

   public static void main(String[] args) throws IOException {

    Configuration conf = new Configuration();

    //source file

    String source = "/home/hadoop/jdk-6u24-linux-i586.bin";

    InputStream in = new BufferedInputStream(new FileInputStream(source));

    //target file

    String target = "hdfs://192.168.80.11:9000/user/hadoop/in/jdk.bin";

    

    FileSystem fs = FileSystem.get(URI.create(target), conf);

    OutputStream out = fs.create(new Path(target), new Progressable() {

     @Override

     //when upload 64KB to hdfs, then print a * in the console

     public void progress() {

      System.out.print("*");

     }

    });

    

    IOUtils.copyBytes(in, out, 4096, true);

   }

  }

  4)刪除HDFS中的文件

  import java.io.IOException;

  import java.net.URI;

  import org.apache.hadoop.conf.Configuration;

  import org.apache.hadoop.fs.FileSystem;

  import org.apache.hadoop.fs.Path;

  /**

   * delete file by FileSystem.delete( new Path(), true);

   */

  public class hdfsoper4 {

   public static void main(String[] args) throws IOException {

    Configuration conf = new Configuration();

    

    String path = "hdfs://192.168.80.11:9000/user/hadoop/in/jdk.bin";

    

    FileSystem fs = FileSystem.get(URI.create(path), conf);

    

    //if we want delete a directory, then true

    fs.delete(new Path(path), true);

   }

  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章