配置windows平台的Hadoop环境
在 windows 上做 HDFS 客户端应用开发,需要设置 Hadoop 环境,而且要求是windows 平台编译的 Hadoop,不然会报以下的错误:
Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable nullinwinutils.exe in the Hadoop binaries.
参考:https://blog.csdn.net/huyishero/article/details/72896484
创建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>
客户端对象
在 java 中操作 HDFS,主要涉及以下 Class:
Configuration:该类的对象封转了客户端或者服务器的配置;
FileSystem:该类的对象是一个文件系统对象,可以用该对象的一些方法来对文件进行操作,通过 FileSystem 的静态方法 get 获得该对象。
FileSystem fs = FileSystem.get(conf)
get 方法从 conf 中的一个参数 fs.defaultFS 的配置值判断具体是什么类型的文件系统。如果我们的代码中没有指定 fs.defaultFS,并且工程 classpath下也没有给定相应的配置,conf中的默认值就来自于hadoop的jar包中的core-default.xml , 默认值 为 : file:/// ,则获取的将 不 是 一 个DistributedFileSystem 的实例,而是一个本地文件系统的客户端对象。
示例代码
1 public class TestHDFS { 2 3 public static void main(String[] args) throws Exception{ 4 Configuration conf = new Configuration(); 5 //指定使用的是hdfs文件系统 6 // conf.set("fs.defaultFS","hdfs://node-1:9000"); 7 8 //FileSystem是hadoop操作文件系统的核心类 9 //通过FileSystem的静态方法获取文件系统客户端对象 10 // FileSystem fs = FileSystem.get(conf); 11 //设置uri,conf,用户身份 12 FileSystem fs = FileSystem.get(new URI("hdfs://node-1:9000"),conf,"root"); 13 14 //创建一个文件夹 15 // fs.mkdirs(new Path("/createByJava")); 16 //上传文件 17 // fs.copyFromLocalFile(new Path("D:\test.txt"),new Path("/createByJava/test.txt")); 18 //下载文件 19 // fs.copyToLocalFile(new Path("/createByJava/test.txt"),new Path("D:\test\test.txt")); 20 21 //stream形式读取本地的一个文件 22 FileInputStream in = new FileInputStream(new File("D:\test.txt")); 23 //创建一个文件 24 FSDataOutputStream out = fs.create(new Path("/test.txt")); 25 //stream形式将本地文件上传到hdfs 26 IOUtils.copy(in,out); 27 28 fs.close(); 29 } 30 }