这里说升级的思路及一些操作
1.能备份的尽量备份的
2.确保版本兼容
3.想好万一升级失败,能否恢复
4.最好先参考官网,然后在找些中文资料
下面搜集一些升级需要注意的地方,更多自己搜索:
1.hadoop升级遇到问题汇总
http://www.aboutyun.com/forum.php?mod=viewthread&tid=23340
2.
1. 运行dfsadmin -upgradeProgress status 检查是否存在备份 如果是第一次升级 就不存在备份(在升级Hadoop前,如果已经存在备份,需要先结束 finalize 它。)
2. 备份dfs.namenode.dir下文件,同时要备份下hdfs的文件目录的元数据信息:
bin/hadoop fsck / -files -blocks -locations > dfs-v-old-fsck-1.log
bin/hadoop dfs -lsr / > dfs-v-old-lsr-1.log
bin/hadoop dfsadmin -report > dfs-v-old-report-1.log
3. 停止所有相关节点 先停止所有的hbase hbase/bin/stop-hbase.sh 然后停掉hadoop hadoop/bin/stop-all.sh
并用jps 查看是否仍有 hadoop hbase 相关进程 如果有可以手动停掉 。
4. 备份 hadoop hbase 程序。用工具查看两个版本的conf文件夹下配置文件格式是否有出入 在所有节点上重新部署hadoop hbase文件 并替换conf文件夹下所有文件 可以参考脚本hadoop 同步程序到 slave节点
5. 使用 bin/start-dfs.sh -upgrade 进行升级(DFS从一个版本升级到另外一个版本的时候,NameNode和DataNode使用的文件格式有可能会改变。 当你第一次使用新版本的时候,你要告诉Hadoop 去改变HDFS版本,否则,新版本不会生效)
6. 监控升级情况和升级问题处理
开始升级,你可以通过
bin/hadoop dfsadmin -upgradeProgress
命令来查看版本升级的情况。
当然你可以使用
bin/hadoop dfsadmin -upgradeProgress details
来查看更多的详细信息。
当升级过程被阻塞的时候,你可以使用
bin/hadoop dfsadmin -upgradeProgress force
来强制升级继续执行(当你使用这个命令的时候,一定要慎重考虑)。
当HDFS升级完毕后,Hadoop依旧保留着旧版本的有关信息,
以便你可以方便的对HDFS进行降级操作。
可以使用bin/start-dfs.sh -rollback来执行降级操作。
7. 对比现有hdfs的文件目录的元数据信息和升级的差异。
8. 升级完成,Hadoop一次只保存一个版本的备份,当新版本运行几天以后还是没有出现什么问题,你就可以使用运行一段时间后 没有问题再执行升级终结操作
bin/hadoop dfsadmin -finalizeUpgrade
命令把旧版本的备份从系统中删掉了。删除以后rollback 命令就失效了
9. 启动 hadoop hadoop/bin/start-all.sh jps 看进程是否已经启动完毕, 在master检测 正常是五个hadoop相关进程
TaskTracker
NameNode
SecondaryNameNode
JobTracker
DataNode
启动 hbase 启动hbase前 查看安全模式是否为OFF状态,
hadoop dfsadmin -safemode get 如果是
Safe mode is ON
需等待一会儿, 如果是
Safe mode is OFF
则可以启动hbase hbase/bin/start-hbase.sh
此时jps 在master节点可以看到七个相关进程。
hadoop的
TaskTracker
NameNode
SecondaryNameNode
JobTracker
DataNode
hbase的
HRegionServer
HMaster
HQuorumPeer
输入 hadoop version
查看版本号 看hadoop是否已经升级成功。
输入 hbase shell
等待
再输入 version
查看hbase 是否更新成功
10. 注意点如果版本升级了 对应的执行程序需要在新版本hadoop和hbase等相关的依赖包下重新打包。否则可能会报找不到类的相关错误。
java.lang.NoClassDefFoundError.....
有时候运行程序的时候报 莫名其妙的 找不到某些jar包的类
例如 cloudear 从cdh3u2升级到cdh3u5的时候
xception in thread "main" java.lang.NoClassDefFoundError: org/apache/zookeeper/KeeperException
at org.apache.hadoop.hbase.mapreduce.TableOutputFormat.setConf(TableOutputFormat.java:195)
at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:62)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:918)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:882)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1278)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:882)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:526)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:556)
at cn.cnnic.ccsms.log.cn.domain.LogAnalyserDomainDriver.main(LogAnalyserDomainDriver.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:197)
Caused by: java.lang.ClassNotFoundException: org.apache.zookeeper.KeeperException
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 17 more
手动添加到路径中去错误就不会报错了,莫名其妙
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$CLASSPATH:$HADOOP_HOME/bin:$HBASE_HOME/lib:$HBASE_HOME/lib/zookeeper-3.3.5-cdh3u5.jar
11. 可以用到的脚本
hadoop 同步程序到 slave节点
#!/bin/sh
cat slaves |while read node
do
echo "node : $node"
echo "================"
# 远程到该节点并
ssh $node "rm -rf /usr/local/hadoop/*;"</dev/null
rsync -vaz /usr/local/hadoop/ $node:/usr/local/hadoop/
echo "================"
done
hbase 同步程序到 regionservers节点
cat regionservers |while read node
do
echo "node : $node"
echo "================"
ssh $node "rm -rf /usr/local/hbase/*;"</dev/null
rsync -vaz /usr/local/hbase/ $node:/usr/local/hbase/
echo "================"
有时候hbase进程无法停止 可执行此脚本来强制杀掉各个节点的进程
cat regionservers |while read node
do
echo "node : $node"
echo "================"
ssh $node "/usr/java/bin/jps|awk '{if(\$2~/HMaster/||\$2~/HQuorumPeer/||\$2~/HRegionServer/) print \$1}'|while read pidss; do kill -9 \$pidss; done;/usr/java/bin/jps"</dev/null
echo "================"
done
12. 关于回滚
如果升级后,可能会遇到新问题,如果想回到原来的版本的话就需要执行回滚了。
为了保险起见,执行 前面的步骤1,2,3 后将原来的程序删除,将程序恢复到原来的版本,并在各个节点上同步。
然后 进入hadoop 安装目录的bin目录下 执行
start-dfs.sh –rollback 即可
输入hadoop version 即可看到已经回到原来的版本
重新启动 hadoop
执行stop-all.sh停止所有节点,
start-all.sh 启动所有节点。
Jps 查看所有节点是否都已经正常启动
hadoop dfsadmin –safemode get
查看是否安全模式是否为off状态。
当为off状态是可以启动hbase
hbase/bin/start-hbase.sh
最后查看进程是否已启动完毕。可参考步骤9 。最后回滚到了原来的版本,别忘了将用户执行程序恢复到原来的版本。
|