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