Namenode高可用性客户端请求

时间:2016-03-10 08:29:09

标签: hadoop hdfs hadoop2 webhdfs

任何人都可以告诉我,如果我使用Java应用程序通过Namenode HA设置向HDFS请求一些文件上传/下载操作,那么此请求首先在哪里?我的意思是客户端如何知道哪个namenode处于活动状态?

如果您提供一些工作流程类型图或详细解释请求步骤(从头到尾),那将会很棒。

2 个答案:

答案 0 :(得分:11)

请使用HDFS客户端请求处理中的关键实体检查Namenode HA架构。

HA architecture

  

此请求首先出现在哪里?我的意思是客户如何知道哪个   namenode是否有效?

对于客户端/驱动程序,哪个namenode处于活动状态并不重要。因为我们使用nameservice id而不是namenode的主机名查询HDFS。 nameservice会自动将客户端请求转移到活动名称节点

示例hdfs://nameservice_id/rest/of/the/hdfs/path

<强>解释

hdfs://nameservice_id/如何运作以及它涉及的内容是什么?

hdfs-site.xml档案

通过向其添加ID来创建名称服务(此处nameservice_idmycluster

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

之后指定HDFS客户端用于联系Active NameNode的 Java类,以便DFS客户端使用此类来确定哪个NameNode当前正在为客户端请求提供服务。 / p>

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

最后,在这些配置更改后,HDFS URL将如下所示。

hdfs://mycluster/<file_lication_in_hdfs>

要回答您的问题,我已经少量配置。请查看detailed documentation,了解Namenodes,Journalnodes和Zookeeper机器如何在HDFS中形成Namenode HA。

答案 1 :(得分:9)

如果hadoop集群配置了HA,那么它将在hdfs-site.xml中具有namenode ID,如下所示:

<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>namenode1,namenode2</value>
</property>

首先启动的NameNode将变为活动状态。您可以选择以特定顺序启动集群,以便首选节点首先启动。

如果要确定namenode的当前状态,可以使用 getServiceStatus()命令:

hdfs haadmin -getServiceState <machine-name>

那么,在编写驱动程序类时,需要在配置对象中设置以下属性:

 public static void main(String[] args) throws Exception {
    if (args.length != 2){
        System.out.println("Usage: pgm <hdfs:///path/to/copy> </local/path/to/copy/from>");
        System.exit(1);
    }
    Configuration conf = new Configuration(false);
    conf.set("fs.defaultFS", "hdfs://nameservice1");
    conf.set("fs.default.name", conf.get("fs.defaultFS"));
    conf.set("dfs.nameservices","nameservice1");
    conf.set("dfs.ha.namenodes.nameservice1", "namenode1,namenode2");
    conf.set("dfs.namenode.rpc-address.nameservice1.namenode1","hadoopnamenode01:8020");
    conf.set("dfs.namenode.rpc-address.nameservice1.namenode2", "hadoopnamenode02:8020");
    conf.set("dfs.client.failover.proxy.provider.nameservice1","org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");

    FileSystem fs =  FileSystem.get(URI.create(args[0]), conf);
    Path srcPath = new Path(args[1]);
    Path dstPath = new Path(args[0]);
    //in case the same file exists on remote location, it will be overwritten
    fs.copyFromLocalFile(false, true, srcPath, dstPath);
}

请求将转到nameservice1,并根据namenode状态(活动/备用)进一步由Hadoop集群处理。

有关详细信息,请参阅HDFS High availability