阅读目录
HDFS Java API
HDFS Java API 位于“org.apache.hadoop.fs"包中,这些API能够支持的操作包含打开文件、读写文件、删除文件等。Hadoop类库中最终面向用户提供接口类是FileSystem,该类是个抽象类,只能通过类的get方法得到具体类,该类封装了大部分的文件操作,如mkdir、delete等。更多的API接口说明请访问Hadoop官方网站:Hadoop3.2.1的Java API文档
软件:IntelliJ IDEA
一、创建项目 :example-hdfs
二、修改pom.xml文件
添加以下内容:
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
三、创建类TestHDFSClient.java
在example-hdfs–>src–>main–>java–> 创建一个包cn.itcast.hdfs–>创建一个类TestHDFSClient.java
四、创建文件
在TestHDFSClient.java编写
package cn.itcast.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestHDFSClient {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
//这里指定使用的是HDFS文件系统
conf.set("fs.defaultFS","hdfs://192.168.100.101:9000");
//通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME","root");
//通过FileSystem的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
//也可以通过如下的方式去指定文件系统的类型,并且同时设置用户身份
// FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),conf,"root");
//创建一个文件
fs.create(new Path("/helloByJava"));
//关闭我们的文件系统
fs.close();
}
}
运行成功
运行后在虚拟机查看
命令:hdfs dfs -ls / 或 hadoop fs -ls /
五、下载文件
采用 FileSystem类自带的copyToLocalFile接口下载文件
package cn.itcast.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestHDFSClient {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
//这里指定使用的是HDFS文件系统
conf.set("fs.defaultFS","hdfs://192.168.100.101:9000");
//通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME","root");
//通过FileSystem的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
//也可以通过如下的方式去指定文件系统的类型,并且同时设置用户身份
// FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),conf,"root");
fs.copyToLocalFile(false,new Path("/helloByJava"),new Path("d://"),true); //下载到D盘
//关闭我们的文件系统
fs.close();
}
}
运行成功
运行后查看目录D盘下多了一个文件(helloByJava)
六、上传文件
采用 FileSystem类自带的copyFromLocalFile接口下载文件
package cn.itcast.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestHDFSClient {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
//这里指定使用的是HDFS文件系统
conf.set("fs.defaultFS","hdfs://192.168.100.101:9000");
//通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME","root");
//通过FileSystem的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
//也可以通过如下的方式去指定文件系统的类型,并且同时设置用户身份
// FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),conf,"root");
//上传一个文件hello_hdfs.txt
fs.copyFromLocalFile(new Path("d:/hello_hdfs.txt"),new Path("/"));
//关闭我们的文件系统
fs.close();
}
}
运行成功
运行后在虚拟机查看
命令:hdfs dfs -ls / 或 hadoop fs -ls /
也可以在浏览器上输入http://192.168.100.101:9870(注意:Hadoop3版本是9870,Hadoop2版本是50070)
七、其他常见的操作(这里不做演示了)
创建目录
fs.mkdirs(new Path("/mydir/dir1"));
删除文件夹,如果是非空文件夹,参数2必须给值true
fs.delete(new Path("/mydir"),true);
重命名文件或文件夹
fs.rename(new Path("/a1"),new Path("/a2"));
八、FileSystem类常用方法
方法名称及参数 | 返回值 | 功能 |
---|---|---|
create(Path f) | FSDataOutputStream FSDatalnputStream boolean | 创建一个文件 |
open(Path f) | FSDatalnputStream boolean | 打开指定的文件 |
delete(Path f) | boolean | 删除指定文件 |
exists(Path 1) | boolean | 检查文件是否存在 |
getBlockSize(Path f) | long | 返回指定文件的数据块的大小 |
getLength(Path f) | long | 返回文件长度 |
mkdirs(Path f) | boolean | 建立子目录 |
copyFromLocalFile(Path src,Path dst) | void | 从本地磁盘上传文件到HDFS |
copy ToLocalFile(Path src,Path dst) | void | 从HDFS下载文件到本地磁盘… |
…… | …… | …… |
九、遇到的错误及解决方法
-
问题 1:
Exception in thread “main” java.io.IOException: Incomplete HDFS URI, no host: hdfs://hdfs:node1:9000
解决 1:把node1改成它的IP地址192.168.100.101(根据自己情况来定) -
问题 2:
copyToLocalFile报错:(null) entry in command string: null chmod 0644
解决 2:添加false和true : fs.copyToLocalFile(false,hdfs_path, local_path,true);
说明:第一个false参数表示不删除源文件,第si个true参数表示使用本地原文件系统,因为这个java程序是在Windows系统下运行的 -
问题 3:org.apache.hadoop.io.nativeio.NativeIO$Windows.createFileWithMode0(Ljava/lang/String;JJJI)Ljava/io/F
解决 3:进而分析是因为本人在C:\Windows\System32目录下有hadoop.dll文件或环境变量Path中配置了%Hadoop_Home%/bin目录而导致的。
解决问题3参考博客