HDFS HA功能简介及配置

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

Hadoop 0.23.2版本之前, NameNodeHDFS集群的单点故障点,每一个集群只有一个NameNode,如果这个机器或进程不可用,整个集群就无法使用,直到重启NameNode或者新启动一个NameNode节点。

影响HDFS集群不可用主要包括以下两种情况:

1、第一种情况是如机器宕机这样的意外情况,将导致集群不可用,只有在重启NameNode之后才可使用。

2、第二种情况是计划内的软件或硬件升级(NameNode节点),将导致集群在短时间范围内不可用。

HDFSHA就是为了解决上述问题,通过提供选择运行在同一集群中的一个热备用的/备”两个冗余NameNodes这允许在机器宕机或系统维护的时候,快速的转移到另一个NameNode.

 

 

个典型的HA集群,两个单独的机器配置为NameNodes,在任何时候,一个NameNode处于活动状态,另一个处于待机状态,活动的NameNode负责处理集群中所有客户端的操作,待机时仅仅作为一个slave,保持足够的状态,如果有必要提供一个快速的故障转移.

为了保持备用节点与活动节点状态的同步,目前的实现需要两个节点同时访问一个共享存储设备(例如从NASNFS挂载)到一个目录。将有可能在未来的版本中放宽此限制。

当活动节点对命名空间进行任何修改,它将把修改记录写到共享目录下的一个日志文件,备用节点会监听这个目录,当发现更改时,它会把修改内容同步到自己的命名空间。备用节点在故障转移时,它将保证已经读取了所有共享目录内的更改记录,保证在发生故障前的状态与活动节点保持完全一致。

为了提供快速的故障转移,必须保证备用节点有最新的集群中块的位置信息,为了达到这一点,Datanode节点需要配置两个nameNode的位置,同时发送块的位置信息和心跳信息到两个nameNode

任何时候只有一个namenode处于活动状态,对于HA集群的操作是至关重要的,否则两个节点之间的状态就会产生冲突,数据丢失或其它不正确的结果,为了达到这个目的或者所谓的“裂脑场景”出现,管理员必须为共享存储配置至少一个(fencing)方法。在宕机期间,如果不能确定之间的活动节点已经放弃活动状态,fencing程负责断以前的活动节点编辑存储的共享访问。这可以防止任何进一步的修改命名空间,允许新的活动节点安全地进行故障转移。

:目前,只有手动故障转移支持。这就意味着HA nameNode不能自动检测活动nameNode的失败,而是通过手动启动故障转移。自动故障检测和故障转移将在未来的版本中实现。

 

硬件资源

为了部署一个HA集群环境,您需要准备以下资源:

  • NameNode 机器:运行活动节点和备用节点的机器和非HA环境的机器需要有同相的硬件配置。
  • 共享存储:您需要有一个主备namenode节点都是可读写的共享目录,通常情况,这是一个远程的文件管理器,它支持使用NFS挂载到每个namenode节点。目前只支持一个可编辑目录。因此,系统的是否可用将受限于共享目录是否可用,因此,为了消除所有单点故障,需要对共享目录再加冗余,具体来说,多个网络路径的存储需要实现存储系统自身的冗余。因为这个原因,建议共享存储服务器是一个高品质的专用NAS设备,而不是一个简单的Linux服务器。

注:在HA集群环境里,备用的namenode还要执行检测命名空间的状态,因此,没有必要再运行Secondary NameNode,CheckpointNode,BackupNode。事实上,这样做将会报错,这也允许在从非集群环境到集群环境的重新配置时,重新利用之前的Secondary NameNode的硬件资源。

 

部署

配置简介

类似联邦配置,HA配置向后兼容,允许在不改变当前单节点的情况下配置成集群环境,新的配置方案确保了在集群环境中的所有节点的配置文件都是相同的,没有必要因为节点的不同而配置不同的文件。

和联邦配置一样,HA集群环境重复使用名称服务ID来确定一个单一的HDFS实例,实际上可能包括多个HA namenodes.此外,一个新的namenode增加到HA,集群中的每一个nameNode都有一个不同的ID来标识它,为了支持所有namenode有同一个配置文件,所有的配置参数都以命名服务IDnameNodeID为后缀。

 

详细配置

 

