hadoop2概述
hadoop1和hadoop2的结构比较:
hadoop1中有HDFS和MapReduce.HDFS负责存储,MapReduce负责计算,但是有几个问题需要解决:
1.单点的问题.HDFS的namenode和MapReduce的jobTracker都是单点.单点的缺点就是,这个点一旦奔溃了,整个集群就不能工作了,虽然也有解决方案,但是都不够彻底,最好的解决方案,不会有单点,就得有两个或者更多的点在运行的时候就会有一个点发挥主要作用的,其余的点是用来后备的.一旦有问题的话,他们就会切换.hadoop就是为了解决这种问题.
2.hadoop1中我们的hdfs存储海量数据是按照block来存的,block有大有小,在一个集群中只能规定有一种大小,这种用起来就比较别扭,因为企业的数据源不见得一致,有的数据可能大一些,有的数据可能小一些,在我们hadoop1的hdfs中,随着存储的block的增多,那么namenode的内存压力就会增大,当我们namenode内存装不下block的元数据信息的时候,那么我们的集群就不能用了.namenode所在服务器的内存不够用时,那么集群就不能工作了.
3.mapredcuce所在集群的资源利用率比较低,如果只做mapreduce计算的话,会更低.
在hadoop1中也有相应的解决方案,namenode和jobtracker有单点,但是发生风险的概率相当低,但是对应着都有一定的备份方案,所以一般的时候都没有什么问题.买服务器的时候,买高内存的话,一般问题都不大,真出现节点装不小,再搭一个集群也是没有问题的,mapreduce资源利用率低也不是什么大事,不过我们期待它的资源利用率高一点.hadoop2就是针对hadoop1的一个新的解决方案.
hadoop2的结构:
底层依旧是数据存储,那么在上面一层就没有mapreduce了,有了一个新的yarn,yarn是一个资源管理的框架,上边跑的mapreduce不属于hadoop2的平台,只是在yarn上的一个应用而已.
hadoop计算永远是重点,yarn上可以跑mapreduce,也可以跑其他的一些东西,这些东西都是一些应用,这些应用需要利用这些资源.yarn负责集群的资源管理.
hadoop1中mapreduce负责资源管理和数据处理,在hadoop2上,yarn属于资源管理,数据处理归外边的应用,把hadoop1上的功能给分解了,mapreduce 本身就是一个处理的框架,像一个插件插在yarn上,在yarn上可以跑Batch MapReduce,Interactive Tez,Online Hbase ,Steraming Strom、S4,Graph Graph, In-Memory Spark,Hrc Mpi OpenMpi.
yarn只做资源管理,控制着集群上边的cpu,内存,网路,以及硬盘.里边的那些框架要想运行的话,离不开yarn.
程序在运行时还是需要从hdfs上请求数据,主要的是上边的应用来请求数据,不是yarn,yarn只负责资源管理硬件环境的,hdfs上的数据其实是应用来处理的.hdfs上存放的是数据资源,应用和hdfs上的数据有关系.也可以理解为管理硬件资源,分担了一部分jobtracker的功能.
jobtracker负责资源管理和应用的监控,yarn只做上边的资源管理,应用管理是mapreduce做,功能单一了.
Hadoop2 HDFS的HA和Federation:
HA:解决namenode的单点问题.
namenode会区分状态一种active(激活)状态,standby(准备)状态,在我们namenode运行的时候一个属于active,一个属于standby,对外提供服务是active,standby属于时刻准备的namenode,准备着active状态的namenode宕掉,standby状态的接管,因为是两个namenode,有两个访问地址,所以HA这块对外提供了一个统一的名称,用户不需要关心什么是active,什么是standby,只需要访问这个地址就行了,地址会连正确的active,如果对外运行的地址宕了,机器自己会立即切换到另外一台机器上运行.
两个namenode之间如何进行数据的同步:
1.依赖于硬件linux操作系统的.NFS,网络连接系统 用来数据共享的.
2.还有一个就是依赖于软件层面的,在hadoop上有一个新的节点,journalnode,软件层面上可以提供一个journalnode的集群,使用这个集群可以为我们的namenode提供数据同步做支持.journalnode会接收active的状态,active一旦有变化,journalnode会收到namenode的变化,然后journalnode集群的其他节点都会接收变化,并且standby端会接收通知同步journalnode上的数据.journalnode就是专门用来同步数据的.为什么集群呢?因为如果有一个journalnode宕了,数据也能真的同步过去.
active的数据是journalnode接收的,这集群之间的节点是要做同步的,然后standby就可以从任意一个journalnode上读数据了.journalnode不能代替以前的secondarynode,secondarynode是进行数据合并的,journalnode是进行一个数据的中转的平台,如果往其中的两个journalnode上写成功了,第三台失败了,在journalnode集群这块应该叫没写成功.
active状态的namenode如果宕了,可以通过两种方式进行切换,手工和自动切换。
手工切换需要人工干预,不好,自动切换必须依赖于外界,这时候又引入zookeeper集群架构.zookeeper集群和journalnode性质有些相似,但是他们做的事是不一样的。
zookeeper集群是用来实现namenode之间状态切换的。所以这个active状态的namenode和standby状态的namenode也会也zookeeper进行通信,zookeeper的目的是当一个宕了的话,别的还活着,他们之间的状态也是 进行实时同步的,实现状态切换一利用zookeeper集群,二利用外部的一些脚本,也就是说当active和standby进程起来的时候回去zookeeper进行注册,注册之后我们的zookeeper就知道有两个namenode来的,其中一个叫active,一个叫standby,如果active状态的一旦宕了,zookeeper就会接到通知.因为zookeeper是和我们的namenode连接在一起的,如果有一个连接宕掉的话,连接就中断了,连接一旦中断,zookeeper就会感知到有一个节点宕了,根据namenode的状态去做操作。zookeeper本身并没有转换的能力,只是用来判断有一个节点宕了,那么另外一个节点应该变过来。节点状态的变换,还需要我们java程序的处理。也就是说框架内部已经内置了状态的切换的这个命令,命令的触发时间是由zookeeper集群下的。
在hadoop2中zookeeper只是管理、监控namenode的状态的变化。如果没有zookeeper集群就只能手工切换
federation:
解决问题:如果一个集群的内存不够用时,那么这个集群就不能用了,可以启动多个集群。
新建集群的时候,一个namenode对应5个datanode,再新建一个集群的时候,对应着也是一个namenode对应着5个datanode,这些datanode不能重用,因为datanode节点上跑的是java进程,那么再起java进程的时候就会混淆,假设一个namenode对应这六个datanode,namenode的内存满了,datanode的容量可以是不限制的,上千台都可以,那么再建一个集群的话,一个namenode肯定也对应着这N多的datanode,又浪费了一些机器,其实一些datanode上还没有存满数据呢。
hadoop2的federation的含义是:我可以搭多个集群,数据还是存放在datanode上的,namenode不共享,datanode共享。
namenode内存满了,自身已经都不够了,所以他没法共享。datanode有有十台机器,每个有1T的硬盘,在原的集群中,1T的硬盘差不多快用完了,但是你的服务器不只是能放1T,可以放多台服务器,我可以放多块硬盘,可以扩展到几百个T都没问题,所以硬件机器是可以共用的。这样起码我们的CPU,主板,内存这些资源不需要再次投资了,只需要往上增加硬盘就可以了。
federation是为了解决我们的namenode单节点内存不足,造成我们的集群不能用问题。
datanode的节点利用率也提高了。两套集群其实是两套HDFS了,元数据其实是不一样的,datanode上面放的数据是有标记的,标记数据是属于哪个集群的.一般100万个文件,在namenode这边代表1G的内存。这和两个集群的区别就是datanode共享。
多个namenode有联系吗:
federation两个集群多个namenode的联系是:datanode节点是共享的。没有journalnode和zookeeper的事,journalnode和zookeeper是属于HA的范围。
想要访问两个不同的HDFS的时候,因为是两个不同的集群,所以要分开去写。
federation是多个HDFS集群,在多个集群中每一个集群内部可以自己搭建HA环境,多个HA组成一个federation,这个federation可以不是HA,只要保证他们是两个不同的集群就可以了。
federation和两个hadoop集群的区别:是否共享datanode集群。
HA的自动fallover:使用HA之后,可以自动进行状态的切换。
我们的namenode 一个是active,一个是standby,两个namenode之间是共享数据的,我们的zookeeper集群实现了他们之间状态的监管,在运行的过程中,我们应该怎么样让他们的状态不同而进行切换呢?这要通过工具FalloverController,它是用来切换的,所以我们在配置自动切换的时候配置zookeeper集群,还要配置FailloverController。FailloverController是用来监控各个节点的状态的。如果有问题,就会发送通知,根据内部的判断来做出决策。
namenode就是只做HDFS存放元数据的,状态切换或者状态监控不归namenode管,得需要第三方来做,
FailoverController是属于zookeeper的,zookeeper集群是 管理状态的,Namenode启动之后会在zookeeper注册状态。注册之后,节点一旦宕了,zookeeper得知道,但是zookeeper是通过FailoverController来监管他们的,
FailoverController是HDFS里边的一个进程,进程就是用来监控状态的变化的。
active和standby两个namenode数据共享是通过NFS或者是journalnode集群