HDFS分布式文件系统—Java API操作
一、HDFS Java API 介绍
1.haoop是java编写的,所以可以使用JAVA API操作Hadoop文件系统,构建一个客户端对象就可以对HDFS上的文件进行增删改查等操作。
2.Configuration:这个类封装客户端或者服务器配置
3.FileSystem:这个类是文件系统对象,有些常用方法对文件进行操作
方法名称 | 方法描述 |
---|---|
copyFromLocalFile(Path src,Path dst) | 从本地磁盘复制文件到HDFS |
copyToLocalFile(Path src,Path dst) | 从HDFS复制文件到磁盘 |
mkdirs(Path f) | 建立子目录 |
rename(Path src,Path dst) | 重命名文件或文件夹 |
delete(Path f) | 删除指定文件 |
Hadoop API 官方文档:hhtp://hadoop.aphace.org/docs/stable/api/index.html
二、Java API操作
1.搭建项目环境
通过IDEA创建Maven工程,并配置pom.xml文件
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies>
2.Java API的相关操作
package com.itcast.hdfsdemo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;
import java.io.FileNotFoundException;
import java.io.IOException;
public class HDFS_CRUD {
FileSystem fs = null;
//1.初刷客户端对象
@Before
public void init() throws Exception{
//构建一个配置参数对象,设置一个参数2:要访问的hdfs的url
Configuration conf = new Configuration();
//这里指定使用的是HDFS
conf.set("fs.defaultFS","hdfs://hadoop01:9000");
// 通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME","root");
//通过FileSystem的静态方法获取文件系统客户端对象
fs = FileSystem.get(conf);
}
//2.上传文件到HDFS
@Test
public void testAddFileToHdfs() throws IOException{
//要上传的文件所在本地路径
Path src = new Path("D:/test.txt");
//要上传到HDFS的目标路径
Path dst = new Path("/testFile");
//上传文件方法
fs.copyFromLocalFile(src,dst);
//关闭资源
fs.close();
}
//3.从HDFS下载文件到本地
@Test
//从HDFS中复制文件到本地文件系统
public void testDownloadFiletoLocal() throws IllegalAccessException,IOException {
//下载文件
fs.copyToLocalFile(new Path("/testFile"), new Path("D:/test.txt"));
fs.close();
}
//4.目录操作
//创建,删除,重命名文件
@Test
public void testMkdirAndDeleteAndRename() throws Exception {
//创建目录
fs.mkdirs(new Path("/a/b/c"));
fs.mkdirs(new Path("/a1/b1/c1"));
//重命名文件或文件夹
fs.rename(new Path("/a1"), new Path("a2"));
//删除文件夹,如果是空文件夹,参数2必须给true
fs.delete(new Path("/a1"), true);
}
//5.查看目录中的文件信息
//查看目录信息,只显示文件
@Test
public void testlistFiles() throws FileNotFoundException,
IllegalArgumentException,IOException {
//获取迭代器对象,这个方法获取文件列表,第一个参数表示获取的路径,第二个参数表示是否递归查询
RemoteIterator<LocatedFileStatus>listFiles = fs.listFiles(new Path("/"),true);
while (listFiles.hasNext()){
LocatedFileStatus fileStatus = listFiles.next();
//打印当前文件名
System.out.println(fileStatus.getPath().getName());
//打印当前文件块的大小
System.out.println(fileStatus.getBlockSize());
//打印当前文件权限
System.out.println(fileStatus.getPermission());
//打印当前文件内容的长度
System.out.println(fileStatus.getLen());
//获取该文件块信息(包括长度,数据块,datanode信息)
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
for (BlockLocation b1: blockLocations) {
System.out.println("block-length:"+b1.getLength()+"--"+"block-offset:"+b1.getOffset());
String[] hosts = b1.getHosts();
for (String host : hosts) {
System.out.println(host);
}
}
System.out.println("分割线----------------");
}
}}