通過API訪問HDFS

通過API操作HDFS

今天的主要內(nèi)容

  • HDFS獲取文件系統(tǒng)

  • HDFS文件上傳

  • HDFS文件下載

  • HDFS目錄創(chuàng)建

  • HDFS文件夾刪除

  • HDFS文件名更改

  • HDFS文件詳情查看

  • 定位文件讀取

  • FileSystem類的學(xué)習(xí)

1. HDFS獲取文件系統(tǒng)

//獲取文件系統(tǒng)
@Test
public void initHDFS() throws Exception{
    //1. 獲取文件系統(tǒng)
    Configuration configuration = new Configuration();
    FileSystem fileSystem = FileSystem.get(configuration);
    
    //2. 打印文件系統(tǒng)到控制臺
    System.out.println(fileSystem.toString());      
}

2. HDFS文件上傳(測試參數(shù)優(yōu)先級)

@Test
public void putFileToHdfs() throws Exception{
    Configuration conf = new Configuration();
    conf.set("dfs.replication", "2");       //代碼優(yōu)先級是最高的
    conf.set("fs.defaultFS", "hdfs://10.9.190.111:9000");
    FileSystem fileSystem = FileSystem.get(conf);
        
    //上傳文件
    fileSystem.copyFromLocalFile(new Path("hdfs.txt"), new Path("/user/anna/hdfs/test.txt"));
    
    //關(guān)閉資源
    fileSystem.close(); 
}

參數(shù)優(yōu)先級:(1)客戶端代碼中設(shè)置的值 >(2)classpath 下的用戶自定義配置文件 > (3)然后是服務(wù)器的默認配置

3. HDFS文件下載

public void copyToLocalFile(boolean delSrc,Path src,Path dst,boolean useRawLocalFileSystem)
                 throws IOException

delSrc - whether to delete the src
src - path
dst - path
useRawLocalFileSystem - whether to use RawLocalFileSystem as local file system or not.

@Test
public void testCopyToLocalFile() throws Exception{
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://10.9.190.111:9000");
    FileSystem fileSystem = FileSystem.get(conf);
        
    ///下載文件
    fileSystem.copyToLocalFile(false,new Path("/user/anna/hdfs/test.txt"), new Path("test.txt"),true);
    
    //關(guān)閉資源
    fileSystem.close(); 
}

4. HDFS目錄創(chuàng)建

@Test
public void testMakedir() throws Exception{
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://10.9.190.111:9000");
    FileSystem fileSystem = FileSystem.get(conf);
        
    //目錄創(chuàng)建
    fileSystem.mkdirs(new Path("/user/anna/test/hahaha"));
    
    //關(guān)閉資源
    fileSystem.close();
}

5. HDFS文件夾刪除

@Test
public void testDelete() throws Exception{
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://10.9.190.111:9000");
    FileSystem fileSystem = FileSystem.get(conf);
        
    //文件夾刪除
    fileSystem.delete(new Path("/user/anna/test/hahaha"),true);         //true表示遞歸刪除
    
    //關(guān)閉資源
    fileSystem.close();
}

6. HDFS文件名更改

@Test
public void testRename() throws Exception{
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://10.9.190.111:9000");
    FileSystem fileSystem = FileSystem.get(conf);
        
    //文件名稱更改
    fileSystem.rename(new Path("/user/anna/test/copy.txt"), new Path("/user/anna/test/copyRename.txt"));
    
    //關(guān)閉資源
    fileSystem.close();
}

7. HDFS文件詳情查看

幾種實現(xiàn)方法

1. public abstract FileStatus[] listStatus(Path f) throws FileNotFoundException,IOException
    * 返回FileStatus型數(shù)組

2. public FileStatus[] listStatus(Path f,PathFilter filter) throws FileNotFoundException,IOException

3. public FileStatus[] listStatus(Path[] files,PathFilter filter) throws FileNotFoundException,IOException

    * 此時注意PathFilter是一個接口,里面只有一個方法:accept避咆,本質(zhì)是對文件進行篩選

    * Enumerate all files found in the list of directories passed in, calling listStatus(path, filter) on each one.

注意:以上方法返回的文件按照字母表順序排列

代碼:FileStatus[] listStatus(Path f)

