mrs*_*vas 11
请检查Namenode HA架构与HDFS客户端请求处理中的关键实体.

这个请求首先出现在哪里?我的意思是客户端如何知道哪个namenode是活动的?
对于客户端/驱动程序,哪个namenode处于活动状态并不重要.因为我们使用nameservice id而不是namenode的主机名查询HDFS.nameservice会自动将客户端请求转移到活动的namenode.
示例:hdfs://nameservice_id/rest/of/the/hdfs/path
说明:
这hdfs://nameservice_id/是如何工作的以及它涉及的内容是什么?
在hdfs-site.xml档案中
通过向其添加id来创建名称服务(这里nameservice_id是mycluster)
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
<description>Logical name for this new nameservice</description>
</property>
Run Code Online (Sandbox Code Playgroud)
现在指定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>
Run Code Online (Sandbox Code Playgroud)
然后将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>
Run Code Online (Sandbox Code Playgroud)
之后,指定HDFS客户端用于联系Active NameNode 的Java类,以便DFS客户端使用此类来确定哪个NameNode当前正在为客户端请求提供服务.
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
Run Code Online (Sandbox Code Playgroud)
最后,在这些配置更改后,HDFS URL将如下所示.
hdfs://mycluster/<file_lication_in_hdfs>
为了回答你的问题,我只采取了一些配置.请查看详细文档,了解Namenodes,Journalnodes和Zookeeper机器如何在HDFS中形成Namenode HA.
如果hadoop集群配置了HA,那么它将在hdfs-site.xml中具有namenode ID,如下所示:
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>namenode1,namenode2</value>
</property>
Run Code Online (Sandbox Code Playgroud)
无论哪个NameNode首先启动都将变为活动状态.您可以选择以特定顺序启动集群,以便首选节点启动.
如果要确定namenode的当前状态,可以使用getServiceStatus()命令:
hdfs haadmin -getServiceState <machine-name>
Run Code Online (Sandbox Code Playgroud)
好吧,在编写驱动程序类时,需要在配置对象中设置以下属性:
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);
}
Run Code Online (Sandbox Code Playgroud)
请求将转到nameservice1,并根据namenode状态(活动/备用)由Hadoop集群进一步处理.
有关更多详细信息,请参阅HDFS高可用性
| 归档时间: |
|
| 查看次数: |
4276 次 |
| 最近记录: |