为了使Hadoop集群保持健康的状态,集群需要进行日常的维护,主要从基础运维,集群扩容和异常处理三个方面。
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中没有这个】
当集群的存储能力或者计算能力出现瓶颈时,一般采取对集群扩容的方法解决。Hadoop支持集群的动态扩容(即不用重启主节点的进程就可以将节点添加到集群中)。当某些节点需要被移除集群,同样可以动态地卸载节点。
2.1 增加DataNode
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个】**
NameNode存在单点故障,一旦出现问题,就要使用SecondaryNameNode进行恢复。恢复的前提:作为新的NameNode的机器的IP、主机名、Hadoop参数配置、目录结构和被替换的NameNode要完全一致。
SecondaryNameNode${fs.checkpoint.dir}
中所有的内容复制到新的NameNode${fs.checkpoint.dir}
中hadoop namenode -importCheckpoint
(从${fs.checkpoint.dir}
中恢复${dfs.name.dir}
,并启动NameNode)hadoop fsck /
NameNode${fs.checkpoint.dir}
目录下的文件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优化中有提到怎么设置),在均衡器执行的过程中,可以随时中断,不会影响数据的数据的完整性
【异常中的参数和路径根据集群的不同可能会不同】
(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系统的命令不同)