Namenode 高可用性客户端请求
Namenode high availability client request
任何人都可以告诉我如果我正在使用 java 应用程序请求一些文件 upload/download 操作到具有 Namenode HA 设置的 HDFS,这个请求首先去哪里?我的意思是客户端如何知道哪个名称节点处于活动状态?
如果您提供一些工作流类型图或详细解释请求步骤(从头到尾)的内容,那就太好了。
如果 hadoop 集群配置了 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>
那么,在写驱动的时候class,需要在配置对象中设置如下属性:
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 集群根据名称节点状态进一步处理 (active/standby)。
请检查 Namenode HA 架构和 HDFS 客户端请求处理中的关键实体。
Where this request go first? I mean how would client know that which
namenode is active?
对于client/driver,哪个名称节点处于活动状态并不重要。因为我们在 HDFS 上查询时使用名称服务 ID 而不是名称节点的主机名。 nameservice 将自动将客户端请求传输到活动的 namenode。
示例:hdfs://nameservice_id/rest/of/the/hdfs/path
解释:
这个 hdfs://nameservice_id/
是如何工作的,其中涉及哪些 confs?
在hdfs-site.xml
文件中
通过向其添加 id 创建名称服务(此处 nameservice_id
为 mycluster
)
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
<description>Logical name for this new nameservice</description>
</property>
现在指定名称节点 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>
然后 link namenode ids with namenode hosts
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 class 以便 DFS 客户端使用此 class 确定哪个NameNode当前正在服务客户端请求。
<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。
任何人都可以告诉我如果我正在使用 java 应用程序请求一些文件 upload/download 操作到具有 Namenode HA 设置的 HDFS,这个请求首先去哪里?我的意思是客户端如何知道哪个名称节点处于活动状态?
如果您提供一些工作流类型图或详细解释请求步骤(从头到尾)的内容,那就太好了。
如果 hadoop 集群配置了 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>
那么,在写驱动的时候class,需要在配置对象中设置如下属性:
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 集群根据名称节点状态进一步处理 (active/standby)。
请检查 Namenode HA 架构和 HDFS 客户端请求处理中的关键实体。
Where this request go first? I mean how would client know that which namenode is active?
对于client/driver,哪个名称节点处于活动状态并不重要。因为我们在 HDFS 上查询时使用名称服务 ID 而不是名称节点的主机名。 nameservice 将自动将客户端请求传输到活动的 namenode。
示例:hdfs://nameservice_id/rest/of/the/hdfs/path
解释:
这个 hdfs://nameservice_id/
是如何工作的,其中涉及哪些 confs?
在hdfs-site.xml
文件中
通过向其添加 id 创建名称服务(此处 nameservice_id
为 mycluster
)
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
<description>Logical name for this new nameservice</description>
</property>
现在指定名称节点 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>
然后 link namenode ids with namenode hosts
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 class 以便 DFS 客户端使用此 class 确定哪个NameNode当前正在服务客户端请求。
<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。