随着大数据技术的更新迭代,如今 Hadoop 不再是一个单独的技术,而是一套大数据处理的生态圈,如下图所示。
干货总结!一文搞定 ZooKeeper,面试再也不用背八股(文末送PDF));基于Hadoop运算平台的数据仓库Hive、流式计算Storm、数据挖掘工具Mahout和分布式数据库HBase等大数据技术框架。
HDFS
Client
NameNode
NameNode 作为 HDFS 的管理节点,负责保存和管理分布式系统中所有文件的元数据信息,如果将 HDFS 比作一本书,那么 NameNode 可以理解为这本书的目录。
负责接收 Client 发送过来的读写请求;
管理和维护HDFS的命名空间: 元数据是以镜像文件(fsimage和编辑日志(editlog两种形式存放在本地磁盘上的,可以记录 Client 对 HDFS 的各种操作,比如修改时间、访问时间、数据块信息等。
监控和管理DataNode:负责监控集群中DataNode的健康状态,一旦发现某个DataNode宕掉,则将该 DataNode 从 HDFS 集群移除并在其他 DataNode 上重新备份该 DataNode 的数据(该过程被称为数据重平衡,即rebalance,以保障数据副本的完整性和集群的高可用性。
SecondaryNameNode
SecondaryNameNode 是 NameNode 元数据的备份,在NameNode宕机后,SecondaryNameNode 会接替 NameNode 的工作,负责整个集群的管理。并且出于可靠性考虑,SecondaryNameNode 节点与 NameNode 节点运行在不同的机器上,且 SecondaryNameNode 节点与 NameNode 节点的内存要一样大。
DataNode
存放在HDFS上的文件是由数据块组成的,所有这些块都存储在DataNode节点上。DataNode 负责具体的数据存储,并将数据的元信息定期汇报给 NameNode,并在 NameNode 的指导下完成数据的 I/O 操作。
初始化时,集群中的每个 DataNode 会将本节点当前存储的块信息以块报告的形式汇报给 NameNode。在集群正常工作时,DataNode 仍然会定期地把最新的块信息汇报给 NameNode,同时接收 NameNode 的指令,比如创建、移动或删除本地磁盘上的数据块等操作。
HDFS数据副本
HDFS的工作机制
NameNode 工作机制
NameNode简称NN
NN 启动后,会将镜像文件(fsimage和编辑日志(editlog加载进内存中;
客户端发来增删改查等操作的请求;
NN 会记录下操作,并滚动日志,然后在内存中对操作进行处理。
SecondaryNameNode工作机制
当编辑日志数据达到一定量或者每隔一定时间,就会触发 2NN 向 NN 发出 checkpoint请求;
如果发出的请求有回应,2NN 将会请求执行 checkpoint 请求;
2NN 会引导 NN 滚动更新编辑日志,并将编辑日志复制到 2NN 中;
同编辑日志一样,将镜像文件复制到 2NN 本地的 checkpoint 目录中;
2NN 将镜像文件导入内存中,回放编辑日志,将其合并到新的fsimage.ckpt;
将 fsimage.ckpt 压缩后写入到本地磁盘;
2NN 将 fsimage.ckpt 传给 NN;
NN 会将新的 fsimage.ckpt 文件替换掉原来的 fsimage,然后直接加载和启用该文件。
HDFS文件的读取流程
客户端调用 FileSystem 对象的open(方法,其实获取的是一个分布式文件系统(DistributedFileSystem)实例;
将所要读取文件的请求发送给 NameNode,然后 NameNode 返回文件数据块所在的 DataNode 列表(是按照 Client 距离 DataNode 网络拓扑的远近进行排序的),同时也会返回一个文件系统数据输入流(FSDataInputStream)对象;
客户端调用 read( 方法,会找出最近的 DataNode 并连接;
数据从 DataNode 源源不断地流向客户端。
HDFS文件的写入流程
客户端通过调用分布式文件系统(DistributedFileSystem)的create(方法创建新文件;
DistributedFileSystem 将文件写入请求发送给 NameNode,此时 NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等;
如果校验不通过则会抛出I/O异常。如果校验通过,NameNode 会将该操作写入到编辑日志中,并返回一个可写入的 DataNode 列表,同时,也会返回文件系统数据输出流(FSDataOutputStream)的对象;
客户端在收到可写入列表之后,会调用 write( 方法将文件切分为固定大小的数据包,并排成数据队列;
数据队列中的数据包会写入到第一个 DataNode,然后第一个 DataNode 会将数据包发送给第二个 DataNode,依此类推。
DataNode 收到数据后会返回确认信息,等收到所有 DataNode 的确认信息之后,写入操作完成。
最后
Data跳动,回复:图解系列。
另外,非常欢迎大家扫描下方二维码,加我VX:Abox_0226,备注「进群」,有关大数据技术的问题在群里一起探讨。