注意,按照个人需要选择要不要配置defaultFS,这是指定默认的ns。如果配置了,那么如果没有指定的话,默认的存放位置就是你配置的那个ns。
fs.defaultFS
viewfs:///
fs.viewfs.mounttable.default.link./nameservice01
hdfs://nameservice01/
fs.viewfs.mounttable.default.link./nameservice02
hdfs://nameservice02/
特别说明下dfs.namenode.shared.edits.dir配置项。
之前在网上看到许多配置文档,都介绍说只需要配置成如下这样:
dfs.namenode.shared.edits.dir
qjournal://10.14.131.47:8485;10.14.135.11:8485;10.14.135.23:8485/nameservice01
不需要对两个ns分别指定,当时略有些怀疑,但没想太多。这样配置了之后,在启动时,只要在ns1上开启ZKFC,namenode进程就会自动被kill,但是ns2上是正常的。无比纳闷。查了日志,报错是说journalnode共享存储中的namespaceID和namenode上的namespaceID不一样,后来查了下namespaceID,才知道,因为在初始化时要把VERSION文件拷贝到journalnode中,我们只指定了一个journalnode中的目录,所以ns1和ns2都会把共享文件写入到这里。所以ns1把VERSION拷贝到journalnode后,ns2再把自己的VERSION拷贝进来,就覆盖了ns1的,所以启动ZKFC后,作为active节点的ns1的节点是无法写入journalnode的(开启zkfc之前两个节点都是standby,所以不会报错)。然后按照dfs.namenode.shared.edits.dir.nameservice01和nameservice02分别配置的方式,就没有问题了。
下面是hdfs-site-xml中的配置项:
dfs.webhdfs.enabled
true
dfs.nameservices
nameservice01,nameservice02
Logical name for this newnameservice
dfs.ha.namenodes.nameservice01
nn1,nn2
Unique identifiers for each NameNode in thenameservice
dfs.ha.namenodes.nameservice02
nn3,nn4
Unique identifiers for each NameNode in thenameservice
dfs.namenode.rpc-address.nameservice01.nn1
10.14.143.83:8022
dfs.namenode.rpc-address.nameservice01.nn2
10.14.131.47:8022
dfs.namenode.rpc-address.nameservice02.nn3
10.14.135.11:8022
dfs.namenode.rpc-address.nameservice02.nn4
10.14.135.23:8022
dfs.namenode.http-address.nameservice01.nn1
10.14.143.83:50070
dfs.namenode.http-address.nameservice01.nn2
10.14.131.47:50070
dfs.namenode.http-address.nameservice02.nn3
10.14.135.11:50070
dfs.namenode.http-address.nameservice02.nn4
10.14.135.23:50070
dfs.namenode.shared.edits.dir.nameservice01
qjournal://10.14.131.47:8485;10.14.135.11:8485;10.14.135.23:8485/nameservice01
dfs.namenode.shared.edits.dir.nameservice02
qjournal://10.14.131.47:8485;10.14.135.11:8485;10.14.135.23:8485/nameservice02
dfs.client.failover.proxy.provider.nameservice01
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.client.failover.proxy.provider.nameservice02
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa
dfs.ha.fencing.ssh.connect-timeout
30000
dfs.journalnode.edits.dir
/search/hadoop01/journalnode/
dfs.ha.automatic-failover.enabled.nameservice01
true
dfs.ha.automatic-failover.enabled.nameservice02
true