hadoop 一个分布式计算的项目,旗下有很多成功的分布式计算工具。
本分类主要介绍hadoop 的核心功能HDFS/YARN/MapReduce
HDFS
HDFS 是一个分布式文件系统,其架构分为namenode,datanode,client。
各个组件
namenode 存储hdfs命名空间(比如哪些数据存储在哪一台datanode),告知客户端去哪些datanode 可以拿到需要的数据。对文件的创建,删除操作首先要经过它。
secondarynamenode:当namenode在内存中维护整个命名空间时,secondarynamenode 负责将命名空间的数据整理后写入磁盘(在“关于hdfs命名空间”中会细说)。因为namenode 和secondarynamenode 对内存的需求是一样的,所以把这两件事分别让两个机器做以抬高hadoop namenode 的瓶颈。
checkpointnode:和secondarynamenode做一样的事情,只是checkpointnode会主动把整理好的数据上传给namenode,secondarynamenode不会。
backupnode:namenode 的备份。
datanode 存储真正的数据,提供读写数据的服务,同时接受namenode创建文件,删除文件的指令。
client 客户端
关于hdfs命名空间和namenode/secondarynode/backupnode
hdfs命名空间被存储在namenode上,记录了哪些数据存储在哪些机器上面以及这些数据的详细信息(你可以想象是ext4文件系统的inode),datanode 不知道自己存储了哪些数据。
这些数据存储在两种文件中,fsimage和editlog。
fsimage 是整理好的数据(可以想象成snapshot/checkpoint什么的)
editlog 是namenode 在运行中实时写的,当用户修改hdfs 数据时,namenode 里的命名空间数据也会随之改变,namenode 没时间把改变整理进fsimage,只好把记录增量得写进editlog。(就想象成数据库的redolog 吧)
namenode 只会在启动的时候整理editlog,生成fsimage。 所以当namenode 下次启动时,可能已经积攒了极多的editlog, 这会导致namenode需要花极多的时间来整理editlog再启动,所以才会需要一台secondarynamenode来定期整理editlog,生成新的fsimage。
checkpointnode 和 secondarynode 做同样的事情,只是checkpointnode 会主动把整理好的fsimage 上传给secondarynamenode。
namenode 在内存中存储了最新的命名空间数据,它等于 namenode的editlog+fsimage
secondarynamenode/checkpointnode上的数据是最后一次整理的时候的数据(checkpoint 那一刻的数据)。如果namenode 宕机,我们就会损失最后一次checkpoint 以后写入的数据。
backupnode 会和namenode一起同步更新命名空间数据,如果启动了backupnode时namenode宕机,那么不会丢失数据。backupnode 只能起一个。
关于副本
通常建议数据有三个副本,两个副本在一个机柜的不同机器上,一个副本在其他机柜的机器上;又或者两个副本在一个数据中心,另一个副本在其他数据中心。
安全模式
namenode 刚启动的时候会进入一个安全模式,它会检查所有datanode上的数据,看看有没有副本,如果没有副本就创建副本。全部完备后会退出安全模式
数据完整性
hdfs里的文件在命名空间中有checksum,如果客户端拿到的数据与checksum不符,客户端会尝试去拿这个数据在其他节点的副本。