我们使用maven作为依赖管理,首先添加依赖
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.2.0</version> </dependency>
package com.imooc.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import java.io.FileInputStream; import java.net.URI; /** * Java代码操作HDFS * 文件操作:上传文件、下载文件、删除文件 */ public class HdfsOp { public static void main(String[] args) throws Exception{ //创建一个配置对象 Configuration conf = new Configuration(); //指定HDFS的地址 conf.set("fs.defaultFS","hdfs://bigdata01:9000"); //获取操作HDFS的对象 FileSystem fileSystem = FileSystem.get(conf); //获取HDFS文件系统的输出流 FSDataOutputStream fos = fileSystem.create(new Path("/user.txt")); //获取本地文件的输入流 FileInputStream fis = new FileInputStream("~/user.txt"); //上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFSHDFS IOUtils.copyBytes(fis,fos,1024,true); } }
Tips:如果碰到报错
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException)
,可以去掉hdfs的用户权限检验机制,通过在hdfs-site.xml中配置dfs.permissions.enabled为false即可
当然我们在实际使用过程中需要对代码进行封装,我们可以改成以下的形式:
package com.imooc.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import java.io.FileInputStream; import java.io.IOException; import java.net.URI; /** * Java代码操作HDFS * 文件操作:上传文件、下载文件、删除文件 * Created by xuwei */ public class HdfsOp { public static void main(String[] args) throws Exception{ //创建一个配置对象 Configuration conf = new Configuration(); //指定HDFS的地址 conf.set("fs.defaultFS","hdfs://bigdata01:9000"); //获取操作HDFS的对象 FileSystem fileSystem = FileSystem.get(conf); put(fileSystem); } /** * 文件上传 * @param fileSystem * @throws IOException */ private static void put(FileSystem fileSystem) throws IOException { //获取HDFS文件系统的输出流 FSDataOutputStream fos = fileSystem.create(new Path("/user.txt")); //获取本地文件的输入流 FileInputStream fis = new FileInputStream("~/user.txt"); //上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFS IOUtils.copyBytes(fis,fos,1024,true); } }
执行代码,验证文件是否生成,如果有就表示执行成功
private static void get(FileSystem fileSystem) throws IOException{ //获取HDFS文件系统的输入流 FSDataInputStream fis = fileSystem.open(new Path("/README.txt")); //获取本地文件的输出流 FileOutputStream fos = new FileOutputStream("~/README.txt"); //下载文件 IOUtils.copyBytes(fis,fos,1024,true); }
执行删除操作代码
private static void delete(FileSystem fileSystem) throws IOException{ //删除文件,目录也可以删除 //如果要递归删除目录,则第二个参数需要设置为true //如果是删除文件或者空目录,第二个参数会被忽略 boolean flag = fileSystem.delete(new Path("/LICENSE.txt"),true); if(flag){ System.out.println("删除成功!"); } else { System.out.println("删除失败!"); } }
然后到hdfs中验证文件是否被删除,从这里可以看出来/LICENSE.txt文件已经被删除
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -ls / Found 3 items -rw-r--r-- 2 root supergroup 22125 2020-04-08 15:55 /NOTICE.txt -rw-r--r-- 2 root supergroup 1361 2020-04-08 15:55 /README.txt -rw-r--r-- 3 yehua supergroup 17 2020-04-08 20:31 /user.txt