HDFS文件系統的JAVA-API操做(一)

HDFS文件系統的JAVA-API操做(一)

使用java.net.URL訪問HDFS文件系統java

 HDFS的API使用說明:
  1.若是要訪問HDFS,HDFS客戶端必須有一份HDFS的配置文件
  也就是hdfs-site.xml,從而讀取Namenode的信息。
  2.每一個應用程序也必須擁有訪問Hadoop程序的jar文件
  3.操做HDFS,也就是HDFS的讀和寫,最經常使用的類FileSystem

node

 
 
初始化配置參數據需注意的以下 init方法紅色標註的地方
    public void init() throws Exception {
        // 構造一個配置參數對象,設置一個參數:咱們要訪問的hdfs的URI
        // 從而FileSystem.get()方法就知道應該是去構造一個訪問hdfs文件系統的客戶端,以及hdfs的訪問地址
        // new Configuration();的時候,它就會去加載jar包中的hdfs-default.xml
        // 而後再加載classpath下的hdfs-site.xml
        Configuration conf = new Configuration();
        //conf.set("fs.defaultFS", "hdfs://hdp-node01:9000");
        /**
         * 參數優先級: 一、客戶端代碼中設置的值 二、classpath下的用戶自定義配置文件 三、而後是服務器的默認配置
         */
        //conf.set("dfs.replication", "3");

        // 獲取一個hdfs的訪問客戶端,根據參數,這個實例應該是DistributedFileSystem的實例
        // fs = FileSystem.get(conf);

        // 若是這樣去獲取,那conf裏面就能夠不要配"fs.defaultFS"參數,並且,這個客戶端的身份標識已是hadoop用戶
        fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop");
    }

 實例1:使用java.net.URL訪問HDFS文件系統

/**linux

* 操做:顯示HDFS文件夾中的文件內容
* 1.使用java.net.URL對象打開數據流
* 2.使用靜態代碼塊使得java程序識別Hadoop的HDFS url
*/apache

操做代碼以下:服務器

複製代碼
 1 package TestHdfs;
 2 import java.io.InputStream;
 3 import java.net.URL;
 4 import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
 5 import org.apache.hadoop.io.IOUtils;
 6 /**
 7  * @author SimonsZhao
 8  * HDFS的API使用
 9  * 1.若是要訪問HDFS,HDFS客戶端必須有一份HDFS的配置文件
10  * 也就是hdfs-site.xml,從而讀取Namenode的信息。
11  * 2.每一個應用程序也必須擁有訪問Hadoop程序的jar文件
12  * 3.操做HDFS,也就是HDFS的讀和寫,最經常使用的類FileSystem
13  * 操做:顯示HDFS文件夾中的文件內容
14  * 1.使用java.net.URL對象打開數據流
15  * 2.使用靜態代碼塊使得java程序識別Hadoop的HDFS url
16  */
17 public class MyCat {
18     static{
19         URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
20     }
21     public static void main(String[] args) {
22         InputStream input=null;
23         try {
24             input = new URL(args[0]).openStream();
25             IOUtils.copyBytes(input,System.out,4096,false);
26         } catch (Exception e) {
27             System.err.println("Error");
28         }finally{
29             IOUtils.closeStream(input);
30         }
31     }
32 }
複製代碼

0.打包程序並長傳到Linux中

        a.經過export導出文件jar包oop

        

        

         b.選擇jar包存放路徑post

         

        

        c.指定主類url

         

 

        

        d.經過SecureCRT上傳jar包至Linux中的指定文件夾下。spa

         

 

   1.在指定文件夾下建立示例文件demo

    [root@neusoft-master filecontent]# vi demo

    

  2.上傳文件至HDFS的data目錄,data目錄須要首先建立。

     [root@neusoft-master filecontent]# hadoop dfs -put demo /data/

    

       3.查看是否上傳成功

           [root@neusoft-master filecontent]# hadoop dfs -ls /data/

           

     4.將已經打包好的jar文件上傳至linux並切換到相應文件夾運行hadoop命令執行

           從結果能夠看出可以顯示出來demo文件的內容

          [root@neusoft-master filecontent]# hadoop jar MyCat.jar hdfs://neusoft-master:9000/data/demo

          

 

 實例2:使用FileSystem訪問HDFS文件系統

    /**
    *操做:將本地文件系統的文件經過java-API寫入到HDFS文件
    */

    1.本地文件系統和HDFS中應該首先建立指定的目錄

    linux中建立文件命令:mkdir test

    HDFS中建立文件夾命令:hadoop dfs -mkdir /data/

String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在必定數據,這裏存儲了一行英語句子,如welcome to.....
String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑

     2.程序源代碼

複製代碼
 1 package TestHdfs;
 2 
 3 import java.io.BufferedInputStream;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.InputStream;
 7 import java.io.OutputStream;
 8 import java.net.URI;
 9 
