分享

Hadoop1.x集群升级到Hadoop2.x指导及需要注意的问题

gefieder 2014-1-13 00:56:19 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 29135
本帖最后由 pig2 于 2014-5-21 23:24 编辑
一、Hadoop1.x程序升级到Hadoop2.x需要的依赖库
 根据官方文档(Apache
Hadoop
MapReduce – Migrating from Apache
Hadoop
1.x to Apache
Hadoop
2.x:http://hadoop.apache.org/docs/r2 ... adoop1_Hadoop2.html)所述,Hadoop2.x是对Hadoop1.x程序兼容的,由于Hadoop2.x对Hadoop1.x做了重大的结构调整,很多程序依赖库被拆分了,所以以前(Hadoop1.x)的依赖库不再可用(不是说API不可用,而是api存放的包不一样),如果需要在Hadoop2.X上面编译,请用下面的依赖库:

  1. <dependencies>
  2.         <dependency>
  3.             <groupId>org.apache.hadoop</groupId>
  4.             <artifactId>hadoop-mapreduce-client-core</artifactId>
  5.             <version>2.2.0</version>
  6.         </dependency>
  7.         <dependency>
  8.             <groupId>org.apache.hadoop</groupId>
  9.             <artifactId>hadoop-common</artifactId>
  10.             <version>2.2.0</version>
  11.         </dependency>
  12.         <dependency>
  13.             <groupId>org.apache.hadoop</groupId>
  14.             <artifactId>hadoop-mapreduce-client-common</artifactId>
  15.             <version>2.2.0</version>
  16.         </dependency>
  17.         <dependency>
  18.             <groupId>org.apache.hadoop</groupId>
  19.             <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
  20.             <version>2.2.0</version>
  21.         </dependency>
  22. </dependencies>
复制代码
记得加上
  1. <dependency>
  2.         <groupId>org.apache.hadoop</groupId>
  3.         <artifactId>hadoop-mapreduce-client-common</artifactId>
  4.         <version>2.2.0</version>
  5. </dependency>
  6. <dependency>
  7.         <groupId>org.apache.hadoop</groupId>
  8.         <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
  9.         <version>2.2.0</version>
  10. </dependency>
复制代码
否则运行程序的时候将会出现一下的异常:

  1. Exception in thread "main" java.io.IOException: Cannot initialize Cluster.
  2.     Please check your configuration for mapreduce.framework.name and the
  3.     correspond server addresses.
  4.         at org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:120)
  5.         at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:82)
  6.         at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:75)
  7.         at org.apache.hadoop.mapred.JobClient.init(JobClient.java:465)
  8.         at org.apache.hadoop.mapred.JobClient.<init>(JobClient.java:444)
  9.         at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:826)
  10.         at com.wyp.hadoop.MaxTemperature.main(MaxTemperature.java:41)
  11.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  12.         at sun.reflect.NativeMethodAccessorImpl.invoke
  13.                            (NativeMethodAccessorImpl.java:57)
  14.         at sun.reflect.DelegatingMethodAccessorImpl.invoke
  15.                            (DelegatingMethodAccessorImpl.java:43)
  16.         at java.lang.reflect.Method.invoke(Method.java:606)
  17.         at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
复制代码
如果你不是用Maven管理依赖的类库,你可以分别在${HADOOP_HOME}/share/hadoop/common和${HADOOP_HOME}/share/hadoop/mapreduce目录里面以下几个依赖库,分别是hadoop-mapreduce-client-core-2.2.0.jar、hadoop-common-2.2.0.jar、hadoop-mapreduce-client-common-2.2.0.jar、hadoop-mapreduce-client-jobclient-2.2.0.jar和上面的四个依赖正好对应。


二、从Hadoop1.x集群升级到Hadoop2.x步骤
下面主要介绍如何从Hadoop1.x(hadoop-0.20.2-cdh3u4)版本的集群顺利地升级到Hadoop2.2.0。



  1. 友情提示:请在读下文之间认真的读一下这里的说明
  2.   1、为了预防升级过程中出现的各种问题,最好在集群升级的过程前先备份好集群namenode的元数据(${HADOOP_HOME}/conf/hdfs-site.xml中的dfs.name.dir所配置的文件夹),以免升级失败带来不可挽回的损失!
  3.   2、Hadoop升级不是简单的运行下面的一些命令就达到将Hadoop1.x升级到Hadoop2.x,还需要通过大量的参数配置来达到最优,所以请不要阅读完本博客就马上在开发环境下升级Hadoop集群!你可以现在测试机上试验一下,主要是各个参数的配置。
  4.   3、为了说明的方便,本文在虚拟机上面安装好了Hadoop伪分布式平台,以下所有的升级步骤和真实分布式集群升级步骤一样!
  5.   4、本文并没有介绍想升级到有JournalNodes、active NN和standby NN的Hadoop的集群步骤,其实这些升级步骤和这个差不多,需要了解的人可以来咨询我。
