如何使用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
文件的块大小:134217728
文件的总长度: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
文件的块大小:134217728
文件的总长度:1622342
文件的修改时间:1532681955786
文件的副本数:3
文件的路径:hdfs://marshal:9000/haha.docx
文件的权限:rw-r--r--
文件的块位置信息---------------------------
块长度:1622342
块在文件中的起始偏移量:0
块所在的datanode主机:[marshal, marshal001, marshal003]
文件的块位置信息---------------------------
文件的所属组:supergroup
文件的所有者:root
文件的访问时间:1532684863581
文件的块大小:134217728
文件的总长度: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