【伊利丹】Hadoop-2.5.0-CDH5.2.0 版本升级和数据均衡 实验记录

来源:互联网 发布:网络教育几月份报名 编辑:程序博客网 时间:2024/04/25 12:18
引言
由于开发的需要 hadoop集群的版本 要从hadoop2.2.0版本升级到 hadoop-2.5.0-cdh5.2.0版本,在升级的过程中要确保数据的完整性,故此写了下面一章关于hadoop升级增加数据节点并使得数据均衡 的博客。


正文
16个节点:FBI001   到    FBI016  集群部署如下图:


第一节:hadoop版本的升级

在安装hadoop-2.5.0-cdh5.2.0版本以前,要执行如下命令来备份信息和停止集群
在HADOOP_HOME下面:
1.运行dfsadmin -upgradeProgress status 检查是否存在备份 如果是第一次升级 就不存在备份(在升级Hadoop前,如果已经存在备份,需要先结束 finalize 它。)
2.备份dfs.namenode.dir下文件,同时要备份下hdfs的文件目录的元数据信息(需要集群必须是启动状态):
cd $HADOOP_HOME 
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.停止所有节点 bin/stop-all.sh

在安装hadoop-2.5.0-cdh5.2.0版本以后 (在hadoop-2.5.0-cdh5.2.0版本中的配置文件和hadoop-2.2.0版本基本相同,特别提醒要在hadoop-2.5.0-cdh5.2.0中要修改yarn-stie.xml文件。来实现RM主备切换)。
准备工作都做好了下面开始启动集群,启动时候最好把启动脚本分开执行 ,这样在启动时候去看启动日志,如果出现问题可以及时的处理。

先启动Zookeeper,ZKFC, 和Journalnode;
FBI001的HADOOP_HOME上面启动namenode的启动命令:sbin/hadoop-daemon.sh start namenode

查看日志会报如下错误
java.io.IOException: 
File system image contains an old layout version -47.
An upgrade to version -59 is required.
Please restart NameNode with the "-rollingUpgrade started" option if a rolling upgrade is already started; or restart NameNode with the "-upgrade" option to start a new upgrade.
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:231)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:994)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:726)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:529)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:585)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:751)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:735)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1410)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1476)
2014-10-25 13:59:26,491 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1

解决方法: 这里错误的意思是NameNode需要升级的。因此执行下面的操作:
FBI001的HADOOP_HOME下面:使用 bin/start-dfs.sh -upgrade 进行升级
命令解释:HDFS从一个版本升级到另外一个版本的时候,NameNode和DataNode使用的文件格式有可能会改变。当你第一次使用新版本的时候,你要告诉Hadoop 去改变HDFS版本,否则,新版本不会生效

FBI009的HADOOP_HOME上面启动namenode的启动命令:sbin/hadoop-daemon.sh start namenode
查看日志会报如下错误
2014-10-25 14:01:43,812 FATAL org.apache.hadoop.hdfs.server.namenode.NameNode: Exception in namenode join
java.io.IOException: It looks like the shared log is already being upgraded but this NN has not been upgraded yet. You should restart this NameNode with the '-bootstrapStandby' option to bring this NN in sync with the other.
    at org.apache.hadoop.hdfs.server.namenode.FSImage.initEditLog(FSImage.java:758)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:618)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.doUpgrade(FSImage.java:372)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:266)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:994)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:726)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:529)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:585)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:751)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:735)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1410)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1476)
2014-10-25 14:01:43,817 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1

解决方法: 这里错误的意思是备NameNode需要同步主NameNode的信息。因此执行下面的操作:
FBI009的HADOOP_HOME下面:使用 bin/hdfs namenode -bootstrapStandby进行同步

接着启动以后的DateNode和NodeManager进程;
当HDFS升级完毕后,Hadoop依旧保留着旧版本的有关信息,
以便你可以方便的对HDFS进行降级操作。
可以使用bin/start-dfs.sh -rollback来执行降级操作

对比现有hdfs的文件目录的元数据信息和升级的差异。
升级完成,Hadoop一次只保存一个版本的备份,当新版本运行几天以后还是没有出现什么问题,你就可以使用运行一段时间后没有问题再执行升级终结操作。
bin/hadoop dfsadmin -finalizeUpgrade
命令把旧版本的备份从系统中删掉了。删除以后rollback 命令就失效了。

到此集群就hadoop升级完毕。