复制代码
 1、先看下Hadoop1.x集群上面已有的数据:

  1. [wyp@master hadoop-0.20.2-cdh3u4]$ bin/hadoop fs -ls /home/wyp/data
  2. Found 25 items
  3. -rw-r--r-- 2 wyp supergroup     21 2013-12-02 17:49 /home/wyp/data/1.txt
  4. -rw-r--r-- 2 wyp supergroup     44 2013-12-02 17:49 /home/wyp/data/10.txt
  5. -rw-r--r-- 2 wyp supergroup     27 2013-12-02 17:49 /home/wyp/data/10.txt~
  6. -rw-r--r-- 2 wyp supergroup    224 2013-12-02 17:48 /home/wyp/data/11.txt
  7. -rw-r--r-- 2 wyp supergroup     37 2013-12-02 17:49 /home/wyp/data/12.txt
  8. -rw-r--r-- 2 wyp supergroup 270432 2013-12-02 17:49 /home/wyp/data/123.txt
  9. -rw-r--r-- 2 wyp supergroup     32 2013-12-02 17:49 /home/wyp/data/2.txt
  10. -rw-r--r-- 2 wyp supergroup     21 2013-12-02 17:49 /home/wyp/data/2.txt~
  11. -rw-r--r-- 2 wyp supergroup    120 2013-12-02 17:49 /home/wyp/data/3.txt
  12. -rw-r--r-- 2 wyp supergroup     30 2013-12-02 17:49 /home/wyp/data/3.txt~
  13. -rw-r--r-- 2 wyp supergroup     29 2013-12-02 17:49 /home/wyp/data/4.txt
  14. -rw-r--r-- 2 wyp supergroup     21 2013-12-02 17:49 /home/wyp/data/4.txt~
  15. -rw-r--r-- 2 wyp supergroup     33 2013-12-02 17:49 /home/wyp/data/5.txt
  16. -rw-r--r-- 2 wyp supergroup     62 2013-12-02 17:49 /home/wyp/data/6.txt
  17. -rw-r--r-- 2 wyp supergroup    173 2013-12-02 17:49 /home/wyp/data/7
  18. -rw-r--r-- 2 wyp supergroup    173 2013-12-02 17:49 /home/wyp/data/7~
  19. -rw-r--r-- 2 wyp supergroup      0 2013-12-02 17:49 /home/wyp/data/8.txt
  20. -rw-r--r-- 2 wyp supergroup      0 2013-12-02 17:49 /home/wyp/data/8.txt~
  21. -rw-r--r-- 2 wyp supergroup     27 2013-12-02 17:48 /home/wyp/data/9.txt
  22. drwxr-xr-x - wyp supergroup      0 2013-12-02 17:49 /home/wyp/data/ml-100k
  23. -rw-r--r-- 2 wyp supergroup4945826 2013-12-02 17:49 /home/wyp/data/ml-100k.zip
  24. drwxr-xr-x - wyp supergroup      0 2013-12-02 17:49 /home/wyp/data/ml-10M100K
  25. -rw-r--r-- 2 wyp supergroup6629634 2013-12-02 17:49 /home/wyp/data/ml-10m.zip
  26. -rw-r--r-- 2 wyp supergroup      9 2013-12-02 17:49 /home/wyp/data/reduce.sh
  27. -rw-r--r-- 2 wyp supergroup      0 2013-12-02 17:49 /home/wyp/data/result
复制代码
  2、关掉hadoop-0.20.2-cdh3u4版本的守护线程,并将关于Hadoop1.x所有的相关的环境变量(HADOOP_HOME、PATH等相关环境变量配置)删掉(如果有),以防对Hadoop2.2.0升级的影响。

  3、将Hadoop2.2.0的${HADOOP_HOMOE}/etc/hadoop/hdfs-site.xml中dfs.namenode.name.dir和dfs.datanode.data.di属性的值分别指向Hadoop1.x的${HADOOP_HOME}/conf/hdfs-site.xml中dfs.name.dir和dfs.data.dir的值。

  4、启动Hadoop2.2.0
相关的守护线程。

  1. [wyp@master hadoop]$ sbin/start-dfs.sh
  2. Starting namenodes on [master]
  3. master: starting namenode, logging to
  4.             /home/wyp/Downloads/hadoop/logs/hadoop-wyp-namenode-master.out
  5. localhost: starting datanode, logging to
  6.             /home/wyp/Downloads/hadoop/logs/hadoop-wyp-datanode-master.out
  7. Starting secondary namenodes [0.0.0.0]
  8. 0.0.0.0: starting secondarynamenode, logging to
  9.    /home/wyp/Downloads/hadoop/logs/hadoop-wyp-secondarynamenode-master.out
  10. [wyp@master hadoop]$ jps
  11. 2792 SecondaryNameNode
  12. 2587 DataNode
  13. 2945 Jps
