Hadoop之HDFS(二)java客户端操作
java客户端操作
- 核心API
API 含义和作用 Configuration
配置信息,封装hdfs操作的相关配置文件信息 FileSystem
HDFS的分布式文件系统工具,操作HDFS文件。 IOUtils
IO操作的工具类 Path
封装表示HDFS文件路径
- 配置windows的Hadoop执行环境
1. 将hadoop2.9.2解压到window中,路径不能有中文,不能有空格。
2. 拷贝hadoop的windows执行环境工具到bin路径下,替换客户端工具。
3. 配置环境变量
HADOOP_HOME=hadoop安装路径
PATH=hadoop安装路径/bin
4. 重启IDEA或者eclipse
- 加入Hadoop依赖
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.9.2</version>
</dependency>
- 导入log4j.properties(从Linux的Hadoop目录下etc中拷贝)
java常见操作
- 文件下载
//HDFS文件下载
@Test
public void test01() throws IOException {
//1.创建配置信息,关联HDFS信息:Configuration
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://hadoop10:9000");
//2.获得操作HDFS文件的工具
FileSystem fileSystem = FileSystem.get(configuration);
//3.通过命令获得java的输入流
FSDataInputStream fsDataInputStream = fileSystem.open(new Path("/demo/test.tar.gz"));
//4.IO操作数据
FileOutputStream fileOutputStream = new FileOutputStream("D:/test.tar.gz");
IOUtils.copyBytes(fsDataInputStream, fileOutputStream, 1024, true);
}
封装FileSystem
配置信息转移文件
将配置文件core-site.xml拷贝到java项目的resources文件夹中
导入log4j配置文件
使用classpath类加载输入流指向core-site.xml
InputStream is = Test1.class.getResourceAsStream("/core-site.xml")
- 讲配置文件加入封装到Configuration
conf.addResource(is)
- 文件上传
注意:需要给windows的用户开启hdfs文件创建权限
否则会出现:Permission denied: user=X230, access=WRITE, inode="/hdfs":root:supergroup:drwxr-xr-x
//HDFS文件上传
@Test
public void test03() throws IOException {
//1.获得FileSystem
//将配置文件core-site.xml拷贝到java项目的resources文件夹中,将配置读取到输入流中
InputStream inputStream = HDFSUtil.class.getResourceAsStream("/core-site.xml");
Configuration configuration = new Configuration();
//将配置文件加入封装到configuration中
configuration.addResource(inputStream);
//获得操作HDFS文件的工具
FileSystem fileSystem = FileSystem.get(configuration);
//2.获得输出到远程HDFS的输出流
FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/demo/test2.tar.gz"));
//3.获得java本地读入文件的输入流
FileInputStream fileInputStream = new FileInputStream("D:/test.tar.gz");
//4.IOUtils操作
IOUtils.copyBytes(fileInputStream, fsDataOutputStream, 2014, true);
}
-
创建文件夹
注意:需要给windows的用户开启hdfs文件创建权限
boolean isok = fileSystem.mkdir(new Path("/baizhi/yangdddir"));//返回值boolean,是否创建成功。
- 判断文件是否存在
boolean isexist = fileSystem.exists(new Path("/baizhi/yangdd"))
-
删除文件
注意:需要给windows的用户开启hdfs文件创建权限
-rm -r
/**
参数1:远端hdfs的文件路径
参数2:是否递归删除,如果给false,删除无法递归则会抛出异常
返回值:是否删除成功
*/
Boolean deleteOK = fileSystem.delete(new Path("hdfs文件路径"),true);
- 展示文件的元数据信息
// 获得目录下所有文件的
FileStatus[] fileStatuses = fs.listStatus(new Path("/hdfs"));
for (FileStatus file : fileStatuses) {
//1. 获得文件路径
Path path = file.getPath();
//2. 获得文件权限
FsPermission permission = file.getPermission();
//3. 获得文件副本数
short replication = file.getReplication();
//4. 获得文件修改时间,long的时间戳
long modificationTime = file.getModificationTime();
//5. 获得文件大小,单位B
long len = file.getLen();
}
- 递归遍历文件,并且可以获取文件块所在的位置
/**
* 功能:递归获得目录下的所有文件的元数据信息,相当于hdfs的ls命令
* listFiles参数1:要查看的目录
* listFiles参数2:是否递归 -R
*/
RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/hdfs"), true);
while(files.hasNext()){
//迭代获得每个file元数据
LocatedFileStatus file = files.next();
//1. 获得文件路径
Path path = file.getPath();
//2. 获得文件权限
FsPermission permission = file.getPermission();
//3. 获得文件副本数
short replication = file.getReplication();
//4. 获得文件修改时间,long的时间戳
long modificationTime = file.getModificationTime();
//5. 获得文件大小,单位B
long len = file.getLen();
//6. 获得block的切片分布信息
BlockLocation[] blockLocations = file.getBlockLocations();
}
其他常见方法(了解)
方法 含义 fs.getDefaultBlockSize(hdfs的path); 获得默认block大小 fs.getFileChecksum(hdfs的path); 获得checksum(指纹 数字签名) fs.getDefaultReplication(hdfs的path); 获得默认副本集
Client上传下载原理
文件下载流程
文件上传流程