//FileStatus[] listStatus(Path f)的使用
try {
    //創(chuàng)建與HDFS連接
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");

    //獲得fileSystem
    FileSystem fileSystem = FileSystem.get(conf);

    //listStatus獲取/test目錄下信息
    FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/test"));

    //遍歷輸出文件夾下文件
    for(FileStatus fileStatus :fileStatuses) {
        System.out.println(fileStatus.getPath() + "  " + new Date(fileStatus.getAccessTime()) + "  " + 
            fileStatus.getBlockSize() + "  " + fileStatus.getPermission());
    }
}catch(Exception e) {
    e.printStackTrace();
}
/*
在JDK1.8中輸出結(jié)果為:
----------------------------------------------------------------------------
hdfs://10.9.190.90:9000/test/hadoop-2.7.3.tar.gz  2012-07-26  134217728  rw-r--r--
hdfs://10.9.190.90:9000/test/hello.txt  2012-07-26  134217728  rw-r--r--
hdfs://10.9.190.90:9000/test/test2  1970-01-01  0  rwxr-xr-x
----------------------------------------------------------------------------
*/

代碼:FileStatus[] listStatus(Path f,PathFilter filter)

try {
    //創(chuàng)建與HDFS連接
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");

    //獲得fileSystem
    FileSystem fileSystem = FileSystem.get(conf);

    //列出目錄下后綴為.md的文件相關(guān)信息
    FileStatus[] statuses = fileSystem.listStatus(new Path("/test/test2"), new PathFilter() {

        @Override
        public boolean accept(Path path) {
            // TODO Auto-generated method stub
            String string = path.toString();

            if(string.endsWith(".md"))
                return true;
            else
                return false;
        }
    });

    //列出文件信息
    for(FileStatus status : statuses) {
        System.out.println("Path : " + status.getPath() + "  Permisson : " + status.getPermission() + 
                "  Replication : " + status.getReplication());
    }
}catch(Exception e) {
    e.printStackTrace();
}

7. 定位文件讀取

8. FileSystem類的學(xué)習(xí)

FileSystem的學(xué)習(xí)

  • 今天的主要內(nèi)容

    • 對照官方文檔進行FileSystem類的學(xué)習(xí)

    • FileSystem中的方法

        * boolean exists(Path p)
        
        * boolean isDirectory(Path p)
      
        * boolean isFile(Path p)
        
        * FileStatus getFileStatus(Path p)
        
        * Path getHomeDirectory()
        
        * FileStatus[] listStatus(Path path, PathFilter filter)
        
          FileStatus[] listStatus(Path path)
        
          FileStatus[] listStatus(Path[] paths, PathFilter filter)
        
          FileStatus[] listStatus(Path[] paths)
        
        * RemoteIterator[LocatedFileStatus] listLocatedStatus(Path path, PathFilter filter)
        
          RemoteIterator[LocatedFileStatus] listLocatedStatus(Path path)
        
          RemoteIterator[LocatedFileStatus] listFiles(Path path, boolean recursive)
      
        * BlockLocation[] getFileBlockLocations(FileStatus f, int s, int l)
        
          BlockLocation[] getFileBlockLocations(Path P, int S, int L)
        
        * long getDefaultBlockSize()
        
          long getDefaultBlockSize(Path p)
        
          long getBlockSize(Path p)
      
        * boolean mkdirs(Path p, FsPermission permission)
        
        * FSDataOutputStream create(Path, ...)
        
          FSDataOutputStream append(Path p, int bufferSize, Progressable progress)
        
          FSDataInputStream open(Path f, int bufferSize)
        
        * boolean delete(Path p, boolean recursive)
        
        * boolean rename(Path src, Path d)
        
        * void concat(Path p, Path sources[])
        
        * boolean truncate(Path p, long newLength)
        
        * interface RemoteIterator
                boolean hasNext()
                E next()
      
        * interface StreamCapabilities
                boolean hasCapability(capability)
      

