程序员面试必考题(33)---Hadoop的守护进程
转载自微信公众账号:开店工作室(kaidiancs)
Hadoop是由Apache基金会所开发的一个开源的、能够对大数据进行分布式存储和处理的软件框架。Hadoop框架中最核心的设计就是HDFS和MapReduce,HDFS提供了大数据的分布式存储,MapReduce提供了对大数据的分布式计算。
守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端且周期性地执行某种任务或等待处理某些发生的事件。守护进程在它被启动时开始运转,直到被关闭时才退出。
正常工作的Hadoop集群中,在网络分布的不同服务器上运行着一组守护进程,分别是NameNode(名字节点)、DataNode(数据节点)、SecondaryNameNode(次名字节点)、JobTracker(作业跟踪节点)和TaskTracker(任务跟踪节点)。
在分布式存储和分布式计算方面,Hadoop都是采用主/从(Master/Slave)结构。
HDFS的基本架构如图1所示。主节点(Master)服务器上运行NameNode守护进程,从节点(Slave)服务器上运行DataNode守护进程,每个集群有一个SecondaryNameNode守护进程。
NameNode管理分布式文件系统的整体运行状态是否正常、分布式文件系统的命名空间和元数据。例如,NameNode负责执行文件打开、关闭、重命名等操作,跟踪文件如何分块,负责向DataNode分配数据块并建立数据块与DataNode的对应关系。
NameNode中有2个文件,一个是映像文件FsImage,保存整个HDFS文件系统的目录结构;另一个是日志文件Editlog,保存HDFS文件系统操作的日志信息。当NameNode启动时,它首先从映像文件(FsImage)中读取HDFS的状态,接着应用日志文件Editlog更新FsImage内容,并清空Editlog文件。因为NameNode只有在启动阶段才合并FsImage和Editlog,所以久而久之日志文件Editlog可能会变得非常庞大,特别是对大型的集群。日志文件太大的另一个副作用是下一次NameNode启动会花很长时间。
DataNode提供数据块的备份存储。客户端直接与DataNode守护进程通信,读取或写入数据块到本地文件系统的实际文件中;DataNode与其他DataNode进行通信,复制数据块以实现副本存储;DataNode与NameNode通信,持续不断地向NameNode报告,以保持NameNode中元数据为最新状态。
SecondaryNameNode用于监护HDFS集群状态的辅助守护进程。一方面,SecondaryNameNode定期合并FsImage和Editlog日志,将Editlog日志文件大小控制在一个限度内,以减少NameNode重启时间。另一方面,它会与NameNode进行通信,以便定期地保存HDFS元数据的快照。由于NameNode是单点的,通过SecondaryNameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。像NameNode一样,每个集群有一个SecondaryNameNode,因为合并FsImage和Editlog需要大量占用CPU时间,内存需求和NameNode在一个数量级上,所以SecondaryNameNode通常也独占一台服务器,该服务器不会运行DataNode和JobTracter守护进程。
MapReduce的基本架构如图2所示。主节点(Master)服务器上运行JobTracter守护进程,从节点(Slave)服务器上运行TaskTracter守护进程。
JobTracter监控MapReduce作业的整个执行过程。例如,客户端向JobTracter提交作业后,JobTracter进行作业的初始化准备,查询数据分片,构建和准备相应的Map或Reduce任务,启动TaskTracter节点去执行任务。
TaskTracter管理各个任务在从节点(Slave)上的执行情况。例如,TaskTracter根据所分配的具体任务,获取相应的作业数据,创建所需要的Java虚拟机,并启动相应的Map任务或Reduce任务。若是Map任务,把中间数据保存在本地节点上,若是Reduce任务,则输出数据到HDFS。每个从节点上仅有一个TaskTracter,但每个TaskTracter可以生成多个Java虚拟机,并行处理多个Map或Reduce任务。
TaskTracter定期与JobTracter通信,报告任务的执行情况。若在指定的时间内JobTracter没有收到TaskTracter的消息,认定该TaskTracter崩溃,重新提交相应任务到集群中其他节点执行。
图2.MapReduce的基本架构
图3描述了典型Hadoop集群的结构。为了实现Hadoop系统设计中“计算向数据迁移”的原则,每个从节点同时运行一个DataNode和TaskTracter,以此让每个TaskTracter尽量处理存储在本地DataNode上的数据。在小型集群中,NameNode和JobTracter可以运行在同一个主节点上;在大型集群中,NameNode和JobTracter分别运行在两台机器上。
图3. 典型Hadoop集群的结构
运行Hadoop时需要启动这5个守护进程,启动和停止有3种方式。
- 启动或者停止全部Hadoop守护进程
启动命令:start-all.sh
顺序NameNode、DataNode、SecondaryNameNode、JobTracker、TaskTracker
停止命令:stop-all.sh
顺序JobTtracker、TaskTracker、NameNode、DataNode、SecondaryNameNode
2.分别启动HDFS和MapReduce
启动HDFS命令:start-dfs.sh
顺序NameNode、DataNode、SecondaryNameNode
启动MapReduce命令:start-mapred.sh
顺序JobTracker、TaskTracker
停止MapReduce命令:stop-mapred.sh
顺序JobTracker、TaskTracker、
停止命令HDFS命令:stop-dfs.sh
顺序NameNode、DataNode、SecondaryNameNode
3.按序逐一启动和停止5个守护进程
启动命令:
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start secondarynamenode
hadoop-daemon.sh start jobtracker
hadoop-daemon.sh start tasktracker
停止命令:
hadoop-daemon.sh stop jobtracker
hadoop-daemon.sh stop tasktracker
hadoop-daemon.sh stop namenode
hadoop-daemon.sh stop datanode
hadoop-daemon.sh stop secondarynamenode
查看17道真题和解析
