java操作HDFS代码实现

自己做的一些小训练0.0

public class HDFSDemo {
	
	private Configuration conf;
	private FileSystem fs;
	
	@Before
	public void before() throws Exception {
		//初始化,加载hadoop默认的配置文件,如果有指定的位置,则覆盖默认的配置
		conf=new Configuration(true);
		//创建了一个文件系统对象,封装了一个对HDFS的客户端连接
		fs=FileSystem.get(conf);
		
	}
	@After
	public void after() throws IOException {
		//关闭到HDFS的连接
		fs.close();
	}
	
	@Test
	public void testWrite() throws Exception {
		//获取本地文件输入流
		FileInputStream fis=new FileInputStream("E:\\usr\\local\\hadoop-2.6.5-src.zip");
		//在hdfs创建元数据,并返回输出流用于想HDFS上传数据
		//创建成功则返回一个FSDataOutputStream对象,失败则抛出异常
		/*
		 * create方法在namenode创建元数据
		 * 
		 * 文件路径
		 * 所有者
		 * 创建信息
		 * blk信息并没有
		 * 每次上传一个blk,FSDataOutputStream会向NameNode请求分配相应的id,同时NameNode返回DataNode列表,
		 * 该blk应该放在哪几个DataNode上,等上传完成,DataNode向NameNode报告自己存储的blk信息,NameNode便知晓了对应id
		 * 的blk的存放位置信息
		 * 每次上传blk均要走上述流程
		 * 
		 * 上传完毕后,NameNode知道该文件由多少个blk组成,每个blk所在的位置
		 */
		FSDataOutputStream dos = fs.create(new Path("/usr/local/hadoop-2.6.5-src.zip"));
		
		byte[] buf=new byte[1024];
		int len = -1;
		while((len=fis.read(buf))!=-1) {
			dos.write(buf, 0, len);
		}
		
		fis.close();
		dos.flush();
		dos.close();
		
	}
	@Test
	public void testWrite2() throws Exception {
		//获取本地文件输入流
		FileInputStream fis=new FileInputStream("E:\\usr\\local\\hadoop-2.6.5-src.zip");
		//在hdfs创建元数据,并返回输出流用于想HDFS上传数据
		//创建成功则返回一个FSDataOutputStream对象,失败则抛出异常
		/*
		 * create方法在namenode创建元数据
		 * 
		 * 文件路径
		 * 所有者
		 * 创建信息
		 * blk信息并没有
		 * 每次上传一个blk,FSDataOutputStream会向NameNode请求分配相应的id,同时NameNode返回DataNode列表,
		 * 该blk应该放在哪几个DataNode上,等上传完成,DataNode向NameNode报告自己存储的blk信息,NameNode便知晓了对应id
		 * 的blk的存放位置信息
		 * 每次上传blk均要走上述流程
		 * 
		 * 上传完毕后,NameNode知道该文件由多少个blk组成,每个blk所在的位置
		 */
		FSDataOutputStream dos = fs.create(new Path("/usr/local/hadoop-2.6.5-src2.zip"));
		
		IOUtils.copyBytes(fis, dos, conf);
		
		fis.close();
		dos.flush();
		dos.close();
	}
	
	@Test
	public void downloadTest() throws IllegalArgumentException, IOException {
		//获取HDFS上文件的元数据
		FSDataInputStream dis = fs.open(new Path("/usr/local/hadoop-2.6.5-src2.zip"));
		//获取本地文件的输出流,目标文件
		FileOutputStream fos=new FileOutputStream("E:\\test.zip");
		/*
		 * 当读取第i个block时,FileOutputStream对象询问NameNode该blk的位置
		 * NameNode返回给该对象含有该blk的DataNode列表(node2,node3,node4)
		 * 该对象选择一个相邻最近的blk进行读取
		 */
		IOUtils.copyBytes(dis, fos, conf);
		
		dis.close();
		fos.flush();
		fos.close();
	
	}
	
	@Test
	public void testLs() throws AccessControlException, FileNotFoundException, UnsupportedFileSystemException, IllegalArgumentException, IOException {
		//查看具体文件的元数据
		/*FileStatus fss = fs.getFileLinkStatus(new Path("/usr/local"));
		System.out.println(fss);*/
		
		//该数据从NameNode获取,获取指定HDFS路径下的文件信息,类似于linux中的ls命令
		FileStatus[] fsses = fs.listStatus(new Path("/usr/local"));
		
		for (FileStatus fileStatus : fsses) {
			System.out.println(fileStatus);
		}
		
	}
	
	@Test
	public void testDelete() throws IllegalArgumentException, IOException {
		//第一个参数表示要删除的目录和文件,第二个参数表示是否迭代删除
		//若目标文件为空文件,则第二参数随意
		//若目标文件不为空文件,则删除失败,抛出异常
		boolean delete = fs.delete(new Path("/usr/local/hadoop-2.6.5-src2.zip"),true);
		//boolean delete = fs.delete(new Path("/user/"),false);

		System.out.println(delete ? "删除成功":"删除失败");
	}
	
	@Test
	public void testLocation() throws AccessControlException, FileNotFoundException, UnsupportedFileSystemException, IOException {
		Path path=new Path("/usr/local/hadoop-2.6.5-src.zip");
		
		FileStatus fss = fs.getFileLinkStatus(path);
		
		//获取文件长度
		long len = fss.getLen();
		//根据文件元数据和文件的起始位置以及文件的长度来获取blk的位置信息
		BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fss, 0, len);
	/*
	 * 偏移量,blk长度,blk位置列表
	 * 0,24934907,node2,node4
	 */
		for (BlockLocation blockLocation : fileBlockLocations) {
			System.out.println(blockLocation);
		}
	}	
}

猜你喜欢

转载自blog.csdn.net/s_pr1te/article/details/89220176