1、结构
hadoop1:HDFS、MapReduce
hadoop2:HDFS、MapReduce、Yarn
2、作业调度流程和作业调度器
hadoop1:
client(多个) —— submitJob—— JobTracker(对应nameNode,单个) ——assignTask——TaskScheduler(维护taskList,单个,为JobTracker的一部分)——initJob——TaskTracker(对应nodeManager,多个,维护task,向JobTracker汇报Task和资源情况,JobTracker会根据这些信息再次分发Task)
缺点:JobTracker完成太多的任务,导致资源开销非常大,如果任务太多,会导致CPU繁忙、内存溢出等情况,而且JobTracker是单点的,不能高可用
hadoop2:
client(多个)——submitJob——ResourceManager(对应nameNode,可配置HA高可用)———initJob——AppMaster(对应nodeManager,维护本次任务需要的资源和TaskList,向resourceManager汇报Job的信息和资源信息)——划分container(对应nodeManager,对资源进行隔离,防止任务滥用资源)
优点:任务分散在各个nodeManager节点上,ResourceManager的资源开销不会过大,而且ResourceManager可配置HA高可用,不容易出现单点故障
3、高可用
hadoop1:
NameNode不可配置高可用,SecondaryNameNode只能是作为NameNode备份,并协助NameNode工作(合并 editlogs并拷贝到NameNode),如果NameNode挂掉了,SecondaryNameNode并不能作为NameNode节点启动,也就是说,集群会停止工作。作为备份,NameNode节点可以通过SecondaryNameNode恢复数据。
JobTracker不可配置高可用,如果JobTrack挂掉了,那任务就不能被继续执行,集群会停止工作。
hadoop2:
NameNode可以配置高可用,会形成两个NameNode,一个是Active状态,另一个standby状态。如果Active节点挂机,那standby的状态会转换成Active状态。它们状态通过ZooKeeper、ZKFailoverController、HealthMonitor共同维护。editlogs通过JournalNode(和zookeeper一样,作为独立的进程,是高可用集群,消耗资源低)写入到本地磁盘,实现元数据共享。(还有别的数据共享方式)
ResourceManager可配置高可用,会形成两个ResourceManager,一个是Active状态,另一个standby状态。如果Active节点挂机,那standby的状态会转换成Active状态。状态通过ZooKeeper集群维护。
总结:
hadoop1的NameNode和JobTracker容易出现单点故障从而导致集群不可用,JobTracker在任务比较多的时候容易出现JobTracker节点(也就是nameNode节点)CPU繁忙和OOM。而Hadoop2的NameNode和ResourceManager都可以配置HA高可用,使得集群高可用,ResourceManager更是不会出现像JobTracker一样资源消耗大,从而使集群拥有更好的扩展性和计算能力。