HDFS文件系統的JAVA-API操作(一)
使用java.net.URL訪問HDFS文件系統
HDFS的API使用說明:
1.如果要訪問HDFS,HDFS客戶端必須有一份HDFS的配置文件
也就是hdfs-site.xml,從而讀取Namenode的信息。
2.每個應用程序也必須擁有訪問Hadoop程序的jar文件
3.操作HDFS,也就是HDFS的讀和寫,最常用的類FileSystem
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");
/**
* 參數優先級: 1、客戶端代碼中設置的值 2、classpath下的用戶自定義配置文件 3、然后是服務器的默認配置
*/
//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文件系統
/**
* 操作:顯示HDFS文件夾中的文件內容
* 1.使用java.net.URL對象打開數據流
* 2.使用靜態代碼塊使得java程序識別Hadoop的HDFS url
*/
操作代碼如下:
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包


b.選擇jar包存放路徑


c.指定主類

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

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 }

