NameNode:node
NameNode 在整个HDFS中处于关键的位置,它保存了全部文件系统的元数据信息用来监控每一个DataNode的健康状态。只有NameNode知道数据从那里来,将要分配到哪里去,最后返回给谁。安全
DataNode会每3秒钟一次经过TCP 9000端口发送心跳给NameNode。每10次心跳生成一个健康报告,心跳数据都会包含相关该DataNode所拥有的数据块信息。该报告让NameNode知道不一样的机架上不一样的DataNode上存在的数据块副本,并为此创建元数据信息。服务器
支持CPU和内存两种资源调度方式,容许配置每一个节点、 每一个任务可用的CPU和内存资源总量
• 能够根据实际须要和CPU性能将每一个物理CPU划分红若干个 虚拟CPU。管理员可为每一个节点单独配置可用的虚拟CPU个数,用户程序也可指定每一个任务须要的虚拟CPU个数
• 可为每一个节点单独配置可用内存,采用线程监控的方案控制内存使用,发现任务超过约定的资源量会将其杀死
• Mesos等资源管理软件
基于zookeeper的HA原理和相关知识框架
非HA弊端 HDFS集群的分布式存储是靠namenode节点(namenode负责响应客户端请求)来实现。在非HA集群中一旦namenode宕机,虽然元数据不会丢失,但整个集群将没法对外提供服务,致使HDFS服务的可靠性不高,这在实际应用场景中显然是不可行的。 HA机制 已知致使服务可靠性不高的缘由是namenode节点宕机,那么怎么才能避免这个namenode节点宕机呢?一个容易想到的解决方案是部署两台namenode节点,造成主备模式(active/standby模式),这样一旦active节点宕机,standby节点当即切换到active模式。事实上HA机制就是采起的这种方案。要想实现该机制,须要解决如下问题: 1.为何选择主备模式,而不是主主模式(active/active模式),也即让两个namenode节点都响应客户端的请求 一个显然的前提是,两台namenode节点须要保存一致的元数据。 咱们知道namenode节点是用来管理这些元数据的,响应客户端请求时(上传)须要增长元数据信息,若是使用主主模式,那么两个节点都将对元数据进行写操做,怎么同步是个很困难的问题。所以,只能有一台机器响应请求,也即处在active状态的节点(可称为主节点),而另外一台namenode在主节点正常工做状况下仅用来同步active节点的元数据信息,这个namenode称为备用节点(处在standby状态),可见,要解决的问题主要是怎么同步active节点的元数据信息。 2.怎么同步两个namenode节点的元数据 响应客户端请求的是active节点,所以只有active节点保存了最新的元数据。元数据分为两部分,一部分是刚写入新的元数据(edits),另外一部分是合并后的较旧的(fsimage)。HA机制解决同步问题的方法是将active节点新写入的edits元数据放在zookeeper集群上(zookeeper集群主要功能是实现少许数据的分布式同步管理),standby节点在active节点正常状况下只须要将zookeeper集群上edits文件同步到本身的fsimage中就能够。 Hadoop框架为这个集群专门写了个分布式应用qjournal(依赖zookeeper实现),实现qjournal的节点称为journalnode。 3.怎么感知active节点是否宕机,并将standby节点快速切换到active状态? 解决方案是专门在namenode节点上启动一个监控进程,时刻监控namenode的状态。对于处在active状态的namenode,若是发现不正常就向zookeeper集群中写入一些数据。对于处在standby状态的namenode,监控进程从zookeeper集群中读数据,从而感知到active节点是否正常。若是发现异常,监控进程负责将standby状态切换到active状态。这个监控进程在hadoop中叫作zkfc(依赖zookeeper实现)。 4.如何在状态切换时避免brain split(脑裂)? 脑裂:active namenode工做不正常后,zkfc在zookeeper中写入一些数据,代表异常,这时standby namenode中的zkfc读到异常信息,并将standby节点置为active。可是,若是以前的active namenode并无真的死掉,出现了假死(死了一下子后又正常了,哈哈,是否是很搞笑),这样,就有两台namenode同时工做了。这种现象称为脑裂。 解决方案:standby namenode感知到主用节点出现异常后并不会当即切换状态,zkfc会首先经过ssh远程杀死active节点的 namenode进程(kill -9 进程号)。可是(这样还不行,惊讶),若是kill指令没有执行成功咋办??若是在一段时间内没有收到执行成功的回执,standby节点会执行一个自定义脚本,尽可能保证不会出现脑裂问题!这个机制在hadoop中称为fencing(包括ssh发送kill指令,执行自定义脚本两道保障)