Java教程

Java操作HDFS

本文主要是介绍Java操作HDFS,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

我们使用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
这篇关于Java操作HDFS的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!