準備工作

  • start-dfs.sh啟動hadoop集群

  • eclipse進行hdfs文件系統(tǒng)的訪問

    • 導(dǎo)入相應(yīng)的jar包
  • 創(chuàng)建與hdfs的連接并獲取FileSystem文件對象

    • 第一種方式

        * public static FileSystem get(Configuration conf) throws IOException
      
        //創(chuàng)建與HDFS連接
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");   //namenode上的IP地址  端口為:9000
        
        //獲得fileSystem
        FileSystem fileSystem = FileSystem.get(conf);
      
    • 第二種方式

        * public static FileSystem get(URI uri,Configuration conf,String user)
                  throws IOException,
                         InterruptedException
      
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://10.9.190.90:9000"),new Configuration(),"root");
        //此時工作目錄會相應(yīng)更改為/user/root
      
    • 兩種方式比較

      • 第二種方式可能會拋出InterruptedException異常啊片,因為

        • the static FileSystem get(URI uri, Configuration conf,String user) method MAY return a pre-existing instance of a filesystem client class—a class that may also be in use in other threads. The implementations of FileSystem shipped with Apache Hadoop do not make any attempt to synchronize access to the working directory field.(此時get方法可能會返回一個已經(jīng)存在FileSystem對象床蜘,也就是存在線程異步問題,所以我們盡量用前一種方式來完成FileSystem對象的創(chuàng)建)

org.apache.hadoop.fs.FileSystem簡介

  • The abstract FileSystem class is the original class to access Hadoop filesystems; non-abstract subclasses exist for all Hadoop-supported filesystems.(抽象基類FileSystem定義了對hadoop文件系統(tǒng)的操作)

  • All operations that take a Path to this interface MUST support relative paths. In such a case, they must be resolved relative to the working directory defined by setWorkingDirectory().(setWorkingDirectory()方法默認工作目錄)

    • FileSystem中的getWorkingDirector()返回當前系統(tǒng)的工作目錄

    • 代碼

        //獲得與hdfs文件系統(tǒng)的連接
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://10.9.190.90:9000");
        
        //獲取文件系統(tǒng)對象
        FileSystem fileSystem = FileSystem.get(conf);
        
        //獲取當前工作目錄
        System.out.println("=========獲取當前工作目錄=============");
        System.out.println(fileSystem.getWorkingDirectory());
        
        //設(shè)置新的工作目錄
        //System.out.println("=========設(shè)置新的工作目錄=============");
        fileSystem.setWorkingDirectory(new Path("hdfs://10.9.190.90:9000/user/anna"));  //Path在hdfs中的作用和File作用類似抒抬,代表路徑
      
    • 結(jié)果

        =========獲取當前工作目錄=============
        hdfs://10.9.190.90:9000/user/root
        =========獲取設(shè)置后工作目錄=============
        hdfs://10.9.190.90:9000/user/anna
      

FileSystem方法——判斷功能

  • 預(yù)備知識

    import org.apache.hadoop.fs.Path;類似于java.io.File代表hdfs的文件路徑

  1. 方法

    • public boolean exists(Path f) throws IOException

      • 判斷文件是否存在
    • public boolean isDirectory(Path f) throws IOException

      • 判斷是否為目錄
    • public boolean isFile(Path f) throws IOException

      • 判斷是否為文件
  2. 練習(xí)

     try {
         //獲得與hdfs文件系統(tǒng)的連接
         Configuration conf = new Configuration();
         conf.set("fs.defaultFS", "hdfs://10.9.190.90:9000");
         
         //獲取連接對象
         FileSystem fileSystem = FileSystem.get(conf);
         
         //判斷文件是否存在
         System.out.println(fileSystem.exists(new Path("/test")));   //true
         
         //判斷是否為目錄
         System.out.println(fileSystem.isDirectory(new Path("/test")));  //true
         
         //判斷是否為文件
         System.out.println(fileSystem.isFile(new Path("/test")));           //false
     }catch(Exception e) {
         e.printStackTrace();
     }
    

