HDFS 在生产应用中主要是 Java 客户端的开发,其核心步骤是从 HDFS 提供的 API 中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS 上的文件。
客户端核心类:
- Configuration :配置对象类,用于加载或设置参数属性。
- FileSystem:文件系统对象基类,针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。
API 核心类
org.apache.hadoop.conf.Configuration
org.apache.hadoop.conf.Configuration是配置对象类,封装了客户端或服务器的配置,用于加载或设置参数属性。
配置信息都是 hadoop 的默认配置,如果想要将配置修改成用户自定义配置,可以通过两种方式:
org.apache.hadoop.fs.FileSystem
org.apache.hadoop.fs.FileSystem 是文件系统对象抽象基类,针对不同文件系统有不同具体实现,可以被分布式文件系统继承。该类封装了文件系统的相关操作方法。
所有可能使用 Hadoop 文件系统的代码,都会用到这个类。虽然 Hadoop 为 FileSystem 提供了很多的具体实现,但是还是建议使用该抽象类完成文件系统的操作,这样做可以在不同的文件系统中移植。
方式一
主要用于在配置信息对象中已经指定了 Hadoop 的文件系统。
1
| FileSystem fs = FileSystem .get (Configuration conf );
|
方式二
用于在 conf(配置信息对象)中没有指定 Hadoop 使用的文件系统时,通过 URI 指定文件系
统。
1
| FileSystem fs = FileSystem .get (URI arg0 , Configuration arg1 );
|
方式三
用于在 conf(配置信息对象)中没有指定 Hadoop 使用的文件系统时,通过 URI 指定文件系
统,同时指定用户名。
1 2
| FileSystem fs = FileSystem .get (URI uri , Configuration conf , String user )
|
API操作HDFS文件系统
获取连接
1 2 3 4 5 6 7 8 9 10 11
| Configuration conf = new Configuration ();
FileSystem fs = FileSystem.get(new URI ("hdfs://192.168.59.100:9000" ), conf ); System .out .println ("获取连接成功 ~" );
fs .close (); }
|
如果报权限错误,可添加一行语句设置客户端的访问权限:
1 2 3 4 5 6 7 8 9 10 11
| System.setProperty("HADOOP_USER_NAME","root");
Configuration conf = new Configuration ();
conf.set("fs.defaultFS", "hdfs://192.168.59.100:9000");
fs = FileSystem.get(conf); System .out .println ("获取连接成功 ~" ); fs.close();
|
文件操作
查看目录
org.apache.hadoop.fs.FileStatus :一个用于向客户端展示系统中的文件和目录的元数据的接口。展示的信息包括:路径、文件大小、块大小、副本信息、所有者、群组、修改时间等。
获得具体的实例对象方法如下:
1
| FileSystem .listStatus ();
|
查看目录代码具体内容如下:
1 2 3 4 5 6 7
| FileStatus[] arr = fs.listStatus(new Path("/"));
for (FileStatus f : arr) { System.out.println(f); }
|
创建文件夹
1 2 3 4
| if (!fs.exists(new Path("/idea"))){ fs.mkdirs(new Path("/idea")); }
|
上传文件
1 2 3 4 5 6 7 8 9 10 11 12
| InputStream in = new FileInputStream(new File("HDFSTest.txt"));
FSDataOutputStream out = fs.create(new Path("/HDFSTest.txt"));
IOUtils.copyBytes(in, out, conf);
out.close(); in.close();
|
或:
1 2 3 4 5 6 7
| Path src = new Path("D:\\Desktop\\setup.txt");
Path dst = new Path("/idea/setup.txt");
fs.copyFromLocalFile(src,dst);
|
下载文件
1 2 3 4 5 6 7 8
| FSDataInputStream in = fs.open(new Path("/idea/setup.txt"));
OutputStream out = new FileOutputStream(new File("D:/setup.txt"));
IOUtils.copyBytes(in, out, conf);
out.close(); in.close();
|
或:
1 2 3 4 5 6 7
| Path src = new Path("/idea/setup.txt");
Path dst = new Path("D:/setup.txt");
fs.copyToLocalFile(src,dst);
|
删除文件
1 2 3 4 5 6 7 8 9 10 11 12
| fs.delete(new Path("/.txt.txt"));
fs.delete(new Path("/park04"));
fs.delete(new Path("/park01"));
fs.delete(new Path("/park01"), false);
|
查看文件内容
1 2 3 4 5 6 7 8 9 10
| FSDataInputStream in = fs.open(new Path("/test1.txt"));
BufferedReader read = new BufferedReader(new InputStreamReader(in,"utf-8"));
String line = null; while((line=read.readLine())!=null){ System.out.println(line); }
|
文件查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class RegexPathFilter implements PathFilter {
private String regex;
public RegexPathFilter(String regex) { this.regex = regex; }
@Override public boolean accept(Path path) { return path.toString().matches(regex); } }
|
1 2 3 4 5 6
| FileStatus[] listStatuses = fs.listStatus(new Path("/"), new RegexPathFilter("^.*(.txt)+$"));
for (FileStatus f : listStatuses) { System.out.println(f); }
|
重命名/移动
1 2 3 4 5 6 7 8
| fs.rename(new Path("/setup.txt"), new Path("/null.txt"));
fs.rename(new Path("/null.txt"), new Path("/idea"));
fs.rename(new Path("/idea/null.txt"), new Path("/move.txt"));
|