配置HA nameNodes,您需要增加一些配置选项到 hdfs-site.xml 配置文件。

 

这些配置选项的顺序不重要,但dfs.federation.nameservicesdfs.ha.namenodes.[nameservice ID]的值将决定下面配置的Key值。因此,在配置其它选项前,需要确定这两个选项的值。

 

dfs.federation.nameservices一个新的名称服务的逻辑名称。为名称服务选择一个逻辑名称,如“mycluster,使用这个逻辑名称作为这个配置项的值。这个名称可以是随意的,它将用于配置和集群环境中HDFS绝对路径的认证组件。

注:如果您还使用HDFS联邦,这个配置项应该包括其它的名称服务列表,HA或者其它,用逗号进行分隔。

<property>

 <name>dfs.federation.nameservices</name>

  <value>mycluster</value>

</property>

dfs.ha.namenodes.[nameservice ID]在名称服务中每一个nameNode的唯一标识符

配置一个逗号分隔的NameNode的ID的列表DataNode会用它来确定在集群中的所有namenode.如我们前面使用"mycluster"作为我们名称服务的ID,你如果使用nn1nn2作为namenodeID,你应该这样配置:

<property>

 <name>dfs.ha.namenodes.mycluster</name>

  <value>nn1,nn2</value>

</property>

注:当前一个名称服务最多只允许配置两个namenode

dfs.namenode.rpc-address.[nameservice ID].[name node ID]每一个namenode监听的标准RPC地址

对于前面配置的两个namenodeID,设置namenode节点详细的地址和端口,注意,这个配置项将在两个单独的配置项里配置,如:

<property>

 <name>dfs.namenode.rpc-address.mycluster.nn1</name>

 <value>machine1.example.com:8020</value>

</property>

<property>

 <name>dfs.namenode.rpc-address.mycluster.nn2</name>

 <value>machine2.example.com:8020</value>

</property>

注:如果你愿意,你可以配置相同的RPC地址。

dfs.namenode.http-address.[nameservice ID].[namenode ID]每一个namenode监听的标准HTTP地址

RPC地址一样,设置两个namenode监听的http地址,如:

<property>

 <name>dfs.namenode.http-address.mycluster.nn1</name>

 <value>machine1.example.com:50070</value>

</property>

<property>

 <name>dfs.namenode.http-address.mycluster.nn2</name>

 <value>machine2.example.com:50070</value>

</property>

注:如果你启用了hadoop的安全功能,你也可以同样设置成https地址。

dfs.namenode.shared.edits.dir共享存储目录的位置

这是配置备份节点需要随时保持同步活动节点所作更改的远程共享目录,你只能配置一个目录,之个目录挂载到两个namenode上都必须是可读写的,且必须是绝对路径。如:

<property>

 <name>dfs.namenode.shared.edits.dir</name>

 <value>file:///mnt/filer1/dfs/ha-name-dir-shared</value>

</property>

dfs.client.failover.proxy.provider.[nameserviceID]HDFS客户端用来和活动的namenode节目联系的java

配置的java类是用来给HDFS客户端判断哪个namenode节点是活动的,当前是哪个namenode处理客户端的请求,当前hadoop唯一的实现类是ConfiguredFailoverProxyProvider,除非你自己定义了一个类,否则都将使用这个类。如:

<property>

 <name>dfs.client.failover.proxy.provider.mycluster</name>

 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

dfs.ha.fencing.methods将用于停止活动NameNode节点的故障转移期间的脚本或Java类的列表

任何时候只有一个namenode处于活动状态,对于HA集群的操作是至关重要的,因此,在故障转移期间,在启动备份节点前,我们首先要确保活动节点处于等待状态,或者进程被中止,为了达到这个目的,您至少要配置一个强行中止的方法,或者回车分隔的列表,这是为了一个一个的尝试中止,直到其中一个返回成功,表明活动节点已停止。hadoop提供了两个方法:shellsshfence,要实现您自己的方法,请看org.apache.hadoop.ha.NodeFencer类。

相关问答