10 import org.apache.hadoop.conf.Configuration;
11 import org.apache.hadoop.fs.FSDataOutputStream;
12 import org.apache.hadoop.fs.FileSystem;
13 import org.apache.hadoop.fs.Path;
14 import org.apache.hadoop.io.IOUtils;
15 
16 /**
17  * @author SimonsZhao
18  *將本地文件系統的文件經過java-API寫入到HDFS文件
19  */
20 public class FileCopyFromLocal {
21     public static void main(String[] args) throws Exception {
22         String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在必定數據
23         String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑
24         InputStream in = new BufferedInputStream(new FileInputStream(source));
25         //HDFS讀寫的配置文件
26         Configuration conf = new Configuration();
27         //調用Filesystem的create方法返回的是FSDataOutputStream對象
28         //該對象不容許在文件中定位,由於HDFS只容許一個已打開的文件順序寫入或追加
29         FileSystem fs = FileSystem.get(URI.create(destination),conf);
30         OutputStream out = fs.create(new Path(destination));
31         IOUtils.copyBytes(in, out, 4096, true);
32     }
33 }
複製代碼

    3.程序打包並傳至linux文件系統中

     請參考實例1的打包過程

    4.程序運行及結果分析

     a.查看指定jar包是否成功上傳,在linux中使用ls或ll命令

     b.執行jar命令

 [root@neusoft-master filecontent]# hadoop jar FileSystemDemoCat.jar 

    

     c.結果顯示welcome to....說明操做正確

 實例3:建立HDFS目錄

  * 建立HDFS目錄
  * 實例:HDFS建立test2目錄   

     1.明確在HDFS文件系統中建立目錄的具體地址,在程序中經過args[0]參數提供用戶輸入,如

hdfs://neusoft-master:9000/data/test2

     2.程序源代碼

複製代碼
 1 package TestHdfs;
 2 import java.net.URI;
 3 import org.apache.hadoop.conf.Configuration;
 4 import org.apache.hadoop.fs.FileSystem;
 5 import org.apache.hadoop.fs.Path;
 6 /**
 7  * @author SimonsZhao
 8  * 建立HDFS目錄
 9  * 實例:HDFS建立test2目錄
10  * hadoop jar CreateDir.jar hdfs://neusoft-master:9000/data/test2
11  */
12 public class CreateDirction {
13     public static void main(String[] args) {
14         //HDFS路徑:hdfs://neusoft-master:9000/data/test2
15         String uri=args[0];//從鍵盤輸入路徑參數
16         Configuration conf = new Configuration();
17         try {
18             FileSystem fs = FileSystem.get(new URI(uri),conf);
19             Path dfs = new Path(uri);
20             fs.mkdirs(dfs);
21         } catch (Exception e) {
22             e.printStackTrace();
23         }finally{
24             System.out.println("SUCESS");
25         }
26     }
27 }
複製代碼

    3.將jar包上傳到Linux

         請參考第一個程序的導出jar包的過程。 

    4.程序運行及結果分析

[root@neusoft-master filecontent]# hadoop jar CreateDir.jar hdfs://neusoft-master:9000/data/test2

    

 實例4:刪除HDFS目錄   

複製代碼
 1 package TestHdfs;
 2 import java.net.URI;
 3 import org.apache.hadoop.conf.Configuration;
 4 import org.apache.hadoop.fs.FileSystem;
 5 import org.apache.hadoop.fs.Path;
 6 /**
 7  * @author SimonsZhao
 8  * 刪除HDFS上面的文件
 9  */
10 public class DeleteFile {
11     public static void main(String[] args) {
12         String uri="hdfs://neusoft-master:9000/data/test2";
13         Configuration conf = new Configuration();
14         try {
15             FileSystem fs =FileSystem.get(new URI(uri), conf);
16             Path f = new Path(uri);
17             //遞歸刪除文件夾下全部文件
18             boolean isDelete= fs.delete(f, true);
19             //遞歸刪除文件夾下全部文件
20             //boolean isDelete= fs.delete(f, false);
21             String str=isDelete?"Sucess":"Error";
22             System.out.println("刪除"+str);
23         } catch (Exception e) {
24             System.out.println("刪除出錯~");
25         }
26     }
27 }
複製代碼

    3.將jar包上傳到Linux

         請參考第一個程序的導出jar包的過程。 

    4.程序運行及結果分析

       執行程序以後,經過hadoop dfs -ls / 查看是否成功刪除HDFS上面的文件

 

實例5:查看文件或目錄是否存在

複製代碼
 1 package TestHdfs;
 2 import java.net.URI;
 3 import org.apache.hadoop.conf.Configuration;
 4 import org.apache.hadoop.fs.FileSystem;
 5 import org.apache.hadoop.fs.Path;
 6 /**
 7  * @author SimonsZhao
 8  * 查看文件是否存在
 9  */
