HDFS文件系统(含hdfs常用命令,java对hdfs API的简单操作)


前置条件:hadoop环境搭建完毕。

hadoop环境搭建

HDFS概念

什么是HDFS

HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

HDFS的组成

HDFS集群包括,NameNode和DataNode以及Secondary Namenode。

NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。
DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个datanode上存储多个副本。
Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。

HDFS文件块大小

HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M

HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。

如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,我们要将块大小设置约为100MB。默认的块大小实际为64MB,但是很多情况下HDFS使用128MB的块设置。

块的大小:10ms*100*100M/s = 100M

HFDS命令行操作

基本语法

hdfs dfs -具体命令
或
hadoop fs -具体命令

##注:hdfs dfs 和 hadoop fs 的意义是相同的

常用命令

##注:hdfs中大多数命令和linux中的意义是一样的
## -help:输出这个命令参数
	hadoop fs -help rm

## -ls: 显示目录信息
	hadoop fs -ls /

## -mkdir:在hdfs上创建目录 -p 代表递归创建多个文件夹
	hadoop fs  -mkdir -p  /aaa/bbb/cc

## -moveFromLocal从本地剪切粘贴到hdfs
	hadoop  fs  - moveFromLocal  input/ /input

## -moveToLocal:从hdfs剪切粘贴到本地
	hadoop  fs  - moveToLocal   /input  /home/test

## -appendToFile  :追加一个文件到已经存在的文件末尾
	hadoop  fs  -appendToFile  ./hello.txt  /hello.txt

## -cat :显示文件内容
	hadoop  fs  -cat /hello.txt

## -tail:显示一个文件的末尾
	hadoop  fs  -tail  /hello.txt

## -text:以字符形式打印一个文件的内容
	hadoop  fs  -text   /hello.txt

## -chgrp 、-chmod、-chown:linux文件系统中的用法一样,修改文件所属权限
	hadoop  fs  -chmod  666  /hello.txt

## -copyFromLocal:从本地文件系统中拷贝文件到hdfs路径去 
	hadoop  fs  -copyFromLocal  ./jdk.tar.gz  /test

## -copyToLocal:从hdfs拷贝到本地
	hadoop fs -copyToLocal /test/jdk.tar.gz

## -cp :从hdfs的一个路径拷贝到hdfs的另一个路径
	hadoop  fs  -cp  /test1/jdk.tar.gz  /test2/jdk.tar.gz.2

## -mv:在hdfs目录中移动文件
	hadoop  fs  -mv  /test/jdk.tar.gz  /

## -get:等同于copyToLocal,就是从hdfs下载文件到本地
	hadoop fs -get  /test/jdk.tar.gz
	
## -put:等同于copyFromLocal
	hadoop  fs  -put  /test/jdk.tar.gz  /test/jdk.tar.gz.2

## -rm:删除文件或文件夹
	hadoop fs -rm -r /test

## -rmdir:删除空目录
	hadoop  fs  -rmdir   /aaa/bbb/ccy
	
## -df :统计文件系统的可用空间信息
	hadoop  fs  -df  -h  /

## -du统计文件夹的大小信息
	hadoop  fs  -du  -s  -h /test/*
	
## -count:统计一个指定目录下的文件节点数量
	hadoop fs -count /aaa/
	
## -setrep:设置hdfs中文件的副本数量
	hadoop fs -setrep 3 /aaa/jdk.tar.gz
	注:这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量。因为目		  前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。

Java操作hdfs

配置编译环境

##将下载好编译过的hadoop文件和jar解压到纯英文路径 
##配置HADOOP_HOME
##将lib下的所有jar导入到 ide 中

下载地址:https://pan.baidu.com/s/1e8VnWSLNowePJjDDHV0ddw  提取码:7ozz

获取文件系统

c
public void initHDFS() throws Exception{
    
    
	// 1 创建配置信息对象
	Configuration configuration = new Configuration();

	// 2 获取文件系统
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop集群地址:9000"),configuration, "root");
		
	// 3 打印文件系统
	System.out.println(fs.toString());
}

上传文件

@Test
public void putFileToHDFS() throws Exception{
    
    
	// 1 创建配置信息对象
	Configuration configuration = new Configuration();
		
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop集群地址:9000"),configuration, "root");
		
	// 2 创建要上传文件所在的本地路径
	Path src = new Path("c:/hello.txt");
		
	// 3 创建要上传到hdfs的目标路径
	Path dst = new Path("hdfs://hadoop集群地址:9000/hello.txt");
		
	// 4 拷贝文件
	fs.copyFromLocalFile(src, dst);
	fs.close();	
}

文件下载

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

目录创建

@Test
public void mkdirAtHDFS() throws Exception{
    
    
	// 1 创建配置信息对象
	Configuration configuration = new Configuration();
			
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop集群地址:9000"),configuration, "root");	
			
	//2 创建目录
	fs.mkdirs(new Path("/user/output"));
			
	fs.close();
}

删除文件

@Test
public void deleteAtHDFS() throws Exception{
    
    
	// 1 创建配置信息对象
	Configuration configuration = new Configuration();
		
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop集群地址:9000"),configuration, "root");	
		
	//2 删除文件夹时 ,如果是非空文件夹,参数2必须给值true
	fs.delete(new Path("/user/output"), true);
	
	fs.close();
}

文件重命名

@Test
public void renameAtHDFS() throws Exception{
    
    
	// 1 创建配置信息对象
	Configuration configuration = new Configuration();
		
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop集群地址:9000"),configuration, "root");
		
	//2 重命名文件或文件夹
	fs.rename(new Path("/hello.txt"), new Path("/hellonihao.txt"));
	
	fs.close();
}

猜你喜欢

转载自blog.csdn.net/DRAGON_ranhou/article/details/108666934