hadoop主要分为三个模块:
HDFS、MapReduce、Yarn
hadoop具体能干什么:
hadoop擅长日志分析
海量数据存储
hadoop具有很多节点,节点叫DataNode。
每一个块在节点上存多个副本。
海量数据计算
map本地局部处理。
reduce通过网络取得其他节点的统计结果。
HDFS的实现思想:
- hdfs是通过分布式集群来存储文件,为客户端提供了一个便捷的访问方式,就是一个虚拟的目录结构。
- 文件存储到hdfs集群中去的时候是被切分成block的
- 文件的block存放在若干台DataNode节点上。
- hdfs文件系统中的文件与真实的block之间有映射关系,由namenode管理。
- 每一个block在集群中会存储多个副本,好处是可以提高数据的可靠性,还可以提高访问的吞吐量。
HDFS 上传文件
- 客户端向NameNode申请上传文件
- NN向客户端返回分配的DataNode
- 客户端向DataNode写入Block数据(1号块,2号块,3号块。切分是由客户端切分的。按照偏移量写。)
- DN向其他DN再复制两个副本
块数据是客户端自己切分的,假设每个块是128M,第一块按照偏移量从0开始写,第二块偏移量从128M开始写。
最后一个block不到128M,但也算是block,也需要在NN中记录。
向DFS中存储的数据不到128M(大量小文件),会浪费NameNode元数据的存储空间,不会浪费DataNode的存储空间。
对MR分析效率也会降低。
元数据管理
Namenode只有一个节点,客户端要并发的大量写入。怎样做到呢。
1. 元数据写入本地磁盘中。(速度无法响应)(不合理)
2. 元数据放在内存中(如果当机怎么办,断电)(不合理)
3. 元数据放到内存中,定期flush到磁盘文件。(在flush之前断电、当机)(不合理)
NameNode实际上管理元数据
- 磁盘上存储一份。fsimage是一个持久化的磁盘文件。如果NameNode直接读取的话,速度太慢。所以内存中也存有一份。
- 如果往内存中记录,很容易丢失。内存中的元数据是用来查询的。
- 最新的元数据记录在一个文件中(edits log),不提供修改,只提供追加,以日志的形式记录下来。
-
- 客户端向HDFS写入数据,向NN发出请求,
-
- NN把元数据首先写入edits Log中
-
- NN返回给客户端,可以往那些DN里写
-
- 客户端开始向特定的DN中写。
- 5.客户端写好一个副本就算成功了。告诉NN,
- 6.NN将元数据更新到内存中。(假如此时断电了,刚才的元数据在edits log中还能找到。)
- 客户端上传文件时,NN首先往edits log文件中记录元数据操作日志
- 客户端开始上传文件,完成后返回成功信息给NN,NN就在内存中写入这次上传操作的新产生的元数据信息
- 每当 edits log写满时,需要将这段时间的新的元数据刷到fsimages中去。(合并是由secondary namenode完成的)
SN合并
1. edits log写满了通知SN进行checkpoint操作
2. SN通知NN停止往edits文件中写数据
3. NN产生一个新的edits.new,继续写文件
4. SN把fsimage和edits下载下来
5. SN利用自己的CPU和内部资源,将fsimage和edit合并,生成新文件fsimage.chkpoint
6. 新文件上传给NN
7. NN把新的文件替换原来的旧文件(fsimage.chkpoint改名为fsimage)。同时把edits删掉,把edits.new重命名为edits。
什么时候checkpoint
- fs.checkpoint.period指定两次checkpoint的最大时间间隔,默认3600秒
- fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认是64M。
NN的主要职责:
1. 维护元数据信息
2. 维护HDFS的目录树
3. 响应客户端的请求
hdfs文件系统
MR只需要找FileSystem抽象类,而不需要知道具体的是本地的还是HDFS上的文件系统