1、HDFS的JAVA API操作
HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件。
2、搭建开发环境
2.1创建Maven工程
引入pom依赖
<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>
</dependencies>
2.1构造客户端对象
在 java 中操作 HDFS,主要涉及以下 Class:
Configuration:该类的对象封转了客户端或者服务器的配置;
FileSystem:该类的对象是一个文件系统对象,可以用该对象的一些方法来
对文件进行操作,通过 FileSystem 的静态方法 get 获得该对象。
Configuration:该类的对象封转了客户端或者服务器的配置;
FileSystem:该类的对象是一个文件系统对象,可以用该对象的一些方法来
对文件进行操作,通过 FileSystem 的静态方法 get 获得该对象。
FileSystem fs = FileSystem.get(conf)
get 方法从conf中的一个参数fs.defaultFS的配置值判断具体是什么类型的文件系统。如果我们的代码中没有指定 fs.defaultFS,并且工程classpath下也没有给定相应的配置,conf中的默认值就来自于hadoop的 jar包中的core-default.xml , 默 认 值 为:file:/// ,则获取的将不是一个
DistributedFileSystem的实例,而是一个本地文件系统的客户端对象。
get 方法从conf中的一个参数fs.defaultFS的配置值判断具体是什么类型的文件系统。如果我们的代码中没有指定 fs.defaultFS,并且工程classpath下也没有给定相应的配置,conf中的默认值就来自于hadoop的 jar包中的core-default.xml , 默 认 值 为:file:/// ,则获取的将不是一个
DistributedFileSystem的实例,而是一个本地文件系统的客户端对象。
创建文件夹
public static void main(String[] args) throws Exception{
Configuration conf=new Configuration();
//这里指定使用的是 hdfs 文件系统
conf.set("fs.defaultFS","hdfs://xiongpeng:9000");
//通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME","root");
//通过 FileSystem 的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
//也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
//FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
//创建一个文件夹
fs.mkdirs(new Path("/hdfsbyjavas"));
//关闭我们的文件系统
fs.close();
}
注意:hdfs操作需要进行客户端身份的设置
第一种方法如下:
System.setProperty("HADOOP_USER_NAME","root");
还有一种是指定文件系统的类型并且同时设置用户身份,如下:
FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
创建一个文件
public static void main(String[] args) throws Exception{
Configuration conf=new Configuration();
//这里指定使用的是 hdfs 文件系统
conf.set("fs.defaultFS","hdfs://xiongpeng:9000");
//通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME","root");
//通过 FileSystem 的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
//也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
//FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
//创建一个文件
fs.create(new Path("/hdfsbyjava"));
//关闭我们的文件系统
fs.close();
}
上传文件
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
//这里指定使用的是 hdfs 文件系统
conf.set("fs.defaultFS","hdfs://xiongpeng:9000");
//通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME","root");
//通过 FileSystem 的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
//也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
//FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
//上传一个文件
fs.copyFromLocalFile(new Path("e:/sql.txt"), new Path("/hdfsbyjavas/sql.txt"));
//关闭我们的文件系统
fs.close();
}
下载文件
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
//这里指定使用的是 hdfs 文件系统
conf.set("fs.defaultFS","hdfs://xiongpeng:9000");
//通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME","root");
//通过 FileSystem 的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
//也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
//FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
fs.copyToLocalFile(new Path("/hdfsbyjavas/sql.txt"),new Path("d://"));
//关闭我们的文件系统
fs.close();
}
注意:windows平台可能会出现如下报错
Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
这是因为在windows上做HDFS客户端应用开发,需要设置Hadoop环境,而且要求是windows平台编译的Hadoop。