如何使用Java代碼訪問HDFSdocx?
1 : 上傳本地文件到HDFS
@Test
public void testUpload() throws Exception {
Configuration conf = new Configuration();
//默認值,可以不設置
conf.set("dfs.blocksize", "128m");
// 1.先獲取一個訪問HDFS的客戶端對象
// 參數1:URI-hdfs集群的訪問地址 參數2:客戶端需要攜帶的參數對象 參數3:指明客戶端的身份
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000"), conf, "root");
//fs的copyFromLocalFile()方法上傳文件
//ziliao.docx為給文件重命名
fs.copyFromLocalFile(new Path("G:/a.docx"), new Path("/ziliao.docx"));
//關閉資源
fs.close();
}
上傳結果:
2 : 創建目錄
/**
* 測試創建目錄
* @throws Exception
*/
@Test
public void testMkdir() throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000"), conf, "root");
//創建一個目錄,aaa下面的bbb
fs.mkdirs(new Path("/aaa/bbb"));
fs.close();
}
創建結果:
3 : 下載文件到本地
方法一:
下載操作,會涉及到客戶端本地系統的訪問,hadoop為本地訪問專門封裝了本地平臺庫(C語言)
具體做法:將本地庫解壓到任意位置,并將解壓目錄配置到HADOOP_HOME環境變量中
/**
* 測試下載文件
* 具體做法:將本地庫解壓到任意位置,并將解壓目錄配置到HADOOP_HOME環境變量中
* @throws Exception
*/
@Test
public void testDownLoad() throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000"), conf, "root");
fs.copyToLocalFile(new Path("/ziliao.docx"), new Path("E:/"));
fs.close();
}
下載結果:
方法二 : 此方法不需要hadoop本地C語言庫
/**
* 測試下載文件
* @throws Exception
*/
@Test
public void testDownLoad() throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000"), conf, "root");
//方法一:使用hadoop本地C語言庫
//具體做法:將本地庫解壓到任意位置,并將解壓目錄配置到HADOOP_HOME環境變量中
//fs.copyToLocalFile(new Path("/ziliao.docx"), new Path("E:/"));
//方法二:使用java類庫 第一個參數為是否是否刪除源.中間倆個參數為路徑,最后一個參數useRawLocalFileSystem為是用本地java庫
fs.copyToLocalFile(false, new Path("/ziliao.docx"), new Path("E:/"), true);
fs.close();
}
下載結果:
4 : 刪除文件
/**
* 測試刪除
* @throws Exception
*/
@Test
public void testRm() throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000"), conf, "root");
//參數一:要刪除的路徑. 參數二:是否遞歸
fs.delete(new Path("/aaa"), true);
fs.close();
}
刪除之前:
刪除之后:
5 : 移動或重命名文件或文件夾
/**
* 測試移動或重命名文件或文件夾
* @throws Exception
*/
@Test
public void testMv() throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000"), conf, "root");
//第一個參數為原文件名或路徑,第二個參數為修改的文件名或路徑
fs.rename(new Path("/ziliao.docx"), new Path("/haha.docx"));
fs.close();
}
重命名之前:
重命名之后:
6 : 判斷文件或文件夾是否存在
代碼;
/**
* 判斷文件是否存在
* @throws Exception
*/
@Test
public void testIfExist() throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000"), conf, "root");
boolean exists = fs.exists(new Path("/aaa"));
System.out.println(exists);
fs.close();
}
文件 :
判斷結果 : 不存在
7 : 判斷一個路徑是否為文件
/**
* 判斷文件或文件夾是否存在
* @throws Exception
*/
@Test
public void testIfExist() throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000"), conf, "root");
//boolean exists = fs.exists(new Path("/aaa"));
boolean isfile = fs.isFile(new Path("haha.docx"));
//System.out.println(exists);
System.out.println(isfile);
fs.close();
}
8 : 查看文件目錄,僅顯示文件信息
/**
* 查看文件目錄
* @throws IOException
* @throws InterruptedException
* @throws URISyntaxException
*/
@Test
public void testLs1() throws IOException, InterruptedException, URISyntaxException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://marshal:9000/"), conf, "root");
// 思考:為何返回迭代器?
RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path("/"), true);
while(iterator.hasNext()) {
LocatedFileStatus file = iterator.next();
System.out.println("文件的所屬組:" + file.getGroup());
System.out.println("文件的所有者:" + file.getOwner());
System.out.println("文件的訪問時間:" + file.getAccessTime());
System.out.println("文件的塊大?。? + file.getBlockSize());
System.out.println("文件的總長度:" + file.getLen());
System.out.println("文件的修改時間:" + file.getModificationTime());
System.out.println("文件的副本數:" + file.getReplication());
System.out.println("文件的路徑:" + file.getPath());
System.out.println("文件的權限:" + file.getPermission());
BlockLocation[] blockLocations = file.getBlockLocations();
System.out.println("文件的塊位置信息---------------------------");
for (BlockLocation blk : blockLocations) {
System.out.println("塊長度:" + blk.getLength());
System.out.println("塊在文件中的起始偏移量:" + blk.getOffset());
System.out.println("塊所在的datanode主機:" + Arrays.toString(blk.getHosts()));
}
System.out.println("文件的塊位置信息---------------------------");
}
}
文件如下 :
運行結果:
文件的所屬組:supergroup
文件的所有者:root
文件的訪問時間:1532698212551
文件的塊大?。?34217728
文件的總長度:729927107
文件的修改時間:1532698346956
文件的副本數:3
文件的路徑:hdfs://marshal:9000/aaa/bbb/ideaIU-2018.1.6.win.zip
文件的權限:rw-r--r--
文件的塊位置信息---------------------------
塊長度:134217728
塊在文件中的起始偏移量:0
塊所在的datanode主機:[marshal002, marshal001, marshal]
塊長度:134217728
塊在文件中的起始偏移量:134217728
塊所在的datanode主機:[marshal001, marshal002, marshal]
塊長度:134217728
塊在文件中的起始偏移量:268435456
塊所在的datanode主機:[marshal002, marshal001, marshal]
塊長度:134217728
塊在文件中的起始偏移量:402653184
塊所在的datanode主機:[marshal002, marshal001, marshal]
塊長度:134217728
塊在文件中的起始偏移量:536870912
塊所在的datanode主機:[marshal002, marshal003, marshal]
塊長度:58838467
塊在文件中的起始偏移量:671088640
塊所在的datanode主機:[marshal001, marshal003, marshal]
文件的塊位置信息---------------------------
文件的所屬組:supergroup
文件的所有者:root
文件的訪問時間:1532687744326
文件的塊大?。?34217728
文件的總長度:1622342
文件的修改時間:1532681955786
文件的副本數:3
文件的路徑:hdfs://marshal:9000/haha.docx
文件的權限:rw-r--r--
文件的塊位置信息---------------------------
塊長度:1622342
塊在文件中的起始偏移量:0
塊所在的datanode主機:[marshal, marshal001, marshal003]
文件的塊位置信息---------------------------
文件的所屬組:supergroup
文件的所有者:root
文件的訪問時間:1532684863581
文件的塊大?。?34217728
文件的總長度:139
文件的修改時間:1532511577743
文件的副本數:3
文件的路徑:hdfs://marshal:9000/hdfs-mgmt.sh
文件的權限:rw-r--r--
文件的塊位置信息---------------------------
塊長度:139
塊在文件中的起始偏移量:0
塊所在的datanode主機:[marshal002, marshal001, marshal003]
文件的塊位置信息---------------------------
9 : 查看文件目錄,顯示文件以及文件夾信息
/**
* 查看文件目錄,顯示文件和文件夾信息
* @throws IOException
* @throws InterruptedException
* @throws URISyntaxException
*/
public void testLs2() throws IOException, InterruptedException, URISyntaxException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://cts01:9000/"), conf, "root");
// 思考:為何返回數組?
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus f : listStatus) {
System.out.println(f.getPath());
}
fs.close();
}
運行結果 :
hdfs://marshal:9000/aaa
hdfs://marshal:9000/haha.docx
hdfs://marshal:9000/hdfs-mgmt.sh