1. hadoop分为三部分
Hadoop distributed file system(HDFS)
MapReduce
YARN(Yet Another Resource Neigotiator) Hadoop2.0才开始有的
2. NameNode可以理解为元数据,不实际存储数据本身(只有一个);DataNode用来数据存储。同一台电脑可以只扮演一个角色,也可以即使DataNode又是NameNode
NameNode类比为manager
3. 在NameNode中,fsimage存储原数据,edits记录改变
4. 若所有record都存入内存中,断电后数据会消失;若所有record都存入磁盘中效率过低
故而引入fsimage与edits,让原始文件与其修改合并
若每次都是NameNode自己启动的时候合并速度太慢,所以引入Secondary Name Node帮助fsimage与edits合并
5. Secondary NameNode每隔一段时间就询问NameNode是否需要合并,若edit logs文件大到一定程度就开始合并。NameNode将其fsimage与edit拷贝给Secondary NameNode,Secondary NameNode将其合并成新的fsimage在返还给NameNode
6. NameNode被启动的时候,首先合并上一次生成的edits,fsimage文件并加载到内存中并生成一个新的空edits_inprogress_001文件
需要更新NameNode的数据时,这些更新将被首先记录到edits _inprogress_001文件中,然后在内存中修改
每过一个设定的时间,Secondary NameNode发出checkPoint请求
NameNode收到checkpoint请求后,另起一个edits_inprogress_002记录后续的更新,此时将edits_inprogress_001重命名为edits_001并将其与fsimage一起拷贝给Secondary NameNode进行合并。合并后传回NameNode,作为新的fsimage
7. HDFS分块(block)
HDFS会将文件分块,Hadoop 2.0开始block默认值为128MB
如果block很小带来的后果是占取更多空间(元文件太多,每个集群上的文件无论大小,在NameNode上都占150B),小文件会增加寻址时间(因为文件数量太多),影响MapReduce
8. 每个block都会被复制3份,避免一个DataNode失联整个集群无法恢复
9. HDFS写流程
HDFS首先创建一个分布式FileSystem,向NameNode请求,NameNode返回哪三个可以使用的DataNode,三个DataNode之间彼此联通。写文件然后发给第一个DataNode,再依次转发给第二个,第二个到第三个。同一时间只能有一个客户端在写,所有blocks同时被上传,三个DataNode的选择是随机的,选择基于Rack Awareness
10. Rack Awareness可以减少延迟,同一个Rack上可理解为距离更近,但是同一个Rack容错率低,如一个rack断电的时候。故而第一个复制到local DataNode,没有的话放到同一个rack上的随机machine,即写到本地;第二个选择一个不同rack的DataNode,第三个选择跟第二个相同rack的不同机器
11. HDFS client向NameNode请求文件位置,根据network topology选择最近的
节点间距离等于两节点到达最近的公共路由/交换机的距离之和
若同一rack,距离公共交换机的距离均为1;同一集群不同rack则距离均为2,不同集群则距离均为3
每个rack有一个公共路由,每一个集群有一个公共路由,再往上也有一个公共路由
12. 可以同时有很多个reader,blocks是同时读的