Hadoop——第六章 : 分布式文件系统HDFS

6-1HDFS课程概述

HDFS

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。 
HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。

课程概述

一、操作HDFS
  1、Web Console:端口50070
  2、命令行
  3、Java API 

二、HDFS输出数据原理
  1、数据上传的原理(过程)
  2、数据下载的原理(过程) 

三、HDFS的高级特性   1、回收站
  2、快照snapshot:备份
  3、配额quota:
    (1)名称配额
    (2)空间配额
  4、HDFS安全模式: safemode
  5、HDFS的权限
  6、HDFS的集群:
    (1)联盟Federation
    (2)HA 

四、HDFS底层原理
  1、Java的动态代理
  2、RPC:remote procedure call 远程过程调用

启动HDFS

1.start-dfs.sh
 
2.jps查看一下进程是否启动
 
3.如果没有启动成功,就去hadoop目录下看看对应的日志文件


 

 

通过WebConsole操作HDFS

Web Console:端口50070
在浏览器访问:192.168.157.11:50070

需要注意的地方:
Overview中的

Datanode(由于是为分布模式,所以只有一个DataNode)

Startup Progress

启动HDFS的过程

 

 

 

 

 

 

 

 

 

 来自:《(林子雨)大数据技术原理与应用》


命令行
	
(1)普通操作命令: hdfs dfs ******
	命令
	-mkdir:在HDFS上创建目录
			hdfs dfs -mkdir /aaa
			hdfs dfs -mkdir /bbb/ccc
			如果父目录不存在,使用-p参数先创建父目录
			
	-ls      查看HDFS的某个目录
	-ls -R   查看HDFS的某个目录,包含子目录
			 简写: -lsr
				
	-put            上传数据
	-copyFromLocal  上传数据
	-moveFromLocal  上传数据,相当于ctrl+x
	
	-copyToLocal   下载数据
	-get            下载数据
		 举例: hdfs dfs -get /input/data.txt .
	
	-rm: 删除目录
	-rmr: 删除目录,包括子目录
		   hdfs dfs -rmr /bbb

				
	-getmerge:把某个目录下的文件,合并后再下载
	
	-cp:拷贝   hdfs dfs -cp /input/data.txt /input/data2.txt
	-mv:移动   hdfs dfs -cp /input/data.txt /aaa/a.txt
			
	-count: 举例:hdfs dfs -count /students
	
	-du: 类似-count,信息更详细
		 hdfs dfs -du /students
	
	例子:
		[root@bigdata11 ~]# hdfs dfs -count /students
				   1            2                 29 /students
		[root@bigdata11 ~]# hdfs dfs -ls /students
		Found 2 items
		-rw-r--r--   1 root supergroup         19 2017-12-08 20:35 /students/student01.txt
		-rw-r--r--   1 root supergroup         10 2017-12-08 20:35 /students/student02.txt
		[root@bigdata11 ~]# hdfs dfs -du /students
		19  /students/student01.txt
		10  /students/student02.txt			
	
	-text、-cat: 查看文本的内容
			  hdfs dfs -cat /input/data.txt
	balancer:平衡操作
			  hdfs 	balancer		

(2)管理命令:hdfs dfsadmin ******
	-report: 打印HDFS的报告
			 举例:hdfs dfsadmin -report
			 
	-safemode:安全模式
		hdfs dfsadmin -safemode
		Usage: hdfs dfsadmin [-safemode enter | leave | get | wait]	
		
		[root@bigdata11 ~]# hdfs dfsadmin -safemode get
		Safe mode is OFF
		[root@bigdata11 ~]# hdfs dfsadmin -safemode enter
		Safe mode is ON
		[root@bigdata11 ~]# hdfs dfs -mkdir /dddd
		mkdir: Cannot create directory /dddd. Name node is in safe mode.
		[root@bigdata11 ~]# hdfs dfsadmin -safemode leave
		Safe mode is OFF	

 


Java API

通过 HDFS 提供的 JavaAPI,我们可以完成以下的功能: 
1. 在 HDFS 上创建目录 
2. 通过 FileSystemAPI 读取数据(下载文件)
3. 写入数据(上传文件) 
4. 查看目录及文件信息 
5. 查找某个文件在 HDFS 集群的位置
6. 删除数据 
7. 获取 HDFS 集群上所有数据节点信息