复制代码
按照正常情况,运行sbin/start-dfs.sh应该会启动SecondaryNameNode、DataNode和NameNode守护进程的,但是上面并没有成功启动NameNode,应该是有错误的,去查看hadoop-wyp-namenode-master.log:

  1. [wyp@master hadoop]$ vim logs/hadoop-wyp-namenode-master.log
  2. 2013-12-02 17:57:40,378 FATALorg.apache.hadoop.hdfs.server.namenode.NameNode:
  3.                                               Exception in namenode join
  4. java.io.IOException:
  5. File system image contains an old layout version -19.
  6. An upgrade to version -47 is required.
  7. Please restart NameNode with -upgrade option.
  8.         at org.apache.hadoop.hdfs.server.namenode.
  9.                              FSImage.recoverTransitionRead(FSImage.java:221)
  10.         at org.apache.hadoop.hdfs.server.namenode.
  11.                              FSNamesystem.loadFSImage(FSNamesystem.java:787)
  12.         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.
  13.                              loadFromDisk(FSNamesystem.java:568)
  14.         at org.apache.hadoop.hdfs.server.namenode.NameNode.
  15.                              loadNamesystem(NameNode.java:443)
  16.         at org.apache.hadoop.hdfs.server.namenode.NameNode.
  17.                              initialize(NameNode.java:491)
  18.         at org.apache.hadoop.hdfs.server.namenode.NameNode.
  19.                              (NameNode.java:684)
  20.         at org.apache.hadoop.hdfs.server.namenode.
  21.                              NameNode.(NameNode.java:669)
  22.         at org.apache.hadoop.hdfs.server.namenode.NameNode.
  23.                              createNameNode(NameNode.java:1254)
  24.         at org.apache.hadoop.hdfs.server.namenode.NameNode.
  25.                              main(NameNode.java:1320)
复制代码
(为了能够在一行里面显示,上面的结果经过换行处理),上面的日志信息显示出File system image contains an old layout version,并提示在启动NameNode应该带上-upgrade选项,再试一下:

  1. [wyp@master hadoop]$ sbin/hadoop-daemon.sh start namenode -upgrade
  2. [wyp@master hadoop]$ jps
  3. 2792 SecondaryNameNode
  4. 3126 Jps
  5. 2587 DataNode
  6. 3046 NameNode
复制代码
注意:线上集群的元文件比较大,升级的时候需要修改一下namenode的内存大小配置文件在${HADOOP_HOMOE}/etc/hadoop/hadoop-env.sh里面
  1. export HADOOP_HEAPSIZE=15000
复制代码

上面的值可以根据实际情况去设置。

好了,已经有NameNode进程了,再启动其他守护线程:

  1. [wyp@master hadoop]$ sbin/start-yarn.sh
  2. [wyp@master hadoop]$ jps
  3. 2792 SecondaryNameNode
  4. 3222 ResourceManager
  5. 3594 Jps
  6. 3335 NodeManager
  7. 2587 DataNode
  8. 3046 NameNode
复制代码
  至此,升级步骤完成,你可以查看升级之后的Hadoop2.x一样可以访问之前Hadoop1.x的数据,并没有什么错误。升级完成后,会在namenode的dfs.namenode.name.dir目录和dfs.datanode.data.dir目录下多出一个previous/ 目录。如果确认升级成功后,可以根据实际情况决定是否需要删掉这个目录,运行以下命令把以前的版本删掉:

  1. bin/hdfs dfsadmin -finalizeUpgrade
复制代码
 注意:-finalizeUpgrade 不是升级必须的,所以根据实际情况去执行。一旦执行该命令,会删掉旧版本数据,以后就不能回滚了。

如果升级失败,我们该如何恢复,下面介绍升级失败后的回滚步骤:


