有谁能告诉我,如果我使用java应用程序请求一些文件上传/下载操作到带有namenode ha设置的hdfs,那么这个请求首先去哪里?我的意思是客户端如何知道哪个namenode是活动的?如果您能提供一些工作流类型图或一些详细解释请求步骤(从开始到结束)的东西,那就太好了。
jdgnovmf1#
请检查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 )
hdfs://nameservice_id/rest/of/the/hdfs/path
hdfs://nameservice_id/
hdfs-site.xml
nameservice_id
mycluster
<property> <name>dfs.nameservices</name> <value>mycluster</value> <description>Logical name for this new nameservice</description> </property>
现在指定namenode id来确定集群中的namenodes dfs.ha.namenodes.[$nameservice 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] ```dfs.namenode.rpc-address.mycluster.nn1machine1.example.com:8020dfs.namenode.rpc-address.mycluster.nn2machine2.example.com:8020
dfs.namenode.rpc-address.[$nameservice ID].[$name node ID]
之后,指定hdfs客户机用于联系活动namenode的java类,以便dfs客户机使用该类确定哪个namenode当前正在为客户机请求提供服务。
1l5u6lss2#
如果hadoop cluster配置了ha,那么它将在hdfs-site.xml中具有如下名称节点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,由hadoop集群根据namenode状态(active/standby)进一步处理。有关更多详细信息,请参阅hdfs high availability
2条答案
按热度按时间jdgnovmf1#
请检查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
)现在指定namenode id来确定集群中的namenodes
dfs.ha.namenodes.[$nameservice ID]
:然后将namenode id与namenode主机链接
dfs.namenode.rpc-address.[$nameservice ID].[$name node ID]
```dfs.namenode.rpc-address.mycluster.nn1
machine1.example.com:8020
dfs.namenode.rpc-address.mycluster.nn2
machine2.example.com:8020
1l5u6lss2#
如果hadoop cluster配置了ha,那么它将在hdfs-site.xml中具有如下名称节点ID:
首先启动的namenode将变为活动的。您可以选择按特定顺序启动集群,以便首选节点首先启动。
如果要确定namenode的当前状态,可以使用getservicestatus()命令:
在编写驱动程序类时,需要在配置对象中设置以下属性:
请求将转到nameservice1,由hadoop集群根据namenode状态(active/standby)进一步处理。
有关更多详细信息,请参阅hdfs high availability