HDFS特点,底层结构,重要组成部分、安全模式,重要进程,高可靠性,冷备份,读写流程,通讯过程
谈谈什么是Hadoop?
- Hadoop是一个开源软件框架,用于存储大量数据,并发计算/查询节点的集群上的数据。
- Hadoop包括以下内容:
- HDFS(Hadoop Distributed File System):Hadoop分布式文件存储系统。
- MapReduce:分布式计算框架。它以分布式和并行的方式处理大量的数据。
- YARN(资源定位器):用于管理和调度集群资源的框架。hadoop2.x提出的
HDFS文件系统的特点
-
master/slaver架构 主从架构
-
分块存储 block 128M
-
名字空间 NameSpace HDFS 支持传统的层次型文件组织结构任何对文件系统名字空间或属性的修改
-
数据通过副本存储,提高了容错性
-
能够处理很多数据,对应用程序的高吞吐量访问
-
方便扩展
-
节约成本可建在廉价机器上、分布式
底层文件结构 好处
- HDFSz目前默认块大小在Hadoop2.x版本中是128M,减少寻址开销
- 目前磁盘的传输率约为100M/s,而HDFS读取文件时最佳的寻址时间为10ms,寻址时间为传输时间的百分之1时最佳,所以定义块大小为128M,1秒左右可以快速读取完毕;本质上HDFS的块大小取决于磁盘的传输速率。
- 简化存储系统的设计。因为块是固定的大小,计算磁盘的存储能力就容易多了
- 以块的形式存储 不需要全部存在一个磁盘上,可以分布在各个文件系统的磁盘上
HDFS存储文件类型
- 面向行:同一行的数据存储在一起,即连续存储。
- text
- SequenceFile 用于存储键值对的二进制文件格式 支持压缩
- MapFile 排序后的sequencefile
- 面向列:整个文件被切割为若干列数据,每一列数据一起存储,不适合流式写入,因为一旦写入失败,当前文件无法恢复
- RC File 是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个 record 在一个块上,避免读一个记录需要读取多个 block。其次,块数据列式存储,有利于数据压缩和快速的列存取。RCFile 目前没有性能优势,只有存储上能省 10% 的空间。
- ORC File :优化的RC FIle
HDFS的组成,重要角色
-
NameNode节点,负责管理文件系统的命名空间、集群配置信息和存储块的复制等,相当于目录
- 将文件的元数据保存在一个文件目录树中
- Editlog 日志文件,记录每次元数据的变化
- FsImage 镜像文件,内存中元数据在本地磁盘的映射
- PS:NameNode的内存中是FsImage+EditLog
-
DataNode节点,HDFS的执行者。负责文件的存储,以块为存储单位,数据分散在不同DN节点,支持一次写入多次读取等。相当于正文。
- 每个存储数据的节点运行一个 datanode 守护进程。
-
SecondaryNameNode,NameNode的冷备份,定期同步NameNode的日志(EditLog)和镜像文件(FsImage),并将日志和镜像合并成新的镜像文件回传给NameNode
-
热备份 NameNode停止工作后,热备份NameNode马上接替NameNode的工作
-
冷备份 同SecondaryNmaeNode
安全模式
https://www.cnblogs.com/si-137/p/13289673.html
-
HDFS的启动和关闭都是先启动NameNode,在启动DataNode,最后在启动secondarynamenode。
-
NameNode启动时,会将镜像文件(Fsimage)和编辑日志(Edits)加载到内存。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode处于安全模式。
-
当数据块的副本数不满足(dfs.replication.min=1)最小副本数时 数量少于要求的99%,会自动补全,不会主动退出安全模式;
-
当系统处于安全模式时会检查数据块的完整性。在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求
-
hdfs dfsadmin -safemode get #查看安全模式状态 hdfs dfsadmin -safemode enter #进入安全模式 hdfs dfsadmin -safemode leave #离开安全模式
HDFS的几个进程
- namenode
- 负责接收客户端读写数据请求
- 负责数据块副本的存储策略
- 存储元数据信息 元数据保存在内存中
- 管理文件系统名称空间
- datenode
- 存储实际的数据块
- 每个存储数据的节点运行一个 datanode 守护进程。
- secondary name node
- 与name node,通讯定期合并FSimage和Edits编辑日志,合并为最新的镜像文件
- 保存HDFS元数据的快照
- resource manager 统一资源调度和管理器
- 处理客户端请求
- 监控node manger
- 启动或者监控 appliaction master
- 资源的分配和调度
- node manger 提供计算资源
- 管理单个节点上的资源,YARN中每个节点上的代理
- 与ResourceManger保持通信,监督Container的生命周期管理
HDFS的高可靠性
- NN的高可靠性
- 热备份:ZooKeeper就是协调机制,在HDFS中主要就是协调选举主备NameNode节点。每个NN节点都会通过心跳与ZooKeeper保持联系,报告自己的状态信息虽然备NN节点不工作,但它里面的元数据信息和DN节点状态信息跟主NN节点是同步更新的,所以一旦备NN被选为主NN节点,会立刻接替主NN节点的工作。
- 冷备份 secondary node工作原理:
- 当有对元数据执行操作时,NN节点会生成** 新的对应日志文件** Editlog.new
- NN节点内存里存放的是日志文件(Editlog)和元数据镜像文件(Fsimage) ,namenode 滚动正在写的edits日志,SecondaryNN通过NN节点定时同步checkpoint获取得到滚动前的日志和镜像文件,
- SecondaryNN中将二者合并成新的镜像文件Fsimage.ckpt文件并上传到主节点上
- 主节点将原来的镜像文件更新NN,此时在之前过程中新的日志文件(Editlog.new)已经变成Editlog,不在是新日志,与更新后的镜像文件重新同步到SecondaryNN上
- 当NN故障退出需要重新恢复时,可以从SecondaryNN的工作目录中将Fsimage拷贝到NN的工作目录,以恢复NN中的元数据。
- 默认情况下进行ckeckpoint(合并镜像及编辑日志)的触发条件是什么?
- 2NN每隔一小时执行一次checkpoint
- 一分钟检查一次Edits文件的操作次数,当操作次数达到1百万时,2NN执行一次checkpoint
- DN的高可靠性
- 数据的副本机制,数据冗余
- DN受NN节点的监控,若挂了会重新找一带DN节点,根据副本数据进行备份。同时修改元数据信息和DN节点状态信息
HDFS的读写流程
-
写流程
- 用户在Client向NN节点发起命令,通过RPC与NN建立通讯,将文件分块(一般128MB一块)和设置副本参数(3个)
- NN节点负责协调Client和DN节点的交互,从管理的DN节点中找到合适的3个节点(两个相同机架、一个不同机架),把DN节点地址和路径参数给Client,并记录元数据;
- Client通过NN的回复信息找到第一个DN节点,开始发送数据块,以及备份副本DN地址列表
- Client 开始往 A 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存),以 packet 为单位(默认64K),A 收到一个 packet 就会传给 B,B 传给 C(串形写入)。A 每传一个 packet 会放入一个应答队列等待应答,在 pipeline 反方向上, 逐个发送 ack(命令正确应答)
- Client收到DN节点最后一个Block存盘成功的确认信息后,向NN节点发送结束信息
-
读流程
- Client向NN节点发出读请求,包含文件名等信息
- NN收到请求,NameNode会视情况返回文件的部分或者全部block列表,**对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址;**按照DN与客户端的距离排序
- Client根据收到的DN节点信息,选取每个块所在路径开销最小的DN节点执行读取操作。
- 客户端和DN通讯,底层上本质是建立 Socket Stream直到数据读取完毕,并行的读取block信息,并会checksum验证(并行读取)
yarn执行流程
- Client提交作业请求
- ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个Container(容器),并将 ApplicationMaster 分发到这个容器上面
- 在启动的Container中创建ApplicationMaster
- ApplicationMaster启动后向ResourceManager注册进程,申请资源
- ApplicationMaster申请到资源后,向对应的NodeManager申请启动Container,将要执行的程序分发到NodeManager上
- Container启动后,执行对应的任务
- Tast执行完毕之后,向ApplicationMaster返回结果
- ApplicationMaster向ResourceManager 请求kill
启动集群时,我们要对namenode进行格式化操作?为什么只能格式化一次
- 因为格式化NameNode,就会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据(现象datanode无法正常启动)
- 重新格式化NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode,后再启动集群
客户端和NameNode、DataNode通信过程
- client和NameNode之间是通过RPC通信
- DataNode和NameNode之间是通过RPC通信
- client和DataNode之间是通过简单的Socket通信
- DataNode与DataNode之间通过RPC通信
- Remote Procedure Call简称:RPC:远程过程调用协议。
- 请求程序就是一个客户机,而服务提供程序就是一个服务器。
- 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
- 在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。