cdh4.6.0到cdh5.2.0 upgrade和rollback问题小结

简介:

upgrade小结:
1.dfsadmin -upgradeProgress status 在cdh5.2.0中没有,在4.6.0有(见源码org.apache.hadoop.hdfs.tools.DFSAdmin)
升级的时候不能通过这个看到升级状态
rollingUpgrade这个参数在4.6.0中不存在,在5.2.0中有,可以用于滚动升级
2.在cdh5.2.0中执行upgrade,nn中调用的命令是

1
hadoop-daemon.sh start namenode -upgrade

最终调用org.apache.hadoop.hdfs.server.namenode.NameNode类,并传入upgrade参数

3.yarn的设置有些变动,下面两个参数会影响nm是否启动正常

1
2
3
4
5
6
7
8
   <property>
     <name>yarn.nodemanager.aux-services< /name >
     <value>mapreduce.shuffle< /value >
   < /property >
   <property>
     <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class< /name >
     <value>org.apache.hadoop.mapred.ShuffleHandler< /value >
   < /property >

修改为:

1
2
3
4
5
6
7
8
    <property>
     <name>yarn.nodemanager.aux-services< /name >
     <value>mapreduce_shuffle< /value >
   < /property >
   <property>
     <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class< /name >
     <value>org.apache.hadoop.mapred.ShuffleHandler< /value >
   < /property >

4.impala1.1.1和cdh5.2.0有兼容性问题
cdh5.x开始使用PB做通信,需要升级impala到2.0.0(impala的可用性/稳定性/性能需要测试)


rollback小结:
1.rollback要在4.6.0版本上运行
在4.6.0上运行rollback,finalize,upgrade时,都会判断时否为ha模式,如果没有关闭ha的配置会报如下错误:

1
2
3
4
14 /11/19  15:25:47 FATAL namenode.NameNode: Exception  in  namenode  join
org.apache.hadoop.HadoopIllegalArgumentException: Invalid startup option. Cannot perform DFS upgrade with HA enabled.
         at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1130)
         at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1241)

namenode类main方法中通过createNameNode方法创建一个NameNode的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
   public  static  void  main(String argv[])  throws  Exception {
     if  (DFSUtil.parseHelpArgument(argv, NameNode.USAGE, System.out,  true )) {
       System.exit( 0 );
     }
     try  {
       StringUtils.startupShutdownMessage(NameNode. class , argv, LOG);
       NameNode namenode = createNameNode(argv,  null );
       if  (namenode !=  null )
         namenode.join();
     catch  (Throwable e) {
       LOG.fatal( "Exception in namenode join" , e);
       terminate( 1 , e);
     }
   }

而在createNameNode方法中会通过下面的代码检测是否为ha的配置,而在5.2.0是没有这个限制的。

1
2
3
4
5
6
7
     if  (HAUtil.isHAEnabled(conf, DFSUtil.getNamenodeNameServiceId(conf)) &&
         (startOpt == StartupOption.UPGRADE ||
          startOpt == StartupOption.ROLLBACK ||
          startOpt == StartupOption.FINALIZE)) {
       throw  new  HadoopIllegalArgumentException( "Invalid startup option. "  +
           "Cannot perform DFS upgrade with HA enabled." );
     }

这里会涉及到两个判断方法:
1)

