为了使Hadoop集群保持健康的状态,集群需要进行日常的维护,主要从基础运维,集群扩容和异常处理三个方面。
1、基础运维
1.1 启动 / 停止Hadoop
在Hadoop_HOME/bin下执行./start-all.sh或者./stop-all.sh命令。(官方不推荐使用这两个命令)
1.2 启动 / 停止 HDFS
在Hadoop_HOME/bin下执行./start-dfs.sh或者./stop-dfs.sh命令。
1.3 启动 / 停止 MapReduce
在Hadoop_HOME/bin下执行./start-mapred.sh或者./stop-mapred.sh命令。
1.4 启动单个Hadoop进程
在Hadoop_HOME/bin下执行
1.4.1 启动NameNode进程:
./hadoop-deamon.sh start namenode
1.4.2 启动DataNode进程:
./hadoop-deamon.sh start datanode
1.4.3 启动SecondaryNameNode进程:
./hadoop-deamon.sh start secondarynamenode
1.4.4 启动JobTracker: ./hadoop-deamon.sh start jobtracker
1.4.5 启动TaskTracker: ./hadoop-deamon.sh start tasktracker }
!!!【在Hadoop2.0中没有这2个】
1.5 启动从节点进程:
在从节点的HADOOP_HOME/bin下执行命令:
1.5.1 启动从节点的DataNode:
./hadoop-deamon.sh datanode
1.5.1 启动从节点的TaskTracker: ./hadoop-deamon.sh tasktracker }
!!!【在Hadoop2.0中没有这个】
2、集群节点动态扩容和卸载
当集群的存储能力或者计算能力出现瓶颈时,一般采取对集群扩容的方法解决。Hadoop支持集群的动态扩容(即不用重启主节点的进程就可以将节点添加到集群中)。当某些节点需要被移除集群,同样可以动态地卸载节点。
2.1 增加DataNode
如果没有配置dfs.hosts(保存允许连接NameNode的host列表的文件的路径),意味着所以的节点都可以连接NameNode,只需要修改节点上的$HADOOP_HOME/etc/hadoop//slaves(这个路径因为hadoop的版本不同有所不同),在文件末尾追加新主机的名字即可。然后在被添加的从节点上执行1.5.1的命令。
如果配置了dfs.hosts,那么在启动DataNode前,需要把新添加的从节点的IP地址添加到dfs.hosts参数指定的文件的末尾。然后在执行命令:
hadoop dfsadmin -refreshNodes
【TIPS:在节点被添加到集群后,在需要执行一次start-balabcer.sh脚本,使得集群处于动态平衡状态。最后将各个节点的配置文件统一即可。】
2.2卸载DataNode
如果直接使用命令stop datanode来停止DataNode的话,虽然可以达到卸载的目的,但是无法使卸载节点保存的数据移动到集群的其他节点。这样集群的副本数不能维持配置的水平,甚至出现数据丢失的情况。
Hadoop提供一种安全的卸载DataNode的方法,可以保证数据的完整性。依靠dfs.hosts和dfs.hosts.exclude(该文件是保存禁止连接NameNode的host列表的文件的路径),首相将被卸载的节点的IP地址添加到dfs.hosts.exclude参数指定的文件的末尾,再执行命令hadoop dfsadmin -refreshNodes,卸载工作开始,产生大量的数据传输,消耗较大的时间,卸载完成后就可以停止DataNode进程,整个卸载过程可以在Web UI中查看。最后在dfs.hosts和dfs.hosts.exclude参数所表示的文件中修改。再次执行hadoop dfsadmin -refreshNodes
2.3增加TaskTracker
在刚添加的DataNode中启动TaskTracker进程即可。
2.4卸载TaskTracker
Hadoop没有安全移除TaskTracker的方法,直接运行停止命令即可,当被卸载的TaskTracker有正在执行的任务,那么只能依靠MapReduce计算框架自身的容错性保证任务的执行。
!!!【在Hadoop2.0中没有这2个】**
3、利用SecondaryNameNode恢复NameNode
NameNode存在单点故障,一旦出现问题,就要使用SecondaryNameNode进行恢复。恢复的前提:作为新的NameNode的机器的IP、主机名、Hadoop参数配置、目录结构和被替换的NameNode要完全一致。
确保新的NameNode${dfs.name.dir},目录存在,并移除其中内容
把SecondaryNameNode${fs.checkpoint.dir}中所有的内容复制到新的NameNode${fs.checkpoint.dir}中
在新NameNode中执行命令:hadoop namenode -importCheckpoint(从${fs.checkpoint.dir}中恢复${dfs.name.dir},并启动NameNode)
检查文件块的完整性,执行命令:hadoop fsck /
停止NameNode
删除新NameNode${fs.checkpoint.dir}目录下的文件
正式启动NameNode恢复工作
4、常见运维技巧
4.1 查看日志
日志是Hadoop运维的重要依据,无论遇到什么异常,首先查看日志。通过查看日志文件的方式查看日志,也可以通过tail -f命令实时查看更新的日志。
4.2清理临时文件
集群操作频繁或日志输出不太合理,日志文件和临时文件会非常巨大,影响HDFS的存储,视情况定期清理。
HDFS临时文件的路径:/export/hadoop/tmp/mapred/staging
本地临时文件路径:${mapred.local.dir}/mapred/userlogs
4.3定期执行数据均衡脚本
导致HDFS数据不均衡的原因很多,(如新增加DataNode,快速删除HDFS上的文件,计算任务分布不均),数据不均衡会降低MapReduce计算本地化的可能,降低作业执行的效率,Hadoop自带均衡器脚本路径$HADOOP_HOME/bin/start-balancer.sh
在执行这个脚本后,网络的带宽会被大量的消耗,此时如果有任务在执行,那么任务会变的超级慢,可以通过dfs.balance.bandwidthPerSec来设置传输速率(在Hadoop优化中有提到怎么设置),在均衡器执行的过程中,可以随时中断,不会影响数据的数据的完整性
5、常见异常处理
【异常中的参数和路径根据集群的不同可能会不同】
(1)ERROR
org.apache.hadoop.hdfs.server.datanode.DataNode:java.io.IOException:Incompatible
namespaceIDs in /home/hadoop/dfs/data:namenode
namespaceID=39895076;datanode namespaceID=1030326122
原因:NameNode被重新格式化,DataNode数据版本与NameNode不一致 解决:
(1)删除DataNode所有文件
(2)修改DataNode的 dfs/data/current/VERSION 文件与NameNode相同
(2)ERROR
org.apache.hadoop.hdfs.server.datanode.DataNode: org.apache.hadoop.utilDiskChecker$DiskError
原因:磁盘损坏
解决:更换磁盘
(3)Hive查询时的FileNotFound Exception
原因:文件缺失不存在,或者因为权限问题数据没有正确写入Hive的读取路径 解决:设置dfs.permissions=false
或者设置Hive读取路径正确的可写权限
(4)INFO org.apache.hadoop.hdfs.server.datanode.DataNode:writeBlock
blk_-8336485569098955809_2093928 received exception
java.io.IOException: Permission denied
原因:之前用错误的账号启动了Hadoop,导致HDFS存储所使用的本地目录变更,导致目录不可写入,DataNode无法启动
解决:切换至高权限用户,变更正确权限,重启DataNode
(5)FAILED: RuntimeException org.apache.hadoop.ipc.RemoteException
(org.apache.hadoop.hdfs.server.namenode.SafeModeException):Cannot
create
directory/tmp/hive-hadoop/hive_2014-202-12_17-08-53_924_3815707560010618162.
Name node is in safe mode
原因:NameNode处于安全模式
解决:当Hadoop启动时NameNode会处于安全模式,此时DataNode回向NameNode上传数据块列表,让NameNode得到块的位置信息,对每一个文件的副本进行统计,当最小副本满足一定比例,系统退出安全模式,当不满足时,对数据块进行复制。安全模式下系统处于只读状态,NameNode不会处理任何块的复制和删除命令,所以作业都不能正常启动,使用hadoop
dfsadmin -safemode leave 命令退出安全模式。
(6)java.lang。OutOfMemoryError:java heap space
原因:内存溢出
解决:通过增大内存和减小内存消耗2个方面的优化
(7)error:org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException:
No lease on /tmp/hive-hadoop
/hive_2014-03-07_03-00-16_430_6468012546084389462/
_tmp.-ext-10001/tmp.000053_1 File does not exist. Holder DFSClient_attempt_201403051238_0516_r_000053_1 dose not have any open
files 原因:dfs.datanode.max.xcievers参数达到上限
解决:增大hdfs-site.xml中dfs.datanode.max.xcievers参数
(8)Error:JAVA_HOME is not set
原因:JAVA_HOME环境变量缺失
解决:在$HADOOP_HOME/conf/hadoop-env.sh文件中配置
(9)ERROR org.apache.hadoop.hdfs.server.datanode.Datanode:
java.io.IOException : Call to …failed on local exception L
java.net.NoRouteToHostException:No route to host
原因:有可能是防火墙导致DataNode连接不上NameNode,导致DataNode无法启动
解决:关闭防火墙(每个Linux系统的命令不同)
原文链接:https://blog.csdn.net/Wee_Mita/article/details/52517446
随时时间推移,各个datanode上的块分布来越来越不均衡,这将降低MR的本地性,导致部分datanode相对更加繁忙。
均衡器是一个hadoop守护进程,它将块从忙碌的DN移动相对空闲的DN,同时坚持块复本放置策略,将复本分散到不同的机器、机架。
建议定期执行均衡器,如每天或者每周。
(1)通过以下命令运行均衡器
[jediael@master log]$ start-balancer.sh
starting balancer, logging to /var/log/hadoop/hadoop-jediael-balancer-master.out
(2)均衡器将每个DN的使用率与整个集群的使用率接近,这个“接近”是通过-threashold参数指定的,默认是10%。
(3)不同节点之间复制数据的带宽是受限的,默认是1MB/s,可以通过hdfs-site.xml文件中的dfs.balance.bandwithPerSec属性指定(单位是字节)。
每个datanode均会运行一个块扫描器,定期检测本节点上的所有块,若发现存在错误(如检验和错误),则通知namenode,然后由namenode发起数据重新创建复本或者修复。
扫描周期由dfs.datanode.scan.period.hours指定,默认为三周(504小时)。