HDFS-API入门方法测试

1.普通操作测试

package hdfsTest;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

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.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

public class TestJavaAPI {
	public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {
		System.setProperty("HADOOP_USER_NAME", "root");
		Configuration conf=new Configuration();
		FileSystem fs=FileSystem.get(conf);
		//FileSystem fs=FileSystem.get(new URI("hdfs://hadoop01:9000"), conf, "root");
		//基本操作
		//文件夹的相关操作
	
		
		//报错-权限问题:Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=chx, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
		/*
		 * 解决办法:
		 * 1)提交代码指定用户名--右键 run configuration
		 * 	program arguments 应用程序参数
		 * 	代码中需要的参数
		 *  VM arguments VM参数
		 *  代码提交用户 JVM参数
		 *  -DHADOOP_USER_NAME=root 
		 * 2)在代码中修改
		 * 	方式1
		 *	conf.set("fs.defaultFS", "hdfs://hadoop01:9000");
		 *	方式2
		 *	FileSystem fs=FileSystem.get(new URI("hdfs://hadoop01:9000"), conf, "root");
		 * 3)修改windows的环境变量	
		 * 	系统变量
		 * 	HADOOP_USER_NAME
		 *	root 
		 *
		 */
		//封装path
		Path path=new Path("/bd1906/aa/bb1");
		//参数:path
		//创建文件夹
		fs.mkdirs(path);
		
		//删除目录
		//参数1:需要删除的目录,参数2:是否需要级联删除
//		if(fs.exists(new Path("/Saved Pictures"))) {
//			boolean delete=fs.delete(new Path("/Saved Pictures"), true);
//			if(delete) {
//				System.out.println("删除成功");
//			}else{
//				System.out.println("删除失败");
//			}
//		}else {
//			System.out.println("不存在");
//		}
		//文件上传
		//参数1:本地	参数2:hdfs
		//注意:文件副本默认为3,在源码中设置的
//		fs.copyFromLocalFile(new Path("C:\\Users\\chx\\Pictures\\Saved Pictures"), new Path("/"));
//		fs.moveFromLocalFile(new Path("C:\\Users\\chx\\Pictures\\Saved Pictures\\840.jpg"), new Path("/"));
		//文件下载
		/*
		 * 会生成一个crc文件,crc文件在Linux中是没有的
		 * 原因:Linux中把这个文件删了
		 * crc文件:校验下载的数据是否丢失,crc是一种文件校验的算法
		 * 如何校验:
		 * 数据上传的时候有一个.meta文件,每一个块一个.meta文件,这个文件是元数据文件,检验的就是这个元数据文件中的元数据信息,只要我们的文件一旦上传成功,每个文件的元数据文件就不可改变
		 * 
		 * 当修改块中的副本内容
		 * 1)只修改一个块中的一个副本
		 * 	可以正常下载,从未修改的副本中就近原则下载
		 * 	被修改的文件将会被立即删除,重新复制出新的副本,达到副本设定个数
		 * 2)修改所有的副本内容
		 * 就会下载失败 报错:BlockMissingException
		 * 
		 * 
		 * 当添加内容到末尾
		 * 是可以下载成功的,因为检验的范围是文件中间的偏移量,不包括末尾信息
		 * 当文件发生损坏要立刻删除该文件,否则集群的启动可能会出现异常
		 */		
//		fs.copyToLocalFile(new Path("/redis-3.2.6.tar.gz"), new Path("D:\\"));
		//只能查看文件
//		RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"),false);
//		while(listFiles.hasNext()) {
//			LocatedFileStatus lf=listFiles.next();
//			System.out.println(lf.getPath());//获取文件路径
//			System.out.println(lf.getPath().getName());//获取文件名
//			System.out.println(lf.getLen());//1544806   --Size: 1544806,是文件的实际大小
//			System.out.println(lf.getBlockSize());//134217728	获取块大小128M--配置文件中的块大小
//			System.out.println(lf.getReplication());//获取副本数
//			//获取文件的块的信息,有几个块,数组就有几个元素
//			BlockLocation[] blockLocations = lf.getBlockLocations();
//			System.out.println(Arrays.toString(blockLocations));//[0,1544806,hadoop02,hadoop03]--第一个块从0到1544806,副本存在的主机hadoop01和hadoop02
//			/*
//			 * BlockLocation 块的封装对象
//			 * 封装的是块信息,一个块编号封装一个
//			 */
//			for(BlockLocation i:blockLocations) {
//				System.out.println(i);
//				System.out.println(i.getOffset());//块的起始偏移量
//				System.out.println(i.getLength());//块的实际大小
//				System.out.println(Arrays.toString(i.getHosts()));//块存储的主机
//			}	
//		}
		//查看指定路径下的文件和目录
		//一个文件会对应数组中的一个元素
		/*
		 * 
		 */
//		FileStatus[] listStatus = fs.listStatus(new Path("/"));
//		System.out.println(listStatus.length);
//		for(FileStatus fls:listStatus) {
//			System.out.println(fls);
//			if(fls.isFile()) {//判断是否是文件
//				System.out.println(fls.getLen());//1544806获取文件的实际大小
//				System.out.println(fls.getGroup());//supergroup获取分组
//				System.out.println(fls.getBlockSize());//134217728获取块大小
//				System.out.println(fls.getReplication());//2获取副本数
//				System.out.println(fls.getOwner());//获取所属用户
//				System.out.println(fls.isDirectory());//是否是目录
//			}
//			System.out.println("======");
//			if(fls.isDirectory()) {//判断是否为目录
//				System.out.println(fls.getLen());//1544806获取文件的实际大小
//				System.out.println(fls.getGroup());//supergroup获取分组
//				System.out.println(fls.getBlockSize());//134217728获取块大小
//				System.out.println(fls.getReplication());//2获取副本数
//				System.out.println(fls.getOwner());//获取所属用户
//				System.out.println(fls.isDirectory());//是否是目录
//			}
//		}
		fs.close();
		System.out.println();
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl·杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值