更多
  • HBase没有更新 。 当您在HBase中执行删除操作(整行或特定单元格)时,会将特殊删除标记添加到单元格中。 即将到来的扫描或获取操作不会看到该单元格。 当您执行插入操作时,只需使用当前时间戳创建一个新单元格。 扫描并获取操作将返回更新版本的单元格。 真正的物理删除是在HBase 主要压缩过程中执行的。 另外,减少了HFile的压缩次数以提供更快的读取操作。 There are no updates in HBase. When you perform a delete in HBase (the who ...
  • Cloudera Manager不支持将多个NameNode添加到同一物理主机,因此无法进行列出的配置。 这是为了避免NameNode主机过载而设计的。 如果要为3个单独的命名空间启用高可用性,则需要将群集扩展为6个节点。 Cloudera Manager doesn't support adding multiple NameNodes to the same physical host, so the configuration you listed won't be possible. This is ...
  • Avro是一款旨在以avro格式存储数据的序列化框架,它不具备向HDFS写入任何内容的智能。 您需要使用HDFS api将avros上传/写入HDFS,在python中使用类似的内容,其中srcPath是本地avro,dstPath位于HDFS上 public void uploadToHdfs(String srcPath, String dstPath) throws IOException { FileSystem fs = getFileSystem(); fs.co ...
  • 通过试验和错误,我最终设法做到这一点: 停止群集上的所有HDFS进程 更新core-file.xml中的“fs.defaultFS”以及hdfs-site.xml中提及旧的“dfs.nameservices”值的所有属性。 启动所有的日志节点 在名称节点上运行“hdfs namenode -initializeSharedEdits” 在名称节点上运行“hdfs zkfc -formatZK” 再次启动所有HDFS进程 By trial and error I ended up managing to do ...
  • 1)在HBASE之上将Spark分层而不是仅使用HBASE带来了哪些附加功能? 它只取决于程序员的能力,还是有任何性能原因可以做到这一点? Spark有什么东西可以做,HBASE完全不能做? 在Splice Machine,我们使用Spark在HBase之上进行分析。 HBase没有执行引擎,spark在HBase(中级结果,关系代数等)之上提供了一个称职的执行引擎。 HBase是一个MVCC存储结构,Spark是一个执行引擎。 它们是彼此的天然补充。 2)从上一个问题出发,何时应该在HDFS和SPARK之 ...
  • HDFS高可用性和HDFS联合之间的主要区别在于联合中的名称节点彼此不相关。 在HDFS联合中,所有名称节点共享一个元数据池,其中每个名称节点都有自己的池,因此提供了容错功能,即如果联合中的一个名称节点失败,则不会影响其他名称节点的数据。 所以,Federation =多个名称节点,没有相关性。 在HDFS HA的情况下,有两个名称节点 - 主NN和备用NN。 主NN每次都很努力,而Standby NN只是坐在那里,并且偶尔会对主要Namenode的元数据进行冷却和更新,这使得它们相关。 当主要NN厌倦了这 ...
  • 发布答案可能对某人有用。 此解决方案有效: balancer-not-working-in-hdfs-ha.html 请记住删除单个NN的rpc,不要触摸HA设置。 Posting the answer maybe it will be useful for someone. This solution works: balancer-not-working-in-hdfs-ha.html Just, please remember to delete rpc for single NN and don't ...
  • 可以使用前缀file:///从Spark引用本地文件系统 Eg: sparkContext.textFile("file:///<>") 此命令从本地文件系统读取文件。 注意:如果在多节点群集中执行,则此文件应在所有节点上可用。 Local filesystem can be referred from Spark with the prefix file:/// Eg: sparkContext.textFile("file:///<
  • FileSystem.get(Configuration)创建一个DistrubutedFileSystem对象,该对象依赖于DFSClient与NameNode通信。 深入埋藏在源代码中(1.0.2是我正在浏览的版本),是为NameNode创建RPC的调用,后者又为ClientProtocol接口创建代理。 创建此代理时,( org.apache.hadoop.ipc.RPC.getProxy(Class, long, InetSocketAddr ...
  • 您可以使用以下格式进行编码: sc.textFile(hdfs://NamenodeIPAddress:Port/DirectoryLocation) example: sc.textFile(hdfs://127.0.0.1:8020/user/movies) 请根据您的位置更改您的名称节点IP地址和路径的IP地址。 希望这可以帮助!!!... You can code in the below format: sc.textFile(hdfs://NamenodeIPAddress:Port/Dir ...