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