FileSystem方法——獲取功能—文件信息獲取

  1. 方法

    • public abstract FileStatus getFileStatus(Path f) throws IOException

      • Return a file status object that represents the path.

      • 返回的是FileStatus對象類型

    • public Path getHomeDirectory()

      • Return the current user's home directory in this FileSystem. The default implementation returns "/user/$USER/".

      • 返回當前用戶的home目錄

  2. 練習(xí)

     try {
         //獲得與hdfs文件系統(tǒng)的連接
         Configuration conf = new Configuration();
         conf.set("fs.defaultFS", "hdfs://10.9.190.90:9000");
         
         //獲取連接對象
         FileSystem fileSystem = FileSystem.get(conf);
         
         //獲取當前用戶的home目錄
         System.out.println("========當前用戶的home目錄============");
         Path path = fileSystem.getHomeDirectory();
         System.out.println(path);
         
         //獲取文件狀態(tài)對象
         System.out.println("============文件信息===============");
         FileStatus status = fileSystem.getFileStatus(new Path("/eclipse"));
         System.out.println("Path : " + status.getPath());
         System.out.println("isFile ? " + status.isFile());          
         System.out.println("Block size : " + status.getBlockSize());
         System.out.println("Perssions : " + status.getPermission());
         System.out.println("Replication : " + status.getReplication());
         System.out.println("isSymlink : " + status.isSymlink());            
         
     }catch(Exception e) {
         e.printStackTrace();
     }
    
    
     /*
         在JDK1.8中輸出結(jié)果為:
      *  ------------------------------------------------
      *  ========當前用戶的home目錄============
         hdfs://10.9.190.90:9000/user/anna
         ============文件信息===============
         Path : hdfs://10.9.190.90:9000/eclipse
         isFile ? true
         Block size : 134217728
         Perssions : rw-r--r--
         Replication : 3
         isSymlink : false
         ------------------------------------------------
     */
    
  3. FileStatus中常用方法

    • public Path getPath()

    • public boolean isFile()

    • public boolean isSymlink()

    • public long getBlockSize()

    • public short getReplication()

    • public FsPermission getPermission()