(1)创建一个目录:mkdir ----> 告诉:权限的问题
(2)上传数据、下载数据
(3)查询数据的元信息
依赖的jar包:
/root/training/hadoop-2.7.3/share/hadoop/common
/root/training/hadoop-2.7.3/share/hadoop/common/lib
/root/training/hadoop-2.7.3/share/hadoop/hdfs
/root/training/hadoop-2.7.3/share/hadoop/hdfs/lib

1.运行WinSCP,登录到环境当中。
 
2.在windows中新建lib/hdfs,并将所需要jar包从linux下载进去。
 
3.打开eclipse,新建工程
 
4.在新建号的项目下建立一个lib文件夹
 
5.把所有的jar包都放到lib文件夹里
6.选中所有jar包,添加到path
 
7.新建一个package
  
8.写入示例代码,并运行

示例代码
package demo;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

/*
 * 使用HDFS的Java API创建一个目录
 * 
 * 权限的问题:
 * org.apache.hadoop.security.AccessControlException: Permission denied: 
 * user=lenovo, access=WRITE, inode="/folder1":root:supergroup:drwxr-xr-x
 * 
 * 四种办法解决:
 * 1、设置执行程序的用户是:root(HADOOP_USER_NAME)
 * 2、使用Java的-D参数: HADOOP_USER_NAME
 * 3、使用命令改变目录的权限:hdfs dfs -chmod 777 /folder2
 * 4、参数:dfs.permissions  ---> false
 */
public class TestDemo1 {

	@Test
	public void test1() throws Exception{
		//办法一:设置执行程序的用户是:root
		System.setProperty("HADOOP_USER_NAME", "root");
		
		//指定NameNode地址
		Configuration conf = new Configuration();
		//如果要使用主机名,需要配置Windows的host文件
		//C:\Windows\System32\drivers\etc\hosts文件
		conf.set("fs.defaultFS", "hdfs://bigdata11:9000");
		
		/*
		 * 还有一种写法:IP地址
		 * conf.set("fs.defaultFS", "hdfs://192.168.157.11:9000");
		 */
		
		//创建一个HDFS的客户端
		FileSystem client = FileSystem.get(conf);
		//创建目录
		client.mkdirs(new Path("/folder1"));
		
		//关闭客户端
		client.close();
	}
	
	@Test
	public void test2() throws Exception{
		//指定NameNode地址
		Configuration conf = new Configuration();
		//如果要使用主机名,需要配置Windows的host文件
		//C:\Windows\System32\drivers\etc\hosts文件
		conf.set("fs.defaultFS", "hdfs://bigdata11:9000");
		
		/*
		 * 还有一种写法:IP地址
		 * conf.set("fs.defaultFS", "hdfs://192.168.157.11:9000");
		 */
		
		//创建一个HDFS的客户端
		FileSystem client = FileSystem.get(conf);
		//创建目录
		client.mkdirs(new Path("/folder2"));
		
		//关闭客户端
		client.close();
	}
	
	@Test
	public void test3() throws Exception{
		//指定NameNode地址
		Configuration conf = new Configuration();
		//如果要使用主机名,需要配置Windows的host文件
		//C:\Windows\System32\drivers\etc\hosts文件
		conf.set("fs.defaultFS", "hdfs://bigdata11:9000");
		
		/*
		 * 还有一种写法:IP地址
		 * conf.set("fs.defaultFS", "hdfs://192.168.157.11:9000");
		 */
		
		//创建一个HDFS的客户端
		FileSystem client = FileSystem.get(conf);
		//创建目录
		client.mkdirs(new Path("/folder2/folder3"));
		
		//关闭客户端
		client.close();
	}
	
	@Test
	public void test4() throws Exception{
		//指定NameNode地址
		Configuration conf = new Configuration();
		//如果要使用主机名,需要配置Windows的host文件
		//C:\Windows\System32\drivers\etc\hosts文件
		conf.set("fs.defaultFS", "hdfs://bigdata11:9000");
		
		/*
		 * 还有一种写法:IP地址
		 * conf.set("fs.defaultFS", "hdfs://192.168.157.11:9000");
		 */
		
		//创建一个HDFS的客户端
		FileSystem client = FileSystem.get(conf);
		//创建目录
		client.mkdirs(new Path("/folder4"));
		
		//关闭客户端
		client.close();
	}
}

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-12-01 13:07  JasonPeng1  阅读(685)  评论(0编辑  收藏  举报