Hadoop目前的HA(High Availability)机制分析和源代码研究

2019-03-28 13:26|来源: 网络

Hadoop的设计初衷是服务于off-line的数据存储和处理应用。随着这个产品的不断成熟和发展,对于支持on-line应用的需求越来越强烈。例如HBase已经被Facebook和淘宝用到了在线存储应用中。所以Hadoop的on-line化也是一个趋势。目前制约Hadoop作为on-line存储和处理的瓶颈主要是系统的availability。衡量一个分布式系统的主要指标有:reliability, availability & scalability。Hadoop可以做到横向扩展,所以scalability非常好;而用户存在Hadoop里的数据几乎不会丢失,所以reliability也是非常不错的;目前的主要问题在availability,也就是用户向HDFS集群请求数据的时候集群是否能够保证100%提供服务,目前的主要问题体现在HDFS的SPOF(single point of failure),整个HDFS集群的启动/重启时间非常长,配置参数无法动态更改等。这些方面都是apache社区目前工作的重点,本文主要讨论HDFS NameNode的SPOF问题相关的HA机制。

Hadoop目前的trunk中的代码已经merge了原来的ha-branch,所以现在的trunk中的代码已经实现了基本的HA机制的功能。Hadoop PMC的人表示将会在后面的版本中发布这个功能。下面这张图是目前的HDFS HA的实现逻辑。

Right now the HA branch supports HOT-Failover, except that it is manual failover. We are now moving into a phase to implement automatic failover.

Significant enhancements were completed to make HOT Failover work:
- Configuration changes for HA
- Notion of active and standby states were added to the Namenode
- Client-side redirection
- Standby processing editlogs form Active
- Dual block reports to Active and Standby.

这是Hadoop mailing list中关于目前HA现状的阐述。下面首先简单介绍下这5个方面是怎么实现的,后面从源代码的角度分析具体的实现细节。

(1) Configuration changes for HA

在配置文件中会增加关于HA配置的参数,具体参数配置可以参考CDH4 Beta 2 High Availability Guide,这里介绍一些比较重要的参数。

例如dfs.ha.namenodes.[nameservice ID]这个参数表示在[nameservice ID]这个nameservice下的两台NameNode(分别作为Active和Standby模式运行)的主机名。然后针对每一台NN配置其对应的dfs.namenode.rpc-address.[nameservice ID].[name node ID]用来标示每一台NN。

由于目前的两台主机之间的HA机制是通过一个共享存储来存放editlog来实现的。所以需要配置参数dfs.namenode.shared.edits.dir表示共享存储的位置,一般是通过NFS挂载的形式,所以其实这个参数的值就是一个本地文件系统中的目录。

dfs.client.failover.proxy.provider.[nameservice ID]这个参数指定具体的failover proxy provider类,也就是在client端发现原来Active的NameNode变成了Standby模式时(在client发送RPC请求时返回了StandbyException时),该如何去连接当前Active的NameNode。目前的Hadoop里只有一个具体实现策略ConfiguredFailoverProxyProvider,实现方法就是如果client failover时,下次把RPC发送给另外一个NameNode的proxy。

另外就是dfs.ha.fencing.methods参数,指定在Active NameNode切换到Standby模式时,确保切换成功或者进程被杀死。
(2) Notion of active and standby states were added to the Namenode

有两种模式的NameNode,分别是Active和Standby模式。Active模式的NameNode接受client的RPC请求并处理,同时写自己的Editlog和共享存储上的Editlog,接收DataNode的Block report, block location updates和heartbeat;Standby模式的NameNode同样会接到来自DataNode的Block report, block location updates和heartbeat,同时会从共享存储的Editlog上读取并执行这些log操作,使得自己的NameNode中的元数据(Namespcae information + Block locations map)都是和Active NameNode中的元数据是同步的。所以说Standby模式的NameNode是一个热备(Hot Standby NameNode),一旦切换成Active模式,马上就可以提供NameNode服务。

(3) Client-side redirection

Client的通过RPC的Proxy与NameNode交互。在client端会有两个代理同时存在,分别代表与Active和Standby的NameNode的连接。由于Client端有Retry机制,当与Active NameNode正常通信的client proxy收到RPC返回的StandbyException时,说明这个Active NameNode已经变成了Standby模式,所以触发dfs.client.failover.proxy.provider.[nameservice ID]这个参数指定的类来做failover,目前唯一的实现是ConfiguredFailoverProxyProvider,实现方法就是下次开始把RPC发向另外一个NameNode。此后的RPC都是发往另外一个NameNode,也就是NameNode发生了主从切换。

public synchronized void performFailover(T currentProxy) {
  
currentProxyIndex = (currentProxyIndex + 1) % proxies.size();
  
}

(4) Standby processing editlogs form Active

开启Standby模式后,Standby NameNode会通过EditLogTailerThread从共享存储中读取Active NameNode写到那里的Editlog,然后执行操作,从而保持自己的元数据是最新的,所以说是热备。

(5)Dual block reports to Active and Standby.

DataNode的Block report, block location updates和heartbeat等RPC操作会发向两个NameNode,从而使得两个NameNode的Block locations map都是最新的,这样可以做到切换主从后原来的从(新的主)不再需要block report的时间。

