Hadoop实践(四)---Hadoop集群运维

为了使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

  1. 如果没有配置dfs.hosts(保存允许连接NameNode的host列表的文件的路径),意味着所以的节点都可以连接NameNode,只需要修改节点上的$HADOOP_HOME/etc/hadoop//slaves(这个路径因为hadoop的版本不同有所不同),在文件末尾追加新主机的名字即可。然后在被添加的从节点上执行1.5.1的命令。
  2. 如果配置了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要完全一致。

  1. 确保新的NameNode${dfs.name.dir},目录存在,并移除其中内容
  2. SecondaryNameNode${fs.checkpoint.dir}中所有的内容复制到新的NameNode${fs.checkpoint.dir}
  3. 在新NameNode中执行命令:hadoop namenode -importCheckpoint(从${fs.checkpoint.dir}中恢复${dfs.name.dir},并启动NameNode)
  4. 检查文件块的完整性,执行命令:hadoop fsck /
  5. 停止NameNode
  6. 删除新NameNode${fs.checkpoint.dir}目录下的文件
  7. 正式启动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系统的命令不同)

你可能感兴趣的:(Hadoop,Hadoop实践)