Hadoop分布式文件系统-HDFS
一、Hadoop概述
1. Google集群系统
Hadoop是Google集群系统的开源实现
(1)Google集群系统:GFS、MapReduce、BigTable
(2)Hadoop:HDFS、MapReduce、HBase
Hadoop的初衷是解决Nutch海量数据的爬取和存储
Hadoop于2005年作为Lucene子项目Nutch的一部分正式引入Apache基金会
2. Hadoop核心
(1)分布式文件系统HDFS:提供高可靠性、高扩展性和高吞吐量的数据存储服务
(2)分布式计算框架MapReduce:具有易于编程、高容错性和高扩展性的优点
3. HDFS解决大数据存储问题
二、Hadoop分布式文件系统-HDFS
1.HDFS特性
(1)高可靠性:HDFS创建多份数据块的副本,并将它们放置在服务器集群的不同计算节点中
(2)高扩展性:支持服务器群节点横向扩展
(3)高吞吐量:访问超大数据集
2.HDFS运行机制
(1)元数据:除文件内容之外的数据,包括文件名、拥有者、权限等。
- 文件越多,元数据越大。
(2)元数据保存在磁盘中,启动时加载到内存,工作时到内存读数据。
(3)DataNode的副本机制
(4)block副本放置位置:机架感知策略
(5)故障检测
- NameNode
- 镜像文件fsimage
- 日志文件edits
- DataNode
- 块报告(安全模式下检测)
- 心跳包(检测是否宕机)
- 数据完整性检测(比较校验和)
(6)空间回收机制
- DataNode中是否有多余空间
- 删除数据的同时删除对应的元数据
3.HDFS优点
(1)高容错性(副本机制)
- 数据自动保存多个副本
- 副本丢失后自动恢复
(2)适合批处理
- 移动计算而不移动数据
- 数据位置暴露给计算框架
(3)适合大数据处理
- GB、TB、PB级数据
- 百万规模以上的文件
- 10k+节点
(4)可构建在廉价机器上
- 多副本提高可靠性
4.HDFS缺点
(1)低延迟数据访问
- 毫秒级:HDFS存储数据量多,在毫秒内出现查询结果的需求不适合HDFS
(2)小文件存取
- 占用NameNode大量内存:小文件多,元数据大,大大占用内存(对小文件压缩处理)
- 寻道时间超过读取时间
(3)并发写入、文件随机修改
- 一个文件同时只能有一个写者(hadoop2.x仅支持append)
- HDFS不适合做修改,如网盘
5.HDFS架构
- 客户端请求NameNode读写文件
- NameNode将DataNode返回给客户端,客户端访问DataNode
- DataNode以块(block)为单位在磁盘上存储数据
- 副本数量越多,丢失数据的可能性越小
6.HDFS数据存储单元(block)
(1)文件被切分成固定大小的数据块
- 默认128MB(可配)
- 若文件大小不足128MB,则单独为一块(一个块只能存一个文件的数据)
(2)文件存储方式
- 在逻辑上,按大小切分成若干块存储到不同节点上
- 每个块默认有三个副本(副本越多,磁盘利用率越低,磁盘被副本占用)
(3)块的大小和副本数在上传文件时设置,文件上传成功后副本数可变,块的大小不可变
7.HDFS设计思想
- 每个块有3个副本分别在不同的机器上
- 当某个块的副本数<指定的副本数,HDFS自动增加副本,复制缺少的块到空闲节点
8.NameNode(NN)
(1)NN主要功能:接收/处理客户端读写请求
(2)NN保存元数据的信息包括
- 文件名、拥有者、权限
- 文件包含的块、块编号(每个块都有唯一的编号)
- 块的位置信息
(3)元数据信息在NN启动后会加载到内存
- 元数据存储的磁盘文件名为fsimage
- 块的位置信息不会保存到fsimage,而是由DN启动时上报给NN,NN收到后保存到内存中
- edits记录对元数据的操作日志。(增加/删除数据时,不会立即修改fsimage文件,而是在edits中记录一条操作日志,一段时间内把edits日志和fsimage文件合并,合并时增加/删除fsimage中的数据)
9.SecondaryNameNode(SNN)
(1)SNN不是NN的备份,但可以做一部分元数据的备份,不是实时备份
(2)SNN的主要作用是帮助NN合并edits文件
(3)为什么NN不做合并?
- 合并需要占用大量资源,而NN主要功能是接收处理客户端的读写请求,如果NN处理合并操作,那么用户的读写请求会很慢(使用SNN提高了用户体验)
(4)合并过程有大量IO操作,合并生成新的fsimage,并推送给NN替换原来的fsimage
(5)SNN合并时机
- fs.checkpoint.period设置合并操作的时间间隔(默认3600s,若edits文件没有超过默认的最大值,则每3600s合并一次)
- fs.checkpoint.size设置edits文件的大小(默认最大值64MB,若edits文件超过64MB、没有达到3600s,同样也会合并)
10.SNN合并流程
(1)拷贝时若用户正在读写文件,则产生新的edits文件记录在合并时间内用户的操作日志
(2)合并edits和fsimage文件,生成新的fsimage并推送给NN替换原来的fsimage文件
(3)新的edits文件默认每3600s产生一次
(4)NN的工作数据都在内存中;NN中edits、fsimage文件及合并机制帮助磁盘上数据随着用户操作进行更新
(5)SNN为NN做一定量的数据备份,但不是热备。NN挂掉后只能找到一部分拷贝的fsimage文件(建议NN和SNN放在不同的机器上)
11.DataNode(DN)
(1)存储数据
(2)启动时DN向NN汇报块的位置信息
(3)DN每隔3s主动向NN发送心跳;如果NN10min内没有收到DN的心跳,则认为其已经lost,NN立即向对应的DN发送消息告知哪些块缺少副本,DN复制副本到其他的DN上
12.Block副本放置策略
(1)第一个副本:文件上传时NN就近随机挑选一台磁盘不满、CPU不忙的DN存储
(2)第二个副本:与第一个副本不同机架的节点上(同一个机架一般是一个电源,电源断掉,则整个机架的服务器都会断掉,那么此机架上所有服务器的副本都将丢失,所以要存在另一个机架上),两个不同的机架保证安全性
(3)第三个副本:与第二个副本相同机架的节点上(保证安全性的同时保证速度,同一个机架传输速度快,同一个机架一般是一个交换机)
(4)更多副本:随机节点
13.HDFS读流程
1. 初始化FileSystem,客户端调用FileSystem的open函数打开文件。
2. FileSystem通过RPC请求NN得到block位置信息,NN返回block对应的DN地址。
3. FileSystem返回FSDataInputStream给客户端,客户端调用Stream的read函数开始读取数据。
4. FSDataInputStream连接保存该文件的第一个最近的数据块的DN,数据从DN读到客户端。
5. 此块读取完毕,关闭与该DN的连接,然后连接此文件的下一个最近的数据块的DN。
6. 客户端读取完毕,调用Stream的close函数。
注:读取数据时,如果客户端与DN通信出现错误,则尝试连接包含此数据块的下一个DN,并且记录失败的DN,以后不再连接。
14.HDFS写流程
1. 初始化FileSystem,客户端调用create函数创建文件。
2. FileSystem通过RPC请求NN创建新文件。
3. FileSystem返回FSDataOutputStream给客户端,客户端调用Stream的write函数开始写入数据。
4. FSDataOutputStream将数据分块、写入队列,Data Streamer到队列读取数据,并通知NN分配DN存储数据块。分配的DN放在pipeline中。Data Streamer将数据块写入pipeline的第一个DN,第一个DN将数据块发送给第二个DN,第二个DN将数据块发送给第三个DN。
5. 等待pipeline中DN数据写入成功,返回ack给FSDataOutputStream。
6. 客户端调用Stream的close函数结束写入数据。
7. FileSystem通知NN写入完毕。
注:若数据写入失败,则关闭pipeline,将ack中数据块写入数据队列的开始。错误节点重启会删除过时的数据块。失败的DN从pipeline中移除,数据块写入pipeline的另外两个DN。NN则被通知此数据块副本不足,将会创建第三个备份。
15.HDFS文件权限
(1)文件的拥有者是文件上传时的用户名
(2)如果windows默认用户Adminstrator上传文件到HDFS,那么这个文件在HDFS上的拥有者就是Adminstrator。与Linux有无这个用户无关,只要文件系统上有这个用户即可。
(3)HDFS权限目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁。无密码认证,导致Hadoop安全性差。
16.安全模式
(1)安全模式:启动HDFS时进入,理解为检查初始化阶段。
(2)安全模式下不能对HDFS进行操作,只能查看目录、文件名。
(3)安全模式下所有DN刚启动,同时DN上block位置信息要汇报给NN,这一过程就是安全模式时间。
(4)安全模式时间内NN要检测DN上副本数是否正确。
(5)NN启动时将映像文件fsimage载入内存,并执行edits日志中各项操作。
(6)一旦在内存中成功建立HDFS元数据映射,则创建一个新的fsimage和edits文件。
(7)在安全模式下,文件系统对于客户端来说是只读,NN收集各个DN的报告。当数据块达到最小副本数以上,被认为安全。在一定比例的数据块被确定为安全后若干时间,安全模式结束。
(8)当副本数不足时,该块会被复制直至达到最小副本数。系统中数据块的位置不是由NN维护,而是以块列表形式存储DN中。