1
2
3
4
5
6
7
8
org.apache.hadoop.hdfs.HAUti类的isHAEnabled方法:
   public  static  boolean  isHAEnabled(Configuration conf, String nsId) {
     Map<String, Map<String, InetSocketAddress>> addresses =
       DFSUtil.getHaNnRpcAddresses(conf);
     if  (addresses ==  null return  false ;
     Map<String, InetSocketAddress> nnMap = addresses.get(nsId);
     return  nnMap !=  null  && nnMap.size() >  1 ;  
   }

这里会依次调用org.apache.hadoop.hdfs.DFSUtil类的

1
getHaNnRpcAddresses/getAddresses/getNameServiceIds/getAddressesForNameserviceId/getNameNodeIds

方法,解析dfs.nameservices/dfs.ha.namenodes.xxxx/dfs.namenode.rpc-address.xxxx的设置来获取每个nameserviceid到对应的nn rpc地址的对应关系(

1
Map<String, Map<String, InetSocketAddress>>

并判断map value的size(如果dfs.ha.namenodes.x设置超过1个就算ha),这里只要把配置改成下面即可

1
2
3
4
   <property>
         <name>dfs.ha.namenodes.bipcluster< /name >
         <value>nn1< /value >
< /property >

2)如果设置了jn会报如下错误:

1
2
3
4
5
6
7
8
9
10
11
14 /11/19  16:47:32 FATAL namenode.NameNode: Exception  in  namenode  join
java.io.IOException: Invalid configuration: a shared edits  dir  must not be specified  if  HA is not enabled.
         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:576)
         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:513)
         at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:403)
         at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:445)
         at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:621)
         at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:606)
         at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1177)
         at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1241)
14 /11/19  16:47:32 INFO util.ExitUtil: Exiting with status 1

错误在FSNamesystem类的构造方法中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
       final  boolean  persistBlocks = conf.getBoolean(DFS_PERSIST_BLOCKS_KEY,
                                                     DFS_PERSIST_BLOCKS_DEFAULT);   //默认是false
       // block allocation has to be persisted in HA using a shared edits directory
       // so that the standby has up-to-date namespace information
       String nameserviceId = DFSUtil.getNamenodeNameServiceId(conf);
       this .haEnabled = HAUtil.isHAEnabled(conf, nameserviceId); 
       this .persistBlocks = persistBlocks || (haEnabled && HAUtil.usesSharedEditsDir(conf));
      
       // Sanity check the HA-related config.
       if  (nameserviceId !=  null ) {
         LOG.info( "Determined nameservice ID: "  + nameserviceId);   //Determined nameservice ID: bipcluster
       }
       LOG.info( "HA Enabled: "  + haEnabled);  //HA Enabled: false
       if  (!haEnabled && HAUtil.usesSharedEditsDir(conf)) {  //异常由这里抛出
         LOG.warn( "Configured NNs:\n"  + DFSUtil.nnAddressesAsString(conf));    //Configured NNs: Nameservice <bipcluster>: NN ID nn1 => xxxx:8020
         throw  new  IOException( "Invalid configuration: a shared edits dir "  +
             "must not be specified if HA is not enabled." );
       }

HAUtil.usesSharedEditsDir方法:      

1
2
3
   public  static  boolean  usesSharedEditsDir(Configuration conf) {
     return  null  != conf.get(DFS_NAMENODE_SHARED_EDITS_DIR_KEY);
   }

判断jn的edit dir设置,如果设置了dfs.namenode.shared.edits.dir就会抛出异常
去掉下面的设置即可:

1
2
3
4
< property >
         < name >dfs.namenode.shared.edits.dir</ name >
         < value >qjournal://xxxxx/bipcluster</ value >
</ property >

2.rollback的时候要先把ha的配置更改为非ha的配置,然后进行rollback
rollback之后,再重做ha
重做ha的步骤简单如下:
1).关闭整个集群(非ha的),更改配置为ha的配置,备份原来的standby nn和jn的数据目录
2).删除旧的jn数据,并单独启动jn

1
. /hadoop-daemon .sh  start journalnode

3).在active nn上运行

1
hdfs namenode -initializeSharedEdits

namenode通过initializeSharedEdits命令来初始化journalnode,把edits文件共享到journalnode上
4).运行active nn

1
. /hadoop-daemon .sh start namenode

5).在standby的nn上运行

1
2
hadoop-daemon.sh start  namenode -bootstrapStandby
hadoop-daemon.sh start  namenode

