HDFS 2.0 federation配置全过程

HDFS2.0 federation配置全过程

转载请注明出处,谢谢!
我是在已经搭建好的Hadoop 2.0和HA的基础上,增加federation的功能。所以相关的步骤只涉及到federation的部分。要看HA的配置步骤,请查看前一篇文章。
网上提供的好几个所谓的federation配置攻略,在实际操作中发现,都有多多少少的错误,有些错误在federation的配置时系统提示还相当的明确,所以都不可取啊。还是要自己一步一步跟着官方文档,脚踏实地地来。
主要的过程很简单,分三步:
1. 修改配置文件
2. 启动集群
3. 验证


1. 修改配置文件

*说明: 我在相应的每个配置项上面都有简单的注释,对作用做了简单的说明。
(1) core-site.xml
首先要注释掉之前在HA配置时使用的fs.defaultFS项,因为此时的ns不只一个,所以要重新配置。
 
在core-site.xml中,主要是配置指定两个ns在HDFS中的存放目录,和查看视图。这里,我们把第一个ns挂载在了nameservice01目录下,第二个ns挂载在了nameservice02目录下。

注意,按照个人需要选择要不要配置defaultFS,这是指定默认的ns。如果配置了,那么如果没有指定的话,默认的存放位置就是你配置的那个ns。

   
  
  
       fs.defaultFS
       viewfs:///
  
  
  
       fs.viewfs.mounttable.default.link./nameservice01
       hdfs://nameservice01/
  
  
  
       fs.viewfs.mounttable.default.link./nameservice02
       hdfs://nameservice02/
  
  
  
(2) hdfs-site.xml
首先要把关于HA的所有配置全部都删除掉,然后重新做如下配置。其实原理很简单,原来的HA相关的配置相当于是一个ns,所以当有2个ns时,把所有的配置项全部做两遍配置就好,当然细节方面还是要注意一下的。
同样,每个配置项前面会有相应的注释简单说明。

特别说明下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
   


  

(3)slaves
记得把新加的namenode节点(原datanode节点)从slaves文件中拿掉,免得又启动了上面的datanode服务。

2. 启动集群
同步配置文件到所有的节点上,然后按照如下步骤启动。

准备阶段
(1) 启动zookeeper集群: 在每个zookeeper的机器上执行:
./bin/zkServer.sh start
#据说集群会自动把第一个启动的机器作为leader。who knows ~~
  (2) 在两个NS上分别创建命名空间:
  #在ns1上任选节点,执行如下命令;然后在ns2上任选节点,执行命令
./bin/hdfs zkfc -formatZK
#check: 要验证名字空间是否创建成功,进入zookeeper,查看是否在目录hadoop-ha下存在两个以名字空间命名的目录。
  (3) 在各个节点用如下命令启日志程序
./sbin/hadoop-daemon.sh start journalnode
启动NS
下面先启动NS1: 
  (1)在主namenode节点用./bin/hadoopnamenode -format格式化namenode和journalnode目录
./bin/hadoop namenode -format -clusterId testcluster
#namenode节点在初始化时,也将自己的edits文件共享到了journalnode上。
#注意: 这里一定要注意,网上给的配置步骤中说这里要用不同的clusterId,但是事实是,一定要给两个ns指定一样的clusterId,比如我这里叫testcluster。如果指定不同的clusterId,在启动时会报错说clusterId不一致的。也可以在启动ns2的时候,把ns1的clusterId指定给ns2,方法很多,反正就要让两个NS保持一致的clusterId就好。
(2) 在主namenode节点启动namenode进程
./sbin/hadoop-daemon.sh start namenode
  (3) 在备节点启动备namenode进程
./bin/hdfs namenode –bootstrapStandby
#这个命令是把备namenode节点的目录格式化,并且把主namenode的元数据和journalnode上的edits文件同步过来,从而使元数据和主namenode保持一致,并且这个命令不会把journalnode目录再格式化。
ERROR 不过我在执行bootstrapStandby时失败了,具体失败的体现是下一步启动备namenode失败,报错信息是缺少$dfs.tmp.dir/data/下的name目录。因为name目录下保存的都是namenode的基本元数据,所以说明这一步的格式化没有成功。
SOLUTION: 手工把主namenode上的元数据($dfs.namenode.name.dir下的所有数据)拷贝到备namenode下的同目录下,然后再执行bootstrapStandby.
./sbin/hadoop-daemon.sh start namenode
#启动备namenode。
(3) 在两个namenode节点都启动ZKFC:
./sbin/hadoop-daemon.sh start zkfc
#启动DFSZKFailoverController,也就是用于监控namenode并且保持HA状态的那个watchdog。
然后用和NS1启动一模一样的方式启动NS2。
启动集群
(1)启动所有的datanode,在某一个namenode节点上执行如下命令:
sbin/hadoop-daemons.sh start datanode
ERROR: 启动Datanode可能失败,失败报错信息为
2014-03-13 11:26:30,788 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool BP-1257313099-10.10.208.38-1394679083528 (storage id DS-743638901-127.0.0.1-50010-1394616048958) service to Linux-hadoop-38/10.10.208.38:9000
java.io.IOException: Incompatible clusterIDs in /usr/local/hadoop/tmp/dfs/data: namenode clusterID = CID-8e201022-6faa-440a-b61c-290e4ccfb006; datanode clusterID = clustername
错误提示很明显,Datanode节点初始化失败,和hadoop.tmp.dir目录有关系。一般是因为,我们的Hadoop集群不是首次启动,所以版本信息产生冲突。
SOLUTION: 对比master节点上dfs.namenode.name.dir目录下,current文件夹中的VERSION文件的内容,和slave节点上hadoop.tmp.dir目录下,data/current/目录下的VERSION文件的内容,会发现他们的内容不一致,很有可能是这个VERSION是Datanode在没有配置HA之前的集群中使用的VERSION,所以Datanode无法正常启动。删除slave上的VERSION文件,再启动就成功了。
(2) 通过web界面查看所有namenode的状态,如果都处在standby状态的话,就把其中一个namenode切换成Active状态。按道理说,这时候肯定已经有一个active和一个standby,因为在启动ZKFC时,会默认把第一个启动的namenode设置为Active。
hdfs haadmin -failover --forcefence --forceactive  
#这个命令的作用我不是很清楚,到底哪个serviceId会被切换成Active。或者用下面的命令:
bin/hdfs haadmin -transitionToActive nn1
此时进行检查,HDFS集群应该已经全部正常启动了。下次再启动时,直接执行./sbin/start-dfs.sh就好。关闭直接执行./sbin/stop-dfs.sh就好。

3. 验证
到此为止,集群启动完成。所以通过web访问4个namenode界面,查看下工作是否正常。
还可以对hdfs集群做写入,读取等操作,感受下两个NS的工作方式等等。

你可能感兴趣的:(Hadoop学习分享)