本文研究的主要是HDFS的Java API的訪問方式,具體代碼如下所示,有詳細(xì)注釋。
最近的節(jié)奏有點(diǎn)兒快,等有空的時(shí)候把這個(gè)封裝一下
實(shí)現(xiàn)代碼
要導(dǎo)入的包:
1
2
3
4
5
6
7
8
9
10
11
12
|
import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.protocol.DatanodeInfo; |
實(shí)體方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
/** * 獲取HDFS文件系統(tǒng) * @return * @throws IOException * @throws URISyntaxException */ public static FileSystem getFileSystem() throws IOException, URISyntaxException{ //read config file Configuration conf = new Configuration(); //返回默認(rèn)文件系統(tǒng) //如果在Hadoop集群下運(yùn)行,使用此種方法可以直接獲取默認(rèn)文件系統(tǒng) //FileSystem fs = FileSystem.get(conf); //指定的文件系統(tǒng)地址 URI uri = new URI( "hdfs://hy:9000" ); //返回指定的文件系統(tǒng) //如果在本地測試,需要使用此種方法獲取文件系統(tǒng) FileSystem fs = FileSystem.get(uri, conf); return fs; } /** * 創(chuàng)建文件目錄 * @throws Exception */ public static void mkdir() throws Exception{ //獲取文件系統(tǒng) FileSystem fs = getFileSystem(); //創(chuàng)建文件目錄 fs.mkdirs( new Path( "hdfs://hy:9000/hy/weibo" )); //釋放資源 fs.close(); } /** * 刪除文件或者文件目錄 * @throws Exception */ public static void rmdir() throws Exception{ //獲取文件系統(tǒng) FileSystem fs = getFileSystem(); //刪除文件或者文件目錄 fs.delete( new Path( "hdfs://hy:9000/hy/weibo" ), true ); //釋放資源 fs.close(); } /** * 獲取目錄下所有文件 * @throws Exception */ public static void listAllFile() throws Exception{ //獲取文件系統(tǒng) FileSystem fs = getFileSystem(); //列出目錄內(nèi)容 FileStatus[] status = fs.listStatus( new Path( "hdfs://hy:9000/hy/" )); //獲取目錄下所有文件路徑 Path[] listedPaths = FileUtil.stat2Paths(status); //循環(huán)讀取每個(gè)文件 for (Path path : listedPaths) { System.out.println(path); } //釋放資源 fs.close(); } /** * 將文件上傳至HDFS * @throws Exception */ public static void copyToHDFS() throws Exception{ //獲取文件對象 FileSystem fs = getFileSystem(); //源文件路徑是Linux下的路徑 Path srcPath = new Path("/home/hadoop/temp.jar"); //如果需要在windows下測試,需要改為Windows下的路徑,比如 E://temp.jar Path srcPath = new Path( "E://temp.jar" ); //目的路徑 Path dstPath = new Path( "hdfs://hy:9000/hy/weibo" ); //實(shí)現(xiàn)文件上傳 fs.copyFromLocalFile(srcPath, dstPath); //釋放資源 fs.close(); } /** * 從HDFS上下載文件 * @throws Exception */ public static void getFile() throws Exception{ //獲得文件系統(tǒng) FileSystem fs = getFileSystem(); //源文件路徑 Path srcPath = new Path( "hdfs://hy:9000/hy/weibo/temp.jar" ); //目的路徑,默認(rèn)是Linux下的 //如果在Windows下測試,需要改為Windows下的路徑,如C://User/andy/Desktop/ Path dstPath = new Path( "D://" ); //下載HDFS上的文件 fs.copyToLocalFile(srcPath, dstPath); //釋放資源 fs.close(); } /** * 獲取HDFS集群點(diǎn)的信息 * @throws Exception */ public static void getHDFSNodes() throws Exception{ //獲取文件系統(tǒng) FileSystem fs = getFileSystem(); //獲取分布式文件系統(tǒng) DistributedFileSystem hdfs = (DistributedFileSystem)fs; //獲取所有節(jié)點(diǎn) DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats(); //循環(huán)比遍歷 for ( int i = 0 ; i < dataNodeStats.length; i++) { System.out.println( "DataNote_" + i + "_Name:" + dataNodeStats[i].getHostName()); } //釋放資源 fs.close(); } /** * 查找某個(gè)文件在HDFS集群的位置 * @throws Exception */ public static void getFileLocal() throws Exception{ //獲取文件系統(tǒng) FileSystem fs = getFileSystem(); //文件路徑 Path path = new Path( "hdfs://hy:9000/hy/weibo/temp.jar" ); //獲取文件目錄 FileStatus fileStatus = fs.getFileStatus(path); //獲取文件塊位置列表 BlockLocation[] blockLocations = fs.getFileBlockLocations(fileStatus, 0 , fileStatus.getLen()); //循環(huán)輸出塊信息 for ( int i = 0 ; i < blockLocations.length; i++) { String[] hosts = blockLocations[i].getHosts(); System.out.println( "block_" + i + "_location:" + hosts[ 0 ]); } //釋放資源 fs.close(); } |
總結(jié)
以上就是本文關(guān)于HDFS的Java API的訪問方式實(shí)例代碼的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://blog.csdn.net/u010176083/article/details/52464558