同步元数据并启动standby namenode
6).启动所有的dn

1
. /hadoop-daemons .sh start  datanode

7).nn transitionToActive

1
2
hdfs haadmin -transitionToActive nn1
hdfs haadmin -getServiceState nn1


3.start-dfs.sh 这个脚本有bug,在传入-rollback时,只能dn可以rollback,nn不能rollback

1
2
3
4
5
diff  ../.. /hadoop-2 .5.0-cdh5.2.0 /sbin/start-dfs .sh  start-dfs.sh   
50c50
< nameStartOpt= "$nameStartOpt $@"
---
> nameStartOpt= "$nameStartOpts $@"

也可以直接通过

1
sh -x . /hadoop-daemon .sh  start namenode -rollback

命令rollback nn,注意dn还是要rollback的
4.如果rollback或upgrade失败,可以通过之前的备份元数据进行覆盖恢复


本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1579873,如需转载请自行联系原作者

相关文章
|
数据可视化 BI 数据库
Superset执行「superset db upgrade」命令的报错记录
Superset执行「superset db upgrade」命令的报错记录
844 0
Superset执行「superset db upgrade」命令的报错记录
安装MySQ报错 warning: /var/cache/yum/x86_64/7/mysql80-community/packages/mysql-community-client-8.0.
安装MySQ报错 warning: /var/cache/yum/x86_64/7/mysql80-community/packages/mysql-community-client-8.0.
626 0
安装MySQ报错 warning: /var/cache/yum/x86_64/7/mysql80-community/packages/mysql-community-client-8.0.
|
6月前
|
关系型数据库 MySQL
MySQL安装--Starting the sever安装失败
MySQL安装--Starting the sever安装失败
|
9月前
|
关系型数据库 数据库 Ruby
记录一次 bin/rails db:migrate 报错
记录一次 bin/rails db:migrate 报错
59 0
|
缓存 Linux 开发工具
【Linux server】yum 安装git报错Errors during downloading metadata for repository......
前言 今天发现服务器没有装git,用yum安装git的时候因为网络的原因总是失败,想到了切换一下yum的源,切了之后呢发现报错:Errors during downloading metadata for repository 'AppStream'
793 0
解决helm部署报错Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress
在使用helm install 或者helm upgrade的时候,如果出现了异常中断操作, 经常会出现UPGRADE FAILED并且导致后续无法更新,那我们该如何处理呢?
4030 0
|
关系型数据库 MySQL Linux
yum install mysql-community-server 出现类似报错:Requires: libtirpc.so.3()(64bit)
原因:Linux 版本与下载的 Mysql 的yum 库版本不兼容,例如 Centos7 安装 el8 版本的 Mysql;
yum install mysql-community-server 出现类似报错:Requires: libtirpc.so.3()(64bit)
|
消息中间件 监控 网络协议
CDH:cloudera-scm-server dead but pid file exists
报错 CM HDFS管理界面的报错(由于CM down这个信息是无法通过管理界面查看的,这里是从日志中获得的): The health test result for HDFS_CANARY_HEALTH has become bad: Canary test failed to create parent directory for /opt/tmp/.
4299 0
|
弹性计算 Ubuntu Apache
How to Install Puppet Master and Client on Ubuntu 16.04
This guide will help you through the steps of installing and configuring open source Puppet on ECS Ubuntu 16.
2368 0
How to Install Puppet Master and Client on Ubuntu 16.04
|
关系型数据库 MySQL
file /usr/share/mysql/charsets/README from install of MySQL-server-5.1.73-1.glibc23.i386 conflicts with file from package mysql-libs-5.1.73-8.el6_8.i6
1:也许之前的机器安装过Mysql,但是自己不知道,账号密码也忘记了,又执行安装操作,导致Mysql不兼容问题。Linux上安装MySQL时出现不兼容的解决办法,错误如下所示: 1 [root@master package]# rpm -ivh MySQL-server-5.
2368 0