HDFS HA中name nodes访问顺序的问题

本文详细介绍了HDFS高可用配置中的关键参数设置方法,并通过具体示例解释了如何配置两个namenodes以确保集群的稳定运行。特别是针对ConfiguredFailoverProxyProvider类的工作原理进行了深入分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置HDFS HA时,需要指明两个name nodes,一个active,一个作为hot standby,当active NN出现问题时,可以及时手动或自动切换到standby NN(此时原来的standby NN转换为新的active NN),使HDFS cluster保持正常工作。


涉及的配置,以146.67这个name node为例。


hdfs-site.xml:


    <property>
      <name>dfs.nameservices</name>
      <value>hadoopcluster</value>
    </property>


    <property>
      <name>dfs.ha.namenodes.hadoopcluster</name>
      <value>nn1,nn2</value>
    </property>


    <property>
      <name>dfs.namenode.rpc-address.hadoopcluster.nn1</name>
      <value>storm14668:8020</value>
    </property>


    <property>
      <name>dfs.namenode.rpc-address.hadoopcluster.nn2</name>
      <value>storm14667:8020</value>
    </property>


    <property>
      <name>dfs.namenode.http-address.hadoopcluster.nn1</name>
      <value>storm14668:50070</value>
    </property>


    <property>
      <name>dfs.namenode.http-address.hadoopcluster.nn2</name>
      <value>storm14667:50070</value>
    </property>


    <property>
      <name>dfs.namenode.https-address.hadoopcluster.nn1</name>
      <value>storm14668:50470</value>
    </property>


    <property>
      <name>dfs.namenode.https-address.hadoopcluster.nn2</name>
      <value>storm14667:50470</value>
    </property>


    <property>
      <name>dfs.client.failover.proxy.provider.hadoopcluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>




其中,最后一个配置项,即dfs.client.failover.proxy.provider.hadoopcluster,决定了这个问题的答案。


HDFS官方文档中对这个配置项的说明:
Configure the name of the Java class which will be used by the DFS Client to determine which NameNode is the current Active, and therefore which NameNode is currently serving client requests. The only implementation which currently ships with Hadoop is the ConfiguredFailoverProxyProvider, so use this unless you are using a custom one.


如上面列出的配置所示,我们就是用了这个Hadoop提供的Java class:ConfiguredFailoverProxyProvider。


这个类的实现:hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/ConfiguredFailoverProxyProvider.java,其中关键的code snippet:


  private final List<AddressRpcProxyPair<T>> proxies =
      new ArrayList<AddressRpcProxyPair<T>>();


  private int currentProxyIndex = 0;


      try {
      ugi = UserGroupInformation.getCurrentUser();


      Map<String, Map<String, InetSocketAddress>> map = DFSUtil.getHaNnRpcAddresses(
          conf);
      Map<String, InetSocketAddress> addressesInNN = map.get(uri.getHost());


      if (addressesInNN == null || addressesInNN.size() == 0) {
        throw new RuntimeException("Could not find any configured addresses " +
            "for URI " + uri);
      }


      Collection<InetSocketAddress> addressesOfNns = addressesInNN.values();
      for (InetSocketAddress address : addressesOfNns) {
        proxies.add(new AddressRpcProxyPair<T>(address));
      }


      // The client may have a delegation token set for the logical
      // URI of the cluster. Clone this token to apply to each of the
      // underlying IPC addresses so that the IPC code can find it.
      HAUtil.cloneDelegationTokenForLogicalUri(ugi, uri, addressesOfNns);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }


  /**
   * Lazily initialize the RPC proxy object.
   */
  @Override
  public synchronized ProxyInfo<T> getProxy() {
    AddressRpcProxyPair<T> current = proxies.get(currentProxyIndex);
    if (current.namenode == null) {
      try {
        current.namenode = NameNodeProxies.createNonHAProxy(conf,
            current.address, xface, ugi, false, fallbackToSimpleAuth).getProxy();
      } catch (IOException e) {
        LOG.error("Failed to create RPC proxy to NameNode", e);
        throw new RuntimeException(e);
      }
    }
    return new ProxyInfo<T>(current.namenode, current.address.toString());
  }


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




根据上面的dfs.ha.namenodes.hadoopcluster这个配置项的值:nn1,nn2,HDFS client在访问name nodes时,首先尝试nn1,如果失败,再尝试nn2。
那么,有没有可能改变这个“写死”的访问name nodes的顺序呢?理论上是有的,就是按照上面配置项的说明:so use this unless you are using a custom one,自己实现一个FailoverProxyProvider。


需要提醒的是,不要被多次出现的“Failover”所迷惑。不仅仅是failover时,这个类才起作用。
DataX是一款阿里开源的数据同步工具,用于在各种数据源之间高效地进行数据传输。当你需要将数据写入HDFS的高可用(HA)模式下时,你需要在DataX的配置文件中设置一些特定的参数来连接到Active NameNode和Standby NameNodes。 以下是DataX使用HDFSWriter连接HDFS HA的配置步骤: 1. **添加依赖**: 在DataX的配置文件`datax.yaml`或`datax.json`中,确保添加了对Hadoop的依赖,包括HDFS客户端(`com.aliyun.odps ODPSHadoopFileSystem`)。示例配置如下: ```yaml job: name: hdfs_to_hdfs task: - type: writer config: project: your_project accessId: your_access_id accessKey: your_access_key endpoint: your_hdfs_endpoint hdfs.writable.name.nodes: "nn1.example.com,nn2.example.com" # 高可用NameNodes地址列表 hdfs.access.mode: "proxyuser" # 使用代理用户,如果不需要则去掉 hdfs.writer.type: "hdfs" file_system_type: "ODPSHadoopFileSystem" ``` 2. **HA地址配置**:`hdfs.writable.name.nodes`属性指定的是可写名称节点的列表,这是HDFS HA中的活跃NameNode和备用NameNode。当一个NameNode不可用时,任务会自动切换到其他可用的节点。 3. **访问模式**:`hdfs.access.mode`可以设置为`proxyuser`,这意味着DataX将以已授权的用户身份通过Hadoop的Kerberos系统进行访问。如果不需要这种权限,可以设置为`default`。 4. **其他配置**:确保`project`、`accessId`、`accessKey`等基本信息是正确的,并且你的HDFS集群已经设置了正确的Kerberos认证和安全策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值