FileSystem方法——獲取功能——文件夾遍歷1

  1. 方法

    • public abstract FileStatus[] listStatus(Path f) throws FileNotFoundException,IOException

      • 返回FileStatus型數(shù)組
    • public FileStatus[] listStatus(Path f,PathFilter filter)
      throws FileNotFoundException,IOException

    • public FileStatus[] listStatus(Path[] files,PathFilter filter)
      throws FileNotFoundException,IOException

      • 此時注意PathFilter是一個接口,里面只有一個方法:accept,本質(zhì)是對文件進行篩選

      • Enumerate all files found in the list of directories passed in, calling listStatus(path, filter) on each one.

    • 注意:以上方法返回的文件按照字母表順序排列

  2. 練習(xí)1——FileStatus[] listStatus(Path f)的使用

     //FileStatus[] listStatus(Path f)的使用
     try {
         //創(chuàng)建與HDFS連接
         Configuration conf = new Configuration();
         conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");
         
         //獲得fileSystem
         FileSystem fileSystem = FileSystem.get(conf);
         
         //listStatus獲取/test目錄下信息
         FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/test"));
         
         //遍歷輸出文件夾下文件
         for(FileStatus fileStatus :fileStatuses) {
             System.out.println(fileStatus.getPath() + "  " + new Date(fileStatus.getAccessTime()) + "  " + 
                 fileStatus.getBlockSize() + "  " + fileStatus.getPermission());
         }
     }catch(Exception e) {
         e.printStackTrace();
     }
     /*
     在JDK1.8中輸出結(jié)果為:
     ----------------------------------------------------------------------------
     hdfs://10.9.190.90:9000/test/hadoop-2.7.3.tar.gz  2012-07-26  134217728  rw-r--r--
     hdfs://10.9.190.90:9000/test/hello.txt  2012-07-26  134217728  rw-r--r--
     hdfs://10.9.190.90:9000/test/test2  1970-01-01  0  rwxr-xr-x
     ----------------------------------------------------------------------------
     */
    
  3. 練習(xí)2——FileStatus[] listStatus(Path f,PathFilter filter)的使用

    • 需求:列出/test/test2目錄下以.md結(jié)尾的問價信息

    • 代碼:

        try {
            //創(chuàng)建與HDFS連接
            Configuration conf = new Configuration();
            conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");
            
            //獲得fileSystem
            FileSystem fileSystem = FileSystem.get(conf);
            
            //列出目錄下后綴為.md的文件相關(guān)信息
            FileStatus[] statuses = fileSystem.listStatus(new Path("/test/test2"), new PathFilter() {
                
                @Override
                public boolean accept(Path path) {
                    // TODO Auto-generated method stub
                    String string = path.toString();
                    
                    if(string.endsWith(".md"))
                        return true;
                    else
                        return false;
                }
            });
            
            //列出文件信息
            for(FileStatus status : statuses) {
                System.out.println("Path : " + status.getPath() + "  Permisson : " + status.getPermission() + 
                        "  Replication : " + status.getReplication());
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
      
  4. 注意問題

    • By the time the listStatus() operation returns to the caller, there is no guarantee that the information contained in the response is current. The details MAY be out of date, including the contents of any directory, the attributes of any files, and the existence of the path supplied.(listStatus()方法線程不安全)

FileSystem方法——獲取功能——文件夾遍歷2

  1. 方法

    • public org.apache.hadoop.fs.RemoteIterator<LocatedFileStatus> listLocatedStatus(Path f)
      throws FileNotFoundException, IOException

    • protected org.apache.hadoop.fs.RemoteIterator<LocatedFileStatus> listLocatedStatus(Path f,PathFilter filter)
      throws FileNotFoundException, IOException

      • 注意:此方法是protected的秃励,protected權(quán)限是:本類,同一包下(子類或無關(guān)類)吉捶,不同包下子類
    • 注意:LocatedFileStatus是FileStatus的子類

  2. 使用

     try {
         //創(chuàng)建與HDFS連接
         Configuration conf = new Configuration();
         conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");
         
         //獲得fileSystem
         FileSystem fileSystem = FileSystem.get(conf);
         
         //列出目錄下后綴為.md的文件相關(guān)信息
         RemoteIterator<LocatedFileStatus> iterator = fileSystem.listLocatedStatus(new Path("/test/test2"));
         
         while(iterator.hasNext()) {
             LocatedFileStatus status = iterator.next();
             System.out.println("Path : " + status.getPath() + "  Permisson : " + status.getPermission() + 
                     "  Replication : " + status.getReplication());
         }           
     }catch(Exception e) {
         e.printStackTrace();
     }
     /*
      * 在JDK1.8中輸出結(jié)果為:
      * ---------------------------------------------------------------------------------------------
      * Path : hdfs://10.9.190.90:9000/test/test2/Map.md  Permisson : rw-r--r--  Replication : 3
        Path : hdfs://10.9.190.90:9000/test/test2/biji.md  Permisson : rw-r--r--  Replication : 3
        Path : hdfs://10.9.190.90:9000/test/test2/haha.txt  Permisson : rw-r--r--  Replication : 3
        ---------------------------------------------------------------------------------------------
      * */
    
  3. 與listStatus(Path p)不同的是

    • listStatus返回的是FileStatus[]數(shù)組類型夺鲜,遍歷時可通過數(shù)組for-each進行遍歷

    • listLocatedStatus(Path p)返回的是LocatedFileStatus類型的RemoteIterator集合皆尔,通過迭代器進行遍歷輸出

    • 但是要注意的是listLocatedStatus()方法本質(zhì)上內(nèi)部還是listStatus(Path p)實現(xiàn)的

FileSystem方法——獲取功能——文件夾遍歷3

  1. 方法

    • public org.apache.hadoop.fs.RemoteIterator<LocatedFileStatus> listFiles(Path f,boolean recursive)
      throws FileNotFoundException,IOException
      • 遞歸遍歷出文件夾內(nèi)容以及子文件夾中內(nèi)容
  2. 使用

     try {
         //創(chuàng)建與HDFS連接
         Configuration conf = new Configuration();
         conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");
         
         //獲得fileSystem
         FileSystem fileSystem = FileSystem.get(conf);
         
         //列出目錄下后綴為.md的文件相關(guān)信息
         RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/test"),true);
         
         while(iterator.hasNext()) {
             LocatedFileStatus status = iterator.next();
             System.out.println("Path : " + status.getPath() + "  Permisson : " + status.getPermission() + 
                     "  Replication : " + status.getReplication());
         }           
     }catch(Exception e) {
         e.printStackTrace();
     }
    
     /*
      *  在JDK1.8中輸出結(jié)果為:
      *  ---------------------------------------------------------------------------------------------------
      *  Path : hdfs://10.9.190.90:9000/test/hadoop-2.7.3.tar.gz  Permisson : rw-r--r--  Replication : 3
         Path : hdfs://10.9.190.90:9000/test/hello.txt  Permisson : rw-r--r--  Replication : 3
         Path : hdfs://10.9.190.90:9000/test/test2/Map.md  Permisson : rw-r--r--  Replication : 3
         Path : hdfs://10.9.190.90:9000/test/test2/biji.md  Permisson : rw-r--r--  Replication : 3
         Path : hdfs://10.9.190.90:9000/test/test2/haha.txt  Permisson : rw-r--r--  Replication : 3
         ---------------------------------------------------------------------------------------------------
      * */       
    

FileSystem方法——獲取功能——獲取文件block的位置

  1. 方法

    • public BlockLocation[] getFileBlockLocations(Path p,long start,long len) throws IOException

    • public BlockLocation[] getFileBlockLocations(FileStatus file,long start,long len) throws IOException

  2. 使用

     //查看/test/hadoop的block存放位置
     try {
         //創(chuàng)建與HDFS連接
         Configuration conf = new Configuration();
         conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");
         
         //獲得fileSystem
         FileSystem fileSystem = FileSystem.get(conf);
         
         FileStatus status = fileSystem.getFileStatus(new Path("/test/hadoop"));
         
         BlockLocation[] locations = fileSystem.getFileBlockLocations(status, 0,status.getLen());
         
         for(BlockLocation location : locations) {
             System.out.println("host : " + location.getHosts() + " name : " + location.getNames() + " length : " + location.getLength());
         } 
     }catch(Exception e) {
         e.printStackTrace();
     }
     /*
     在JDK1.8中輸出結(jié)果為:
     ------------------------------------------------------------------------------
     host : [Ljava.lang.String;@18ece7f4 name : [Ljava.lang.String;@3cce57c7 length : 134217728
     host : [Ljava.lang.String;@1cf56a1c name : [Ljava.lang.String;@33f676f6 length : 79874467
     ------------------------------------------------------------------------------
     */
    

FileSystem方法——獲取功能——獲取到某文件的輸出流

  1. 方法

    • public FSDataOutputStream create(Path f) throws IOException

    • public FSDataOutputStream create(Path f,boolean overwrite)
      throws IOException

      • overwrite - if a file with this name already exists, then if true, the file will be overwritten, and if false an exception will be thrown.
    • public FSDataOutputStream create(Path f,
      Progressable progress)
      throws IOException

      • Create an FSDataOutputStream at the indicated Path with write-progress reporting. Files are overwritten by default.
    • public FSDataOutputStream create(Path f,boolean overwrite,int bufferSize)
      throws IOException

    • public FSDataOutputStream create(Path f,boolean overwrite,int bufferSize, Progressable progress)throws IOException

    • FSDataOutputStream append(Path p, int bufferSize, Progressable progress)

  2. 使用——將本地E:/hzy.jpg上傳到hdfs的/1.jpg

     public static void main(String[] args) {        
     BufferedInputStream in = null;
     FSDataOutputStream out = null;
     
     try {
         //創(chuàng)建與HDFS連接
         Configuration conf = new Configuration();
         conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");
         
         //獲得fileSystem
         FileSystem fileSystem = FileSystem.get(conf);
         
         //獲取本地文件輸入流
         File file = new File("E:/hzy.jpg");
         in = new BufferedInputStream(new FileInputStream(file));
         final long fileSize = file.length();
         
         //獲取到/test/hello.txt的輸出流
         out = fileSystem.create(new Path("/1.jpg"),new Progressable() {
             long fileCount = 0;
             
             @Override
             public void progress() {
                 // TODO Auto-generated method stub
                 fileCount++;
                 System.out.println("總進度:" + (fileCount/fileSize)*100 + " %");
             }
         });
         
         //拷貝
         int len = 0;
         while((len = in.read()) != -1) {
             out.write(len);                 //此時也可以用:IOUtils.copyBytes(in,out,conf);
         }
         
         in.close();
         out.close();
         
                 
     }catch(Exception e) {
         e.printStackTrace();
     }finally {
         if(in != null) {
             try {
                 in.close();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
         if (out != null) {
             try {
                 out.close();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
     }
    

    }

FileSystem方法——獲取功能——獲取到某文件的輸入流——讀取文件

  1. 方法

    • public FSDataInputStream open(Path f) throws IOException

    • public abstract FSDataInputStream open(Path f,int bufferSize)throws IOException

  2. 使用——將hdfs中的1.jpg拷貝到本地E:/hzy2.jpg

     try {
         //創(chuàng)建與HDFS連接
         Configuration conf = new Configuration();
         conf.set("fs.defaultFS","hdfs://10.9.190.90:9000");
         
         //獲得fileSystem
         FileSystem fileSystem = FileSystem.get(conf);
         
         //獲取hdfs文件輸入流
         FSDataInputStream in = fileSystem.open(new Path("/1.jpg"));
         
         //獲取本地輸出流
         BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File("E:/hzyCopy.jpg")));
         
         int len = 0;
         byte[] bArr = new byte[1024*3];
         while((len = in.read(bArr)) != -1) {
             out.write(bArr,0,len);
         }
         
         in.close();
         out.close();
         
     }catch(Exception e) {
         e.printStackTrace();
     }
    

    }

FileSystem方法——創(chuàng)建功能

  • public boolean mkdirs(Path f) throws IOException

FileSystem方法——刪除功能

  • public abstract boolean delete(Path f,boolean recursive) throws IOException

  • 設(shè)計線程同步問題

FileSystem方法——重命名功能

  • public abstract boolean rename(Path src,Path dst)throws IOException

FileSystem其他方法

  • public void concat(Path trg,Path[] psrcs)throws IOException

    • Concat existing files together.
  • public boolean truncate(Path f,long newLength)throws IOException

interface RemoteIterator

  1. 定義

     public interface RemoteIterator<E> {
       boolean hasNext() throws IOException;
       E next() throws IOException;
     }   
    
    • The primary use of RemoteIterator in the filesystem APIs is to list files on (possibly remote) filesystems.
  2. 使用

     //listLocatedFileStatus(Path f)
     public org.apache.hadoop.fs.RemoteIterator<LocatedFileStatus> listLocatedStatus(Path f)
         throws FileNotFoundException,IOException
    
    
     //listLocatedStatus(Path f,PathFilter filter)
     protected org.apache.hadoop.fs.RemoteIterator<LocatedFileStatus> listLocatedStatus(Path f,PathFilter filter)
         throws FileNotFoundException,IOException
    
     //listStatusIterator(Path p)
     public org.apache.hadoop.fs.RemoteIterator<FileStatus> listStatusIterator(Path p)
         throws FileNotFoundException,IOException
    
     //listFiles(Path f,boolean recursive)
     public org.apache.hadoop.fs.RemoteIterator<LocatedFileStatus> listFiles(Path f,boolean recursive)
         throws FileNotFoundException,IOException
    

interface StreamCapabilities

  1. 方法

     public interface StreamCapabilities {
       boolean hasCapability(String capability);
     }
    
  2. 使用

     hadoop2.7.3中無此方法,在2.9.1中才有
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末币励,一起剝皮案震驚了整個濱河市慷蠕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌食呻,老刑警劉巖流炕,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仅胞,居然都是意外死亡每辟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門干旧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渠欺,“玉大人,你說我怎么就攤上這事椎眯【撸” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵盅视,是天一觀的道長捐名。 經(jīng)常有香客問我,道長闹击,這世上最難降的妖魔是什么镶蹋? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮赏半,結(jié)果婚禮上贺归,老公的妹妹穿的比我還像新娘。我一直安慰自己断箫,他們只是感情好拂酣,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仲义,像睡著了一般婶熬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埃撵,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天赵颅,我揣著相機與錄音,去河邊找鬼暂刘。 笑死饺谬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谣拣。 我是一名探鬼主播募寨,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼族展,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拔鹰?” 一聲冷哼從身側(cè)響起仪缸,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎格郁,沒想到半個月后腹殿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡例书,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年锣尉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片决采。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡自沧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出树瞭,到底是詐尸還是另有隱情拇厢,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布晒喷,位于F島的核電站孝偎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凉敲。R本人自食惡果不足惜衣盾,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爷抓。 院中可真熱鬧势决,春花似錦、人聲如沸蓝撇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渤昌。三九已至虽抄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耘沼,已是汗流浹背极颓。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留群嗤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓兵琳,卻偏偏與公主長得像狂秘,于是被迫代替她去往敵國和親骇径。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容