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,如需转载请自行联系原作者

相关文章
|
10月前
|
消息中间件 Kafka
【赵渝强老师】Kafka生产者的执行过程
Kafka生产者(Producer)将消息序列化后发送到指定主题的分区。整个过程由主线程和Sender线程协调完成。主线程创建KafkaProducer对象及ProducerRecord,经过拦截器、序列化器和分区器处理后,消息进入累加器。Sender线程负责从累加器获取消息并发送至KafkaBroker,Broker返回响应或错误信息,生产者根据反馈决定是否重发。视频和图片详细展示了这一流程。
237 61
|
12月前
|
SQL 存储 缓存
Flink SQL Deduplication 去重以及如何获取最新状态操作
Flink SQL Deduplication 是一种高效的数据去重功能,支持多种数据类型和灵活的配置选项。它通过哈希表、时间窗口和状态管理等技术实现去重,适用于流处理和批处理场景。本文介绍了其特性、原理、实际案例及源码分析,帮助读者更好地理解和应用这一功能。
834 14
|
关系型数据库 分布式数据库 数据库
沉浸式学习PostgreSQL|PolarDB 4: 跨境电商场景, 快速判断商标|品牌侵权
很多业务场景中需要判断商标侵权, 避免纠纷. 例如 电商的商品文字描述、图片描述中可能有侵权内容. 特别是跨境电商, 在一些国家侵权查处非常严厉. 注册公司名、产品名时可能侵权. 在写文章时, 文章的文字内容、视频内容、图片内容中的描述可能侵权. 例如postgresql是个商标, 如果你使用posthellogresql、postgresqlabc也可能算侵权. 以跨境电商为力, 为了避免侵权, 在发布内容时需要商品描述中出现的品牌名、产品名等是否与已有的商标库有相似. 对于跨境电商场景, 由于店铺和用户众多, 商品的修改、发布是比较高频的操作, 所以需要实现高性能的字符串相似匹配功能.
402 0
|
SQL Java API
官宣|Apache Flink 1.19 发布公告
Apache Flink PMC(项目管理委员)很高兴地宣布发布 Apache Flink 1.19.0。
3047 2
官宣|Apache Flink 1.19 发布公告
|
SQL 存储 分布式计算
Hive学习---1、Hive入门、Hive 安装(二)
Hive学习---1、Hive入门、Hive 安装(二)
|
存储 分布式计算 大数据
「大数据」Lambda架构
**Lambda架构**是Nathan Marz提出的用于大数据处理的模型,包括**批处理层**(预计算准确性)、**速度处理层**(实时低延迟)和**服务层**(合并结果响应查询)。它强调**容错性**、**低延迟**和**可扩展性**,并结合实时与批量处理。然而,它也面临数据口径不一致、计算窗口限制及开发复杂性等挑战。常用技术栈涉及Apache Hadoop/Spark、Storm/Flink、NoSQL数据库、Elasticsearch及消息队列。虽然有缺点,Lambda架构仍是大数据处理的重要框架。
515 0
|
SQL 存储 Java
官宣|Apache Flink 1.18 发布公告
官宣|Apache Flink 1.18 发布公告
2021 3
官宣|Apache Flink 1.18 发布公告
|
SQL 存储 算法
深入解读 Flink 1.17
阿里云技术专家,Apache Flink PMC Member & Committer、Flink CDC Maintainer 徐榜江(雪尽) 在深入解读 Flink 1.17 的分享。
6931 0
深入解读 Flink 1.17
|
Kubernetes Cloud Native Linux
云原生|kubernetes|CKA备考和一些应试小技巧
云原生|kubernetes|CKA备考和一些应试小技巧
444 0
|
存储 安全 关系型数据库
安装CDH7.1.1
安装CDH7.1.1
533 0