欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

彷徨 | HDFS客户端API编程基本java操作 | 一

程序员文章站 2022-05-18 16:33:44
...

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();
	}

上传结果:

彷徨 | HDFS客户端API编程基本java操作 | 一

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();
	}

创建结果:

彷徨 | HDFS客户端API编程基本java操作 | 一

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();
	}

下载结果:

彷徨 | HDFS客户端API编程基本java操作 | 一

方法二 : 此方法不需要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();
	}

下载结果:

彷徨 | HDFS客户端API编程基本java操作 | 一

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();
	}

删除之前:

彷徨 | HDFS客户端API编程基本java操作 | 一

删除之后:

彷徨 | HDFS客户端API编程基本java操作 | 一

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();
	}

重命名之前:

彷徨 | HDFS客户端API编程基本java操作 | 一

重命名之后:

彷徨 | HDFS客户端API编程基本java操作 | 一

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();
	}

文件 :

彷徨 | HDFS客户端API编程基本java操作 | 一

判断结果 : 不存在

彷徨 | HDFS客户端API编程基本java操作 | 一

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("文件的块位置信息---------------------------");
		}
	}

文件如下 : 

彷徨 | HDFS客户端API编程基本java操作 | 一

彷徨 | HDFS客户端API编程基本java操作 | 一

运行结果:

文件的所属组: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

写的不好 , 请多关照 ! ! ! 

希望可以帮到大家

相关标签: HDFS 客户端