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中调用的命令是

hadoop-daemon.sh start namenode -upgrade

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

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

  <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>

修改为:

   <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的配置会报如下错误:

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的实例

  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是没有这个限制的。

    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)

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类的

getHaNnRpcAddresses/getAddresses/getNameServiceIds/getAddressesForNameserviceId/getNameNodeIds

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

Map<String, Map<String, InetSocketAddress>>

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

  <property>
        <name>dfs.ha.namenodes.bipcluster</name>
        <value>nn1</value>
</property>

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

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类的构造方法中:

      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 => gd6g12s117-hadoop-lab3.idc.vipshop.com/10.19.111.117:8020
        throw new IOException("Invalid configuration: a shared edits dir " +
            "must not be specified if HA is not enabled.");
      }

HAUtil.usesSharedEditsDir方法:

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

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

<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

./hadoop-daemon.sh  start journalnode

3).在active nn上运行

hdfs namenode -initializeSharedEdits

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

./hadoop-daemon.sh start namenode

5).在standby的nn上运行

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

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

./hadoop-daemons.sh start  datanode

7).nn transitionToActive

hdfs haadmin -transitionToActive nn1
hdfs haadmin -getServiceState nn1

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

diff ../../hadoop-2.5.0-cdh5.2.0/sbin/start-dfs.sh  start-dfs.sh   
50c50
< nameStartOpt="$nameStartOpt [email protected]"
---
> nameStartOpt="$nameStartOpts [email protected]"

也可以直接通过

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

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

时间: 2024-10-19 11:47:13

cdh4.6.0到cdh5.2.0 upgrade和rollback问题小结的相关文章

离线安装Cloudera Manager5.2.0和CDH5 2.0

第一次安装出现了各种问题,尤其是对于不是太熟悉linux系统的更是头疼不已呀!特此记录一下,希望能够让小伙伴们少走点弯路. 1.给机器添加路由 (根据自己的机器情况,可以忽略)   route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.0.1 (windows)   route /p add 172.17.2.0 mask 255.255.255.0 192.168.0.1(linux)   2.集群主机配置 2.1 .配置静态 I

centos6.4使用本地yum源安装cloudera manager 5.3.0和cdh5.3.0

1.准备工作 三个节点 192.168.56.110 cdh1 192.168.56.111 cdh2 192.168.56.112 cdh3 关闭所有节点防火墙 service iptables stop chkconfig iptables off vi /etc/selinux/config  SELINUX=disabled cdh1节点安装http服务并启动 yum install httpd service httpd start chkconfig httpd on 配置所有节点h

Impala学习笔记(一)CDH5.4.0安装

鲁春利的工作笔记,好记性不如烂笔头 Impala是Cloudra公司发布的实时查询开源项目,基于Hive但使用内存进行计算,是使用CDH的首选PB级大数据实时查询分析引擎. Impala的安装方式有两种,CM方式和手动安装,手动安装比较麻烦,需要额外的步骤验证与其他组件的交互,这里采用CM的方式安装. 1.安装准备 CM当前最新版本为5.5.1,这里安装CM5.4.0和CDH5.4.0. http://www.cloudera.com/content/www/en-us/downloads.ht

【Spark学习】Spark 1.1.0 with CDH5.2 安装部署

[时间]2014年11月18日 [平台]Centos 6.5 [工具]scp [软件]jdk-7u67-linux-x64.rpm spark-worker-1.1.0+cdh5.2.0+56-1.cdh5.2.0.p0.35.el6.noarch.rpm spark-core-1.1.0+cdh5.2.0+56-1.cdh5.2.0.p0.35.el6.noarch.rpm spark-history-server-1.1.0+cdh5.2.0+56-1.cdh5.2.0.p0.35.el6.

CDH5.2.0升级到CDH5.3.3

公司有一个Spark on Yarn集群,基于CM5.2.0+CDH5.2.0搭建,Spark的版本是1.1.0.为了使用Spark1.2.0的一些特性,决定将集群版本升级到CM5.3.3+CDH5.3.3.之所以升级CM,是因为CM的版本号必须大于等于CDH的版本号.下面分成两个步骤介绍升级过程:CM升级和CDH升级. 1 CM升级过程介绍     1.1 admin用户登陆http://10.10.244.137:7180/cmf/home,关闭集群服务和Cloudera managemen

在CDH5.5.0上安装Kudu6.0

1. 下载安装文件: a. CSD文件:KUDU-0.6.0.jar b. kudu parcel:KUDU-0.6.0-1.kudu0.6.0.p0.334-el6.parcel和manifest.json文件 c. impala-kudu:IMPALA_KUDU-2.3.0-1.cdh5.5.0.p0.15-el6.parcel + manifest.json文件 2.将CSD文件KUDU-0.6.0.jar移到/opt/cloudera/csd下面并重启服务器 3.将KUDU-0.6.0-

Centos-6.5安装CDH-5.9.0教程

Centos-6.5安 本文是为了帮助想以Cloudera搭建自己大数据管理和运行平台的朋友,由于Cloudera有多种安装方式,经过多次的尝试和研究,本文介绍的是其中一种更容易安装成功的方式,供大家参考. Cloudera的介绍可参考官方文档 cloudera介绍 包含cloudera的各个工程项目,这里就不再细说,直接进入正题. 一.准备工作 1.下载CDH相关文件 Cloudera Manager :http://archive.cloudera.com/cm5/cm/5/cloudera

centos7安装CDH5.5.0

1.安装jdk mkdir -p /usr/java tar zxvf jdk-7u80-linux-x64.tar.gz -C /usr/java/ vi /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_80 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib source /etc/profile alte

Centos6.5安装配置Cloudera Manager CDH5.6.0 Hadoop

环境规划操作系统版本:CentOS-6.5-x86_64-minimal.iso 192.168.253.241    master   虚拟机4G内存192.168.253.242    slave1    虚拟机2G内存192.168.253.243    slave2    虚拟机2G内存 一.环境初始化1.修改主机名(每台机器都执行) 192.168.253.241    master 192.168.253.242    slave1 192.168.253.243    slave2