HDFS
Hadoop分布式文件系统,是一个文件系统,用于存储文件,通过目录树来定位文件,其次他是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色
HDFS组成架构
NameNode:
- NameNode是一个中心服务器,就是Master
- 负责管理文件系统的名字空间以及客户端的访问
- 配置副本策略
- 管理数据库
DataNode: 就是Slave,namenode下达命令,datanode执行实际操作
- 负责存储实际的数据块
- 执行数据块的读/写操作
SecondaryNameNode:
- 当namenode不行时并不能马上替换namenode并提供服务
- 辅助namenode,分担工作量,比如定期Fsimage和Edits,并推送namenode
- 在紧急情况下,可辅助恢复namenode
1.2 HDFS优缺点
优点:
- 高容错性
数据自动保存多个副本,通过增加副本的形式提高高容错性
某一个副本丢失后可以自动恢复
- 适合处理大数据
数据规模:能够处理数据规模达到GB TB 甚至PB级别
文件规模:能够处理百万规模以上的文件数量,数量相当之大
- 可构建在廉价机器上,通过多副本机制提高可靠性
缺点:
- 不适合低延时数据访问
- 无法高效的对大量小文件进行存储
存储大量小文件会占用namenode大量的内存来存储文件目录和块信息,这样不可取,因为namenode内存是有限的
小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目标
- 不支持并发写入,文件修改
同一时间同一文件只能有一个用户执行写操作,不允许多个线程同时写
仅支持数据append(追加),不支持文件的随机修改
HDFS文件块大小
HDFS的文件是在物理上是分块数据(Block),块的大小可以通过配置参数(dfs.blocksize)来规定的
为什么块的大小不能太大也不能太小?
太小的会增加寻址时间,程序一直在找块的开始位置,太大的话,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间,导致程序在处理时会非常慢
HDFS块的大小设置主要取决于磁盘传输速率
HDFS的shell命令
(1)-help:输出这个命令参数
(2)-ls: 显示目录信息
hadoop fs -ls / 列出hdfs文件系统根目录下的目录和文件
-hadoop fs -ls -R / 列出hdfs文件系统所有的目录和文件
(3)-mkdir:在HDFS上创建目录
(4)-test 测试检查目录或者文件是否存在
使用方法:hadoop fs -test -[ezd] URI :
-e 检查文件是否存在。如果存在则返回0。
-z 检查文件是否是0字节。如果是则返回。
-d 如果路径是个目录,则返回0,否则返回1。
(5)-moveFromLocal:从本地剪切粘贴到HDFS
用法:hadoop fs -moveFromLocal <local src> <hdfs dst>
与put相类似,命令执行后源文件 local src 被删除
(6)-appendToFile:追加一个文件到已经存在的文件末尾
用法:hadoop fs -appendToFile <local src> <hdfs dst>
将一本地文件中的内容拼接在hdfs文件中
(7)-cat:显示文件内容
(8)-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
(9)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
用法:hadoop fs -copyFromLocal <local src> <hdfs dst>
(10)-copyToLocal:从HDFS拷贝到本地
用法:hadoop fs -copyToLocal <local src> <hdfs dst>
(11)-cp :从HDFS的一个路径拷贝到HDFS的另一个路径
用法:hadoop fs -cp <hdfs file> <hdfs file>
(12)-mv:在HDFS目录中移动文件
用法:hadoop fs -mv <hdfs file> <hdfs file>
(13)-get:等同于copyToLocal,就是从HDFS下载文件到本地
(14)-getmerge:合并下载多个文件
(15)-put:等同于copyFromLocal
用法:hadoop fs -put <local file> <hdfs file>
(hdfs file的父目录一定要存在,否则命令不会执行)
(16)-tail:显示一个文件的末尾
用法:hadoop fs -tail <hdfs file>
(17)-rm:删除文件或文件夹
hadoop fs -rm <hdfs file> 删除文件
hadoop fs -rm -r <hdfs dir> 删除目录
(18)-rmdir:删除空目录
(19)-du统计文件夹的大小信息
(20)-setrep:设置HDFS中文件的副本数量
简单描述Shuffle过程环形缓冲区的作用?
key,value从map()方法输出,被outputcollector收集通过getpartitioner()方法获取分区号,在进入环形缓冲区。默认情况下,环形缓冲区大小值为100MB。当map输入的数据进入环形缓冲区的量达到80MB以上时,那么开始执行溢写过程,溢写过程中如果有其他数据进入,那么由剩余的百分之20反向写入。溢写过程会根据key,value先进行分区,后进行排序,最终maptask溢写文件经过归并排序后落入本地磁盘,reduceTask将多个mapTask下相同分区的数据copy到不同的reduceTask中进行归并排序后一次读取一组数据给reduce()函数
简述Hdfs的默认副本策略?这样做有什么好处?
- 第一个副本在客户端所处的节点上。如果客户端在集群外(意思就是执行上传的服务器不属于集群的节点),则随机再机架上选一个;
- 第二个副本和第一个副本位于相同机架随机节点上
- 第三个副本位于不同机架,随机节点。 优点:该策略减少了机架间的写流量,通常可以提高写性能。机架故障的机会远小于节点故障的机会。所以此策略不会影响数据的可靠性和可用性保证
简单描述你对Hadoop集群SafeMode模式的理解?
集群处于安全模式,不能执行重要操作(写操作),集群属于只读状态。但是严格来说,只是保证HDFS元数据信息的访问,而不保证文件的访问。集群启动完成后,自动退出安全模式, 如果集群处于安全模式,想要完成写操作,需要离开安全模式。 (1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态) (2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态) (3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态) (4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)。 对于全新创建的HDFS集群,NameNode启动后不会进入安全模式,因为没有Block信息
NodeManager主动向ResourceManager发送心跳,namenode也是主动向datanode发送心跳 ( 错 )
hdfs的文件的上传、下载流程
MapReduce核心思想
序列化概述
MapReduce工作流程
hdfs的默认副本策略
·Hadoop2.7.2副本节点选择
第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个
第二个副本和第一个副本位于相同机架,随机节点
第三个副本位于不同机架,随机节点
nn和2nn的工作机制?2nn有什么作用?集群的故障处理、集群的安全模式
集群的故障处理
NameNode故障后,可以采用如下两种方法恢复数据
- 将SecondaryNameNode中数据拷贝到NameNode存储数据的目录
- 使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode 中数据拷贝到NameNode目录中
集群的安全模式
·查看安全模式状态:bin/hdfs dfsadmin -safemode get
·进入安全模式状态:bin/hdfs dfsadmin -safemode enter
·离开安全模式状态:bin/hdfs dfsadmin -safemode leave
·等待安全模式状态:bin/hdfs dfsadmin -safemode wait
dn的工作机制
·一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本 身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
·DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报 所有的块信息
·心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数 据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心 跳,则认为该节点不可用
·集群运行中可以安全加入和退出一些机器
判断dn的离线
1.DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信
2.NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长
3.HDFS默认的超时时长为10分钟+30秒
4.如果定义超时时间为TimeOut
添加新节点
1.在hadoop01主机上再克隆一台hadoop04主机
2.修改IP地址和主机名称
3.删除原来HDFS文件系统留存的文件(data和logs)
4.source一下配置文件
5.直接启动DataNode,即可关联到集群
6.在hadoop04上上传文件
7.如果数据不均衡,可以用命令实现集群的再平衡
什么是黑名单?什么是白名单?如何退役旧节点?如何设置白名单?
1.在黑名单上面的主机都会被强制退出
2.添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被 退出
3.添加白名单,黑名单退役;不允许白名单和黑名单中同时出现一个主机名称
·在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件
添加主机名称(不添加hadoop04)
hadoop01
hadoop02
hadoop03
·在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
</property>
·配置文件分发:myrsync hdfs-site.xml
·刷新NameNode:hdfs dfsadmin -refreshNodes
·更新ResourceManager节点:yarn rmadmin -refreshNodes
通过代码验证集群的配置文件的优先级
@Test
public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {
// 1 获取文件系统
Configuration configuration = new Configuration();
configuration.set("dfs.replication", "2");
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang");
// 2 上传文件
fs.copyFromLocalFile(new Path("e:/banzhang.txt"), new Path("/banzhang.txt"));
// 3 关闭资源
fs.close();
System.out.println("over");
}
将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>
参数优先级排序:客户端代码中设置的值 >ClassPath下的用户自定义配置文件 >然后是服务器的默认配置
通过代码验证seek指定位置下载
(1)下载第一块
@Test
public void readFileSeek1() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang");
// 2 获取输入流
FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
// 3 创建输出流
FileOutputStream fos = new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part1"));
// 4 流的拷贝
byte[] buf = new byte[1024];
for(int i =0 ; i < 1024 * 128; i++){
fis.read(buf);
fos.write(buf);
}
// 5关闭资源
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
fs.close();
}
(2)下载第二块
@Test
public void readFileSeek2() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang"));
// 2 打开输入流
FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
// 3 定位输入数据位置
fis.seek(1024*1024*128);
// 4 创建输出流
FileOutputStream fos = new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part2"));
// 5 流的对拷
IOUtils.copyBytes(fis, fos, configuration);
// 6关闭资源
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
(3)合并文件
在Window命令窗口中进入到目录E:\,然后执行如下命令,对数据进行合并
type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1
合并完成后,将hadoop-2.7.2.tar.gz.part1重新命名为hadoop-2.7.2.tar.gz。解压发现该tar包非常完整。