第二节:集群数据平衡

Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如集群中添加新的数据节点。当HDFS出现不平衡状况的时候,将引发很多问题,比如MR程序无法很好地利用本地计算的优势,机器之间无法达到更好的网络带宽使用率,机器磁盘无法利用等等。可见,保证HDFS中的数据平衡是非常重要的。
在Hadoop中,包含一个Balancer程序,通过运行这个程序,可以使得HDFS集群达到一个平衡的状态,使用这个程序的命令如下:
cd $HADOOP_HOME  
sbin/start-balancer.sh -threshold 5
这个命令中-threshold 参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值。如果机器与机器之间磁盘使用率偏差小于5%,那么我们就认为HDFS集群已经达到了平衡的状态。


Hadoop的开发人员在开发Balancer程序的时候,遵循了以下几点原则:
1.    在执行数据重分布的过程中,必须保证数据不能出现丢失,不能改变数据的备份数,不能改变每一个rack中所具备的block数量。
2.    系统管理员可以通过一条命令启动数据重分布程序或者停止数据重分布程序。
3.    Block在移动的过程中,不能暂用过多的资源,如网络带宽。
4.    数据重分布程序在执行的过程中,不能影响name node的正常工作。

集群执行balancer依旧不平衡的原因:
基于这些基本点,目前Hadoop数据重分布程序实现的逻辑流程如下图所示:
 
Rebalance程序作为一个独立的进程与name node进行分开执行。
1步骤是 Rebalance Server从Name Node中获取所有的Data Node情况:每一个Data Node磁盘使用情况。
2步骤是 Rebalance Server计算哪些机器需要将数据移动,哪些机器可以接受移动的数据。并且从Name Node中获取需要移动的数据分布情况。
步骤是Rebalance Server计算出来可以将哪一台机器的block移动到另一台机器中去。
4,5,6步骤是 需要移动block的机器将数据移动的目的机器上去,同时删除自己机器上的block数据。
步骤是 Rebalance Server获取到本次数据移动的执行结果,并继续执行这个过程,一直没有数据可以移动或者HDFS集群以及达到了平衡的标准为止。
Hadoop现有的这种Balancer程序工作的方式在绝大多数情况中都是非常适合的。


使用经验总结:

由于历史原因,hadoop集群中的机器的磁盘空间的大小各不相同,而HDFS在进行写入操作时,并没有考虑到这种情况,所以随着数据量的逐渐增加,磁盘较小的datanode机器上的磁盘空间很快将被写满,从而触发了报警。
此时,不得不手工执行start-balancer.sh来进行balance操作,即使将dfs.balance.bandwidthPerSec  参数设置为10M/s,整个集群达到平衡也需要很长的时间,所以写了个crontab来每天凌晨来执行start-balancer.sh,由于此时集群不平衡的状态还没有那么严重,所以start-balancer.sh很快执行结束了。
另外需要注意的地方是,由于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,所以尽量不要在NameNode上执行start-balancer.sh,而是找一台比较空闲的机器。

1) hadoop balance工具的用法:
To start:  
sbin/start-balancer.sh [-threshold <threshold>]  
Example: bin/ start-balancer.sh  
start the balancer with a default threshold of 10%  
sbin/start-balancer.sh -threshold 5  
start the balancer with a threshold of 5%  
如果增加的节点较多,就需要把 -threshold 参数改为 1 这样数据才能达到数据均衡的效果
To stop:  
sbin/ stop-balancer.sh  

2)影响hadoop balance工具的几个参数:
-threshold 默认设置:10,参数取值范围:0-100,参数含义:判断集群是否平衡的目标参数,每一个 datanode 存储使用率和集群总存储使用率的差值都应该小于这个阀值 ,
理论上,该参数设置的越小,整个集群就越平衡,但是在线上环境中,hadoop集群在进行balance时,还在并发的进行数据的写入和删除,所以有可能无法到达设定的平衡参数值。
dfs.balance.bandwidthPerSec  默认设置:1048576(1 M/S),参数含义:设置balance工具在运行中所能占用的带宽,设置的过大可能会造成mapred运行缓慢

3)实验截图:
1、没有数据均衡命令:

2、执行数据均命令操作:

在均衡数据的时候,你可以在运行balanacer服务的机器上去查看日志,这样就可以得到数据均衡的信息。

这就是以上所有的内容,希望对你有所帮助。谢谢



0 0