三、Hadoop1.x集群升级到Hadoop2.x失败回滚步骤

 1、如果你将Hadoop1.x升级到Hadoop2.x的过程中失败了,当你想在Hadoop1.x中再次启动那些守护进程,你将会遇到以下的问题:

  1. [wyp@master hadoop-0.20.2-cdh3u4]$ bin/start-all.sh
  2. starting namenode, logging to
  3.    /home/wyp/hadoop-0.20.2-cdh3u4/logs/hadoop-wyp-namenode-master.out
  4. localhost: starting datanode, logging to
  5.    /home/wyp/hadoop-0.20.2-cdh3u4/logs/hadoop-wyp-datanode-master.out
  6. localhost: starting secondarynamenode, logging to
  7.    /home/wyp/hadoop-0.20.2-cdh3u4/logs/hadoop-wyp-secondarynamenode-master.out
  8. starting jobtracker, logging to
  9.    /home/wyp/hadoop-0.20.2-cdh3u4/logs/hadoop-wyp-jobtracker-master.out
  10. localhost: starting tasktracker, logging to
  11.    /home/wyp/hadoop-0.20.2-cdh3u4/logs/hadoop-wyp-tasktracker-master.out
  12. [wyp@master hadoop-0.20.2-cdh3u4]$ jps
  13. 2082 JobTracker
  14. 1974 SecondaryNameNode
  15. 2300 Jps
  16. 2227 TaskTracker
  17. 1796 DataNode
复制代码
当运行start-all.sh脚本时,你会发现NameNode守护进程是不能启动的,以下是启动NameNode出现错误的记录:

  1. 2013-12-02 18:06:18,659 ERROR org.apache.hadoop.hdfs.server.
  2.                  namenode.FSNamesystem: FSNamesystem initialization failed.
  3. org.apache.hadoop.hdfs.server.common.IncorrectVersionException:
  4.            Unexpected version of storage directory /home/hadoop-1.2.1/name.
  5.            Reported: -47. Expecting = -19.
  6. at org.apache.hadoop.hdfs.server.common.Storage.getFields(Storage.java:743)
  7. at org.apache.hadoop.hdfs.server.
  8.                                namenode.FSImage.getFields(FSImage.java:557)
  9. at org.apache.hadoop.hdfs.server.common.
  10.                                Storage$StorageDirectory.read(Storage.java:223)
  11. at org.apache.hadoop.hdfs.server.common.
  12.                                Storage$StorageDirectory.read(Storage.java:212)
  13. at org.apache.hadoop.hdfs.server.namenode.
  14.                                FSImage.recoverTransitionRead(FSImage.java:320)
  15. at org.apache.hadoop.hdfs.server.namenode.
  16.                                FSDirectory.loadFSImage(FSDirectory.java:110)
  17. at org.apache.hadoop.hdfs.server.namenode.
  18.                                FSNamesystem.initialize(FSNamesystem.java:372)
  19. at org.apache.hadoop.hdfs.server.namenode.
  20.                                FSNamesystem.<init>(FSNamesystem.java:335)
  21. at org.apache.hadoop.hdfs.server.namenode.
  22.                                NameNode.initialize(NameNode.java:271)
  23. at org.apache.hadoop.hdfs.server.namenode.
  24.                                NameNode.</init><init>(NameNode.java:467)
  25. at org.apache.hadoop.hdfs.server.namenode.
  26.                                NameNode.createNameNode(NameNode.java:1330)
  27. at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1339)
复制代码
其中的/home/hadoop-1.2.1/name目录是Hadoop存放元数据的目录,也就是Hadoop1.x的${HADOOP_HOME}/conf/hdfs-site.xml中dfs.name.dir属性指向的目录(在Hadoop2.2.0的${HADOOP_HOMOE}/etc/hadoop/hdfs-site.xml中dfs.namenode.name.dir指向的目录)。上面的错误报出元数据版本出现了问题,因为刚刚在升级Hadoop的过程中版本文件被修改了,记录这个版本的文件在${dfs.name.dir}/current/VERSION文件中,里面有个layoutVersion属性就是版本的值。那么如何来回滚呢?需要知道的一点是,在Hadoop升级的过程中,Hadoop会在${dfs.name.dir}目录中生成一个previous.checkpoint文件夹,previous.checkpoint文件夹里面的东西就是升级前${dfs.name.dir}/current目录中的一个备份,既然是个备份,那么它的目录结果应该和${dfs.name.dir}/current目录结构一样,事实上也是如此。那么我们可以用这个备份来回滚到升级之前的状态。步骤如下:
  2、运行bin/hadoop-daemon.sh start namenode -rollback(注意这个是在Hadoop1.x里面运行,而不是Hadoop2.x,同时注意配置好HADOOP_HOME)对namenode进行回滚。

  1. [wyp@master hadoop-0.20.2-cdh3u4]$ bin/hadoop-daemon.sh start         \
  2.                                              namenode -rollback
复制代码
就这条命令就可以从失败中回滚!回滚之后HDFS的状态就是你升级前集群的状态,也可以访问HDFS里面的数据。



 再说一点:如果你在升级过程中启动了Hadoop2.x的datanode守护进程,那么只回滚namenode是不行的,还需要对datanode进行回滚,命令如下:

  1. [wyp@master hadoop-0.20.2-cdh3u4]$ bin/hadoop-daemon.sh start         \
  2.                                              datanode -rollback
复制代码

欢迎加入about云群371358502、39327136,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条