可以看出client与NameNode之间的RPC是只向一个NameNode发送的(收到StandbyException后才会重试另外一个);而DataNode与NameNode之间的RPC在任何时候都是同时向两个NameNode发送的。

下一篇文章将从代码的角度来分析HDFS的HA机制。http://www.linuxidc.com/Linux/2012-09/70414p2.htm

相关问答

更多
  • 看起来您在/ etc / hadoop / conf目录中使用了错误的客户端配置。 有时Cloudera Manager(CM)部署客户端配置选项可能不起作用。 正如您启用NN HA,您应该在hadoop客户端配置目录中拥有有效的core-site.xml和hdfs-site.xml文件。 要获取有效的站点文件,请从CM转到HDFS服务从“ 操作”按钮中选择“ 下载客户端配置”选项。 您将以zip格式获取配置文件,解压zip文件,并用提取的core-site.xml替换/etc/hadoop/conf/co ...
  • 使用DNS负载平衡 ,这基本上是循环DNS 。 DNS负载平衡是在域名系统(DNS)中配置域的做法,以便客户端对域的请求分布在一组服务器计算机上。 域可以对应于网站,邮件系统,打印服务器或可通过因特网访问的其他服务。 在您的情况下,服务器组分布在云提供商之间。 很多警告和挑战,但它是可能的。 另请参阅在AWS和Rackspace之间进行负载平衡的最佳方法 。 类似的用例。 Use DNS load balancing, which is basically Round robin DNS. DNS load ...
  • 有关如何在hadoop v1中执行此操作的互联网上有许多资源,例如http://www.hadoopsphere.com/2012/11/understanding-high-availability-options.html或http://hortonworks.com/blog/ HA-名称节点换HDFS与-的hadoop-1-0-部分-1 / 在Hadoop 2.0中,这本身就解决了。 There are many resources on the internet on how to do that ...
  • 对于ASF Hadoop 1.1.2,没有可靠的NameNode HA选项。 这些是2.0版本发布的,包含在像Cloudera的CDH4这样的流行发行版中。 NameNode HA的选项包括运行主NameNode和热备用NameNode。 它们共享编辑日志,可以是NFS挂载,也可以是HDFS本身的仲裁日志模式。 前者为您提供了存储HDFS元数据的外部源的好处,而后者为您提供了Hadoop外部无依赖性的好处。 就个人而言,我喜欢NFS选项,因为您可以轻松快照/备份驻留在文件服务器上的数据。 这种方法的缺点是在 ...
  • namenode和jobtracker共享一个类似的HA实现,只要它们都扩展了相同的基类。 它们都使用后备zookeeper集群来决定哪个可用节点处于活动状态。 zookeeper中使用的位置是通过将故障转移组名称(即dfs.nameservices和mapred.job.tracker给出的值) mapred.job.tracker到可配置前缀来构造的。 对于这两种服务,默认情况下可配置前缀为/hadoop-ha 。 这意味着如果两个服务配置了相同的故障转移组名称(例如, my-application ) ...
  • 近年来,建立这样的系统一直是我的日常工作。 我发现jgroups是一个非常有用的工具,可以接收和处理这种类型的分组事件。 如果你想建立你自己的高可用性基础架构,就是这种情况。 我不知道,但也许在你的情况下,只需一个简单的反向代理(如HAProxy)就足够了。 Building such a system has been my routine job in recent years. I have found jgroups a very usable tools to receive and handle ...
  • Linux HA是一种基于软件的高可用性集群服务,用于提高多种服务的能力。 这意味着 - 此Linux HA用于保持所需的服务正常运行,无需停机。 这使用心跳的概念来标识集群中的服务状态。 例如,如果您在hostA上运行Web服务器,则它也会被复制以在hostB上运行。 每当hostA关闭时,hostB就会启动并提供请求。 即服务器没有提供停机时间。 而Apache Hadoop是一个解决存储大量数据和处理数据的问题的框架。 Linux HA is a software based High-availab ...
  • 对于Hadoop HA - 您需要至少两台可以运行Namenode和Namenode HA的独立机器。 因此理论上你可以拥有至少2台机器的Hadoop HA集群。 但这在实际中并没有太大用处。 要回答您的其他问题:1。您可以在运行Namenode服务的计算机上运行DataNode服务。 这是PoC集群中的一般情况,其中您有小型集群(大致3-7个节点)注意:作为最佳实践的一部分,您应该使用专用计算机作为生产中的Namenode等主服务。 是的,您可以在运行Datanode或Namenode或两者的计算机上运行 ...
  • HDFS高可用性和HDFS联合之间的主要区别在于联合中的名称节点彼此不相关。 在HDFS联合中,所有名称节点共享一个元数据池,其中每个名称节点都有自己的池,因此提供了容错功能,即如果联合中的一个名称节点失败,则不会影响其他名称节点的数据。 所以,Federation =多个名称节点,没有相关性。 在HDFS HA的情况下,有两个名称节点 - 主NN和备用NN。 主NN每次都很努力,而Standby NN只是坐在那里,并且偶尔会对主要Namenode的元数据进行冷却和更新,这使得它们相关。 当主要NN厌倦了这 ...
  • 是的我相信这是一个错误:issues.apache.org/jira/browse/FLINK-6000。 它已经有一个待定的PR。 Yes I believe it is a bug: issues.apache.org/jira/browse/FLINK-6000. It has already a pending PR.