10 public class CheckFileIsExists {
11     public static void main(String[] args) {
12         //String uri="hdfs://neusoft-master:9000/data/test2/";//指定目錄
13         String uri="hdfs://neusoft-master:9000/data/test2/hello";//指定文件
14         Configuration conf = new Configuration();
15         try {
16             FileSystem fs = FileSystem.get(new URI(uri), conf);
17             Path path = new Path(uri);
18             boolean isExists=fs.exists(path);
19             String str=isExists?"Exists":"Not Exists";
20             System.out.println("指定文件或目錄"+str);
21         } catch (Exception e) {
22             e.printStackTrace();
23         }
24     }
25 }
複製代碼

  3.將jar包上傳到Linux

         請參考第一個程序的導出jar包的過程。 

    4.程序運行及結果分析

     若是在linux中存在該文件的話,則顯示以下:

     「指定文件或目錄Exists」

 

實例6:列出目錄下的文件或目錄名稱 

複製代碼
 1 package TestHdfs;
 2 import java.net.URI;
 3 import org.apache.hadoop.conf.Configuration;
 4 import org.apache.hadoop.fs.FileStatus;
 5 import org.apache.hadoop.fs.FileSystem;
 6 import org.apache.hadoop.fs.Path;
 7 /**
 8  * @author SimonsZhao
 9  * 列出目錄下的文件或目錄名稱
10  */
11 public class ListFiles {
12 public static void main(String[] args) {
13     String uri="hdfs://neusoft-master:9000/data";
14     Configuration conf = new Configuration();
15     try {
16         FileSystem fs=FileSystem.get(new URI(uri), conf);
17         Path path = new Path(uri);
18         FileStatus status[] = fs.listStatus(path);
19         for (int i = 0; i < status.length; i++) {
20             System.out.println(status[i].getPath().toString());
21         }
22     } catch (Exception e) {
23         e.printStackTrace();
24     }
25 }
26 }
複製代碼

    3.將jar包上傳到Linux

         請參考第一個程序的導出jar包的過程。 

    4.程序運行及結果分析

    

實例7:查看文件存儲位置

複製代碼
 1 package TestHdfs;
 2 import java.net.URI;
 3 import org.apache.hadoop.conf.Configuration;
 4 import org.apache.hadoop.fs.BlockLocation;
 5 import org.apache.hadoop.fs.FileStatus;
 6 import org.apache.hadoop.fs.FileSystem;
 7 import org.apache.hadoop.fs.Path;
 8 
 9 /**
10  * @author SimonsZhao
11  * 文件存儲的位置
12  */
13 public class LoactionFile {
14     public static void main(String[] args) {
15         String uri="hdfs://neusoft-master:9000/data/demo";//hello爲文件
16         Configuration conf = new Configuration();
17         try {
18             FileSystem fs=FileSystem.get(new URI(uri), conf);
19             Path path = new Path(uri);
20             FileStatus fileStatus = fs.getFileStatus(path);
21             BlockLocation blkLocation[]=
22                     fs.getFileBlockLocations
23                     (fileStatus, 0, fileStatus.getLen());
24             for (int i = 0; i < blkLocation.length; i++) {
25                 String[] hosts=blkLocation[i].getHosts();
26                 System.out.println("block_"+i+"_Location:"+hosts[0]);
27             }
28         } catch (Exception e) {
29             e.printStackTrace();
30         }
31     }
32 }
複製代碼

    3.將jar包上傳到Linux

         請參考第一個程序的導出jar包的過程。 

    4.程序運行及結果分析

     因爲採用僞分佈的環境block塊存儲均爲1,所以這裏僅顯示1個block塊的host主機名

     顯示:block_0_Location:neusoft-master

實例8:將本地文件寫入到HDFS中

複製代碼
 1 package TestHdfs;
 2 import java.io.BufferedInputStream;
 3 import java.io.FileInputStream;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 import java.net.URI;
 7 import org.apache.hadoop.conf.Configuration;
 8 import org.apache.hadoop.fs.FileSystem;
 9 import org.apache.hadoop.fs.Path;
10 import org.apache.hadoop.io.IOUtils;
11 
12 /**
13  * @author SimonsZhao
14  *將本地文件系統的文件經過java-API寫入到HDFS文件
15  */
16 public class FileCopyFromLocal {
17     public static void main(String[] args) throws Exception {
18         String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在必定數據
19         String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑
20         InputStream in = new BufferedInputStream(new FileInputStream(source));
21         //HDFS讀寫的配置文件
22         Configuration conf = new Configuration();
23         //調用Filesystem的create方法返回的是FSDataOutputStream對象
24         //該對象不容許在文件中定位,由於HDFS只容許一個已打開的文件順序寫入或追加
25         FileSystem fs = FileSystem.get(URI.create(destination),conf);
26         OutputStream out = fs.create(new Path(destination));
27         IOUtils.copyBytes(in, out, 4096, true);
28     }
29 }
複製代碼
相關文章
相關標籤/搜索