大数据技术之Hadoop(HDFS文件系统 API操作HDFS)

一、HDFS获取文件系统

方法一

import static org.junit.Assert.*; 
import java.net.URI; 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.NewAppWeightBooster;
import org.junit.Test; 
import sun.nio.ch.Net; 	
	//HDFS获取文件系统	
	@Test	
	public void initHDFS() throws Exception {		
		//1.创建对象		
		Configuration configuretion = new Configuration();				
		//2.设置参数		
		configuretion.set("fs.defaultFS","hdfs://node1:9000");		
		configuretion.set("dfs.replication", "3");				
		//3获取文件系统		
		FileSystem fs = FileSystem.get(configuretion);				
		//4打印		
		System.out.println(fs.toString());	
	}

方法二
(1) 首先src根目录下创建 core-site.xml ,配置信息如下
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
<configuration>     
	<!-- 指定HDFS中NameNode的地址 -->	
	<property>		
		<name>fs.defaultFS</name>        
		<value>hdfs://node1:9000</value>	
	</property> 	
	<!-- 指定hadoop运行时产生文件的存储目录 -->	
	<property>		
		<name>hadoop.tmp.dir</name>		
		<value>/opt/module/hadoop-2.8.2/data/tmp</value>	
	</property> 	
</configuration>

(2) 不用配置参数了,默认读取core-site.xml 信息

	//HDFS获取文件系统	
	@Test	
	public void initHDFS() throws Exception {		
		//1.创建对象		
		Configuration configuretion = new Configuration();				
		//2获取文件系统		
		FileSystem fs = FileSystem.get(configuretion);				
		//3打印		
		System.out.println(fs.toString());	
	}

二、HDFS文件上传

(1)code

	@Test	
	public void putFileToHDFS() throws Exception{		
	// 1 创建配置信息对象		
	// new Configuration();的时候,它就会去加载jar包中的hdfs-default.xml		
	// 然后再加载classpath下的hdfs-site.xml		
	Configuration configuration = new Configuration(); 		
	// 2 设置参数 		
	// 参数优先级: 1、客户端代码中设置的值  2、classpath下的用户自定义配置文件 3、服务器的默认配置		
	configuration.set("dfs.replication", "2"); 		
	FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");				
	// 3 创建要上传文件所在的本地路径		
	Path src = new Path("e:/hello.txt");				
	// 4 创建要上传到hdfs的目标路径		
	Path dst = new Path("hdfs://node1:9000/user/victor/hello.txt");				
	// 5 拷贝文件		
	fs.copyFromLocalFile(src, dst); 
	// 6 关闭资源		
	fs.close();	
}

(2)将core-site.xml拷贝到项目的根目录下

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定HDFS中NameNode的地址 -->	
	<property>		
		<name>fs.defaultFS</name>        
		<value>hdfs://node1:9000</value>	
	</property>
</configuration>

(3)将hdfs-site.xml拷贝到项目的根目录下

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
<configuration>	
	<property>		
		<name>dfs.replication</name>        
		<value>1</value>	
	</property> 
</configuration>

(4)测试参数优先级
优先级
客户端代码中设置的值 > ClassPath下的用户自定义配置文件 > 服务器的默认配置

三、HDFS文件下载

@Test
public void getFileFromHDFS() throws Exception{			
	// 1 创建配置信息对象	
	Configuration configuration = new Configuration();			
	FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");		
	//fs.copyToLocalFile(boolean delSrc, Path src, Path dst, boolean useRawLocalFileSystem);	
	// boolean delSrc 指是否将原文件删除	
	// Path src 指要下载的文件路径	
	// Path dst 指将文件下载到的路径	
	// boolean useRawLocalFileSystem 是否开启文件效验     
	// 2下载文件	
	fs.copyToLocalFile(false,new Path("hdfs://node1:9000/user/victor/hello.txt"),new Path("e:/hellocopy.txt"), true);    
	// 3 关闭资源	
	fs.close();
}

四、HDFS目录创建

	@Test	
	public void mkdirAtHDFS() throws Exception{		
		// 1 创建配置信息对象		
		Configuration configuration = new Configuration();				
		FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");					
		// 2 创建目录		
		fs.mkdirs(new Path("hdfs://node1:9000/user/victor/output")); 
		// 3.关闭资源		
		fs.close();	
	}

五、HDFS文件夹 和文件 删除

	@Test	
	public void deleteAtHDFS() throws Exception{		
		// 1 创建配置信息对象		
		Configuration configuration = new Configuration();				
		FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");					
		// 2 删除文件夹 ,如果是非空文件夹,参数2是否递归删除,true递归		
		fs.delete(new Path("hdfs://node1:9000/user/victor/output"), true); 
		// 3 关闭资源		
		fs.close(); 	
	}

六、HDFS文件名更改

文件改名 + 文件夹改名

 	@Test	
 	public void renameAtHDFS() throws Exception{		
 		// 1 创建配置信息对象		
 		Configuration configuration = new Configuration();				
 		FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");				
 		//2 重命名文件或文件夹		
 		fs.rename(new Path("hdfs://node1:9000/user/victor/hello.txt"), new Path("hdfs://node1:9000/user/victor/hellonihao.txt")); 
 		// 3.关闭资源		
 		fs.close(); 	
 	}

七、HDFS文件详情查看

查看文件名称、权限、长度、块信息

@Test
public void readListFiles() throws Exception {	
	// 1 创建配置信息对象	
	Configuration configuration = new Configuration();	
	FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");		
	RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true); 	
	while (listFiles.hasNext()) {		
		LocatedFileStatus fileStatus = listFiles.next();					
		System.out.println(fileStatus.getPath().getName());		
		System.out.println(fileStatus.getBlockSize());		
		System.out.println(fileStatus.getPermission());		
		System.out.println(fileStatus.getLen());					
		BlockLocation[] blockLocations = fileStatus.getBlockLocations();					
		for (BlockLocation bl : blockLocations) {							
			System.out.println("block-offset:" + bl.getOffset());							
			String[] hosts = bl.getHosts();							
			for (String host : hosts) {				
				System.out.println(host);			
			}	
		}					
		System.out.println("--------------分割线--------------");
	}
}

八、HDFS文件和文件夹判断

	@Test
	public void findAtHDFS() throws Exception {			
		// 1 创建配置信息对象	
		Configuration configuration = new Configuration();	
		FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");			
		// 2 获取查询路径下的文件状态信息	
		FileStatus[] listStatus = fs.listStatus(new Path("/")); 	
		// 3 遍历所有文件状态	
		for (FileStatus status : listStatus) {		
			if (status.isFile()) {			
				System.out.println("f--" + status.getPath().getName());		
			} else {			
				System.out.println("d--" + status.getPath().getName());		
			}	
		} 
		// 4.关闭资源	
		fs.close(); 
	}
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页