使用hdfs:// URI时的NameNode HA

使用HDFS或HFTP URI方案(例如hdfs://namenode/path/to/file ),我可以访问HDFS群集而不需要其XML配置文件。 当运行诸如hdfs dfs -gethadoop distcp或从Spark读取文件sc.hadoopFile()sc.hadoopFile()时,shell命令非常方便,因为我不必将所有相关HDFS集群的xml文件复制和管理到那些代码可能会运行。

这种方法的一个缺点是我必须使用活动的NameNode的主机名,否则Hadoop会抛出异常,抱怨NN处于待机状态。

一个常用的解决方法是尝试一个,然后尝试另一个,如果任何异常被捕获,或直接连接到ZooKeeper并使用protobuf解析二进制数据。

与(例如)mysql的负载均衡URI或ZooKeeper的连接字符串相比,这两种方法都很麻烦,因为我可以逗号分隔URI中的所有主机,并且驱动程序会自动找到要交谈的节点。

假设我有主动和备用nn1 nn2主机nn1nn2 。 引用HDFS特定路径的最简单方法是什么?

  • 可以用在像hdfshadoop这样的命令行工具中
  • 可以在Hadoop Java API中使用(并且因此工具取决于它,如Spark),并且配置最少
  • 无论哪个namenode当前处于活动状态,都可以工作。

  • 在这个情况下,而不是检查活动的namenode主机和端口组合,我们应该使用nameservice作为, nameservice会自动将客户端请求转移到活动的namenode

    名称服务就像Namenodes中的代理一样,它始终将HDFS请求转移到活动的namenode

    例如: hdfs://nameservice_id/file/path/in/hdfs


    示例步骤来创建nameservice

    hdfs-site.xml文件中

    通过添加一个id来创建一个名称服务(这里nameservice_id是mycluster

    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
      <description>Logical name for this new nameservice</description>
    </property>
    

    现在指定namenode ID以确定群集中的名称节点

    dfs.ha.namenodes。[$ nameservice ID]

    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
      <description>Unique identifiers for each NameNode in the nameservice</description>
    </property>
    

    然后将namenode ids与namenode主机相链接

    dfs.namenode.rpc-address。[$ nameservice ID]。[$ name node ID]

    <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>
    

    有很多属性涉及使用Nameservice正确配置Namenode HA

    通过这个设置,文件的HDFS URL将如下所示

    hdfs://mycluster/file/location/in/hdfs/wo/namenode/host
    

    编辑:

    使用java代码应用属性

    Configuration conf = new Configuration(false);
    conf.set("dfs.nameservices","mycluster");
    conf.set("dfs.ha.namenodes.mycluster","nn1,nn2");
    conf.set("dfs.namenode.rpc-address.mycluster.nn1","machine1.example.com:8020");
    conf.set("dfs.namenode.rpc-address.mycluster.nn2","machine2.example.com:8020");
    
    FileSystem fsObj =  FileSystem.get("relative/path/of/file/or/dir", conf);
    
    // now use fsObj to perform HDFS shell like operations
    fsObj ...
    
    链接地址: http://www.djcxy.com/p/25625.html

    上一篇: NameNode HA when using hdfs:// URI

    下一篇: Memory leak Finalizer error