分布式存储系统HDFS(Hadoop Distributed File System)POSIX
- 分布式存储系统
- 提供了高可靠、高扩展性和高吞吐率的数据存储服务
分布式计算框架MapReduce
- 分布式计算框架(计算向数据移动)
- 具有易于编程、高容错性和高扩展性等优点
分布式资源管理框架YARN(Yet Anoter Resource Management)
- 负责集群资源的管理和调度
存储模型
- 文件线性切割成块(Block):偏移量offset(byte)
这也是为啥不能在中间插入数据的原因
- Block分散存储在集群节点中
- 单一文件Block大小一致,文件与文件可以不一致
- Block可以设置副本数,副本数分散在不同节点中(副本数不要超过节点数量)
- 文件上传可以设置Block大小和副本数
- 已上传的文件Block副本数可以调整,大小不变
- 只支持一次写入多次读取,同一时刻只有一个写入者
- 可以append追加数据
架构模型
- 文件元数据MetaData,文件数据分开存储
- 元数据
- 数据本身
- (主)NameNode节点保存文件元数据:单节点posix
- (从)DataNode节点保存文件Block数据:多节点
- DataNode与NameNode保持心跳,提交Block列表
- HdfsClient与NameNode交互元数据信息
- HdfsClient与DataNode交互文件Block数据
NameNode(NN)
- 基于内存存储
- 只存在内存中
- 持久化
- NameNode主要功能
- 接受客户端的读写服务
- 收集DataNode汇报的Block列表信息
- NameNode保持metadata信息包括
- 文件owership和permissions
- 文件大小,时间
- (Block列表:Block偏移量),位置信息
- Block每副本位置(由DataNode上报)
NameNode持久化
- NameNode的metadata信息在启动后会加载到内存
- metadata存储到磁盘文件名为“fsimage”
- Block的位置不会保存到fsimage
- edits记录对metadata的操作日志
DataNode(DN)
- 本地磁盘目录存储数据(Block),文件形式
- 同时存储Block的元数据信息文件
- 启动DN时会向NN汇报block信息
- 通过向NN发送心跳保持与其联系(3秒一次),如果NN10分钟没有收到DN的心跳,则认为其已经lost,并copy其他的block到其他DN
HDFS优点
- 高容错性
- 数据自动保存多个副本
- 副本丢失后,自动恢复
- 适合批处理
- 移动计算而非数据
- 数据位置暴露给计算框架(Block偏移量)
- 适合大数据处理
- GB、TB、甚至PB级数据
- 百万规模以上的文件数量
- 10K + 节点
- 可构建在廉价机器上
- 通过多副本提高可靠性
- 提供了容错和恢复机制
HDFS缺点
- 低延迟数据访问
- 比如毫秒级
- 低延迟与高吞吐率
- 小文件存取
- 占用NameNode大量内存
- 寻道时间超过读取时间
- 并发写入、文件随机修改
- 一个文件只能有一个写者
- 仅支持append
SecondaryNameNode(SNN)
- 它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间
- SNN执行合并时间
- 根据配置文件设置的时间间隔fs.checkpoint.period默认3600秒
- 根据配置文件设置edits log大小fs.checkpoint.size规定edits文件的最大值默认是64MB
Block的副本放置策略
- 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满的,CPU不太忙的节点
- 第二个副本:放置在于第一个副本不同的机架的节点上
- 第三个副本:与第二个副本相同机架的节点
- 更多副本:随机节点
HDFS写流程
- Client:
- 切分文件Block
- 按Block线性和NN获取DN列表(副本数)
- 验证DN列表以后更小的单位流式传输数据
- 各节点,两两通信确定可用
- Block传输结束后
- DN向NN汇报Block信息
- DN向Client汇报完成
- Client向NN汇报完成
- 获取下一个Block存放的DN列表
- 循环1-5步骤
- 最终Client汇报完成
- NN会在写流程更新文件状态
HDFS读流程
- Client
- 和NN获取一部分Block副本位置列表
- 线性和DN获取Block,最终合并为一个文件
- 在Block副本列表中按距离择优选取
HDFS文件权限POSIX
- 与Linux文件权限类似
- r:read; w:write; x:execute
- 权限x对于文件忽略,对于文件夹标示是否允许访问其内容
- 如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan
- HDFS的权限目的:阻止好人做错事,而不是防止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你就是谁
安全模式
- namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作
- 一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志
- 此刻namenode运行在安全模式。即namenode的文件系统对于客户端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败)
- 在此阶段namenode收集各个datanode的报告,当数据块到最小副本数以上时,会被认为是“安全”的,在一定比例(可设置)的数据块被确定为“安全”后,在过若干时间,安全模式结束
- 当检测副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是namenode维护的,而是以块列表存储在datanode中