目录
- 引言
- API实操
- 1、连接hdfs(一)
- 2、连接hdfs(二)
- 3、创建文件夹
- 4、上传文件
- 5、遍历文件夹
- 6、下载文件
- 7、重命名文件或者文件夹
- 8、删除文件或者文件夹
- 9、小文件合并
引言
HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的API中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件。
API介绍:
1. API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。
2. 可简单理解API是一个中间件,我们的程序通过它实现与系统交互,把各种数据,应用和设备连系在一起,进行协同工作。
下面通过 FileSystem类
API实操
1、连接hdfs(一)
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
public class Test1 {
public static void main(String[] args) throws IOException {
Configuration conf=new Configuration();
//如果我们没有给conf设置文件系统,那么fileSystem默认获取的是本地文件系统的一个实例
//若是我们设置了“fs.defaultFS”参数,这表示获取的是该 URI 的文件系统的实例,就是我们需要的 HDFS 集群的一个 fs 对象
conf.set("fs.defaultFS", "hdfs://localhost:9000");
//获取文件系统对象
FileSystem fs=FileSystem.get(conf);
//打印URI地址
System.out.println(fs.getUri());
}
}
2、连接hdfs(二)
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
public class Test2 {
public static void main(String[] args) throws InterruptedException, URISyntaxException, IOException {
Configuration conf = new Configuration();
// 不需要配置“fs.defaultFS”参数,直接传入URI和用户身份,最后一个参数是安装Hadoop集群的用户,我的是“root”
FileSystem fs = FileSystem.get(new URI("hdfs://localhost:9000"), conf, "root");
//打印URI地址
System.out.println(fs.getUri());
}
}
3、创建文件夹
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
public class MkDemo {
@Test
public void mkdirs() throws Exception{
//获取fs对象
FileSystem fileSystem = FileSystem.get(new URI("hdfs://localhost:9000"), new Configuration());
//创建文件夹
boolean mkdirs = fileSystem.mkdirs(new Path("/test"));
//关闭资源
fileSystem.close();
}
}
4、上传文件
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
public class PutDemo{
@Test
public void putData() throws Exception{
//获取fs对象
FileSystem fileSystem = FileSystem.get(new URI("hdfs://localhost:9000"), new Configuration());
//上传文件
fileSystem.copyFromLocalFile(new Path("/root/test.txt"),new Path("/test"));
//关闭资源
fileSystem.close();
}
}
5、遍历文件夹
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Test;
public class ListDemo {
@Test
public void listMyFiles() throws Exception{
//获取fileSystem类
FileSystem fileSystem = FileSystem.get(new URI("hdfs://localhost:9000"), new Configuration());
//获取RemoteIterator 得到所有的文件或者文件夹,第一个参数指定遍历的路径,第二个参数表示是否要递归遍历
RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("/"), true);
//遍历文件夹
while (locatedFileStatusRemoteIterator.hasNext()){
LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
//获取路径值
System.out.println(next.getPath().toString());
}
//关闭资源
fileSystem.close();
}
}
6、下载文件
import java.io.Exception;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class GetDemo{
// 单元方法:下载文件
@Test
public void downLoadFileToLocal() throws Exception {
//获取fs对象
FileSystem fs = FileSystem.get(new URI("hdfs://localhost:9000"), new Configuration(), "root");
// src:要下载的文件所在的HDFS路径 dst:要下载到本地的目标路径
Path src = new Path("/test/test.txt");
Path dst = new Path("/root");
// 默认不删除HDFS源路径的文件,覆盖本地同名文件
fs.copyToLocalFile(src, dst);
//关闭资源
fs.close();
}
}
7、重命名文件或者文件夹
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
public class ReDemo {
// 单元方法:重命名文件或者文件夹
@Test
public void renameFileOrDir() throws IllegalArgumentException, IOException, InterruptedException, URISyntaxException {
//获取fs对象
FileSystem fs=FileSystem.get(new URI("hdfs://localhost:9000"),new Configuration(),"root");
//重命名文件
fs.rename(new Path("/test/test.txt"), new Path("/tmp/tmp.txt"));
//重命名文件夹
fs.rename(new Path("/test"), new Path("/tmp"));
}
}
8、删除文件或者文件夹
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class RmDemo {
//单元方法:删除文件或者文件夹
@Test
public void deleteFileOrDir() throws IllegalArgumentException, IOException, InterruptedException, URISyntaxException{
//获取fs对象
FileSystem fs = FileSystem.get(new URI("hdfs://localhost:9000"), new Configuration(), "root");
//删除文件,第二参数:是否递归,若是文件或者空文件夹时可以为false,若是非空文件夹则需要为true
fs.delete(new Path("/tmp/tmp.txt"),false);
//删除文件夹
fs.delete(new Path("/tmp"), true);
fs.close();
}
}
9、小文件合并
import java.net.URI;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
public class MergeDemo {
@Test
public void mergeFile() throws Exception{
//获取分布式文件系统
FileSystem fileSystem = FileSystem.get(new URI("hdfs://localhost:9000"), new Configuration(),"root");
//创建文件
FSDataOutputStream outputStream = fileSystem.create(new Path("/merge.txt"));
//获取本地文件系统
LocalFileSystem local = FileSystem.getLocal(new Configuration());
//通过本地文件系统获取文件列表集合
FileStatus[] fileStatuses = local.listStatus(new Path("/root/input"));
//迭代遍历列表集合
for (FileStatus fileStatus : fileStatuses) {
//获取数据
FSDataInputStream inputStream = local.open(fileStatus.getPath());
//拷贝数据
IOUtils.copy(inputStream,outputStream);
//关闭输入流资源
IOUtils.closeQuietly(inputStream);
}
//关闭资源
IOUtils.closeQuietly(outputStream);
local.close();
fileSystem.close();
}
}