http://cloud.riaos.com/?p=8001390

http://shirley-ren.iteye.com/blog/1174622

出现问题以后先查看日志,以下是常见的错误情况

1 地址占用


org.apache.hadoop.hdfs.server.namenode.NameNode: Address already in use


查找被占用的端口号对应的PID   : netstat -tunl
pkill
 -9   PID实在不行就killall -9  java

2 safemode

bin/hadoop fs -put ./input input
put: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /user/root/input. Name node is in safe mode.
hadoop dfsadmin -safemode leave

解决方法:


NameNode在启动的时候首先进入安全模式,如果datanode丢失的block达到一定的比例(1-dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态。

dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。

下面这行摘录自NameNode启动时的日志(block上报比例1达到了阀值0.9990)

The ratio of reported blocks 1.0000 has reached the threshold 0.9990. Safe mode will be turned off automatically in 18 seconds.

有两个方法离开这种安全模式

(1)修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。


(2)hadoop dfsadmin -safemode leave命令强制离开

用户可以通过dfsadmin -safemode value  来操作安全模式,参数value的说明如下:

enter – 进入安全模式

leave – 强制NameNode离开安全模式

get -  返回安全模式是否开启的信息
wait – 等待,一直到安全模式结束。

3 could only be replicated to 0 nodes, instead of 1

hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop
.ipc.RemoteException: java.io.IOException: ... could only be replicated to 0 nodes, instead of 1 ...


可能出现的现象:用jps查看进程都正常。但是用web查看的话,live
nodes为0. 这说明datanode没有正常启动,但是datanode进程又启动了。
解决方法:

(1)防火墙原因

(2)磁盘空间原因

df –ah  #查看磁盘空间

如果是磁盘空间不够,则调整磁盘空间(像我就是磁盘空间不够)


如果上述办法不行,用以下办法( 只不过会丢失掉已有数据,请慎重使用 )


  • 先运行stop-all.sh
  • 格式化namdenode,不过在这之前要先删除原目录,即core-site.xml下配置的<name>hadoop.tmp.dir</name>所指向的目录,删除后切记要重新建立配置的空目录,然后运行hadoop namenode -format。为了方便删除,我写了一个sh脚本来统一执行(这里连log日志文件一并删除了):

Hadoop出现问题以后先查看日志,以下是常见的错误情况

1 地址占用

org.apache.hadoop.hdfs.server.namenode.NameNode: Address already in use 

查找被占用的端口号对应的PID  : netstat -tunl

pkill  -9  PID实在不行就killall -9  java

2 safemode

bin/hadoop fs -put ./input input

put: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /user/root/input. Name node is in safe mode.

hadoop dfsadmin -safemode leave

解决方法:

NameNode在启动的时候首先进入安全模式,如果datanode丢失的block达到一定的比例(1-dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态。

dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。

下面这行摘录自NameNode启动时的日志(block上报比例1达到了阀值0.9990)

The ratio of reported blocks 1.0000 has reached the threshold 0.9990. Safe mode will be turned off automatically in 18 seconds.

有两个方法离开这种安全模式

(1)修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。

(2)hadoop dfsadmin -safemode leave命令强制离开

用户可以通过dfsadmin -safemode value  来操作安全模式,参数value的说明如下:

enter - 进入安全模式
leave - 强制NameNode离开安全模式
get -  返回安全模式是否开启的信息
wait - 等待,一直到安全模式结束。




需要注意的几点

1,在第4步的配置文件中,一定使用主机域名而不是ip地址;

2,建议各台服务器的JDK和Hadoop的安装路径一直,这样就可以避免由于路径的问题,在不同服务器上频繁修改配置文件;

3,replication的值建议修改为小于或等于datanode数量;

4,建议hadoop.tmp.dir的路径不要设置在/tmp下,这是因为linux系统重启后会将tmp目录删除,此时运行hadoop会报 java.io.IOException: File jobtracker.info could only be replicated to 0 nodes, instead of 1的异常,需要重新format;

5,每次重新格式化后一定要删除hadoop tmp目录下的所有文件;

 

常见问题总结

1,启动时报错 java.net.UnknownHostException
结果:不能正常启动
原因:通过localhost.localdomain根本无法映射到一个IP地址
解决办法:查看/etc/hosts,将主机名添加到hosts文件

 

2,启动时报错 java.io.IOException: File jobtracker.info could only be replicated to 0 nodes, instead of 1

此时,首先检查防火墙是否关闭,是否对各节点的通信产生了影响,

第二,可以检查namenode和datanode中namespaceID的值是否相同,在不同的情况下会造成该问题,修改为相同的值后,重启该节点;

第三,将SAFEMODE设置为OFF状态;



Java代码  



1. hadoop dfsadmin -safemode leave


此外,还需检查/etc/hosts文件中主机名的映射是否正确,不要使用127.0.1.1或localhost。

 

将SAFEMODE设置为OFF状态可以有两种方法

执行上面的语句可以将safemode强制置为off状态,或者在hdfs_site.xml配置文件中增加下面代码,将safemode的设为较小的值,此种方法避免了在执行hadoop过程中经常性遇到错误Name node is in safe mode而导致的需强制将safemode置为off。

 



Java代码  


1. <property>  
2.         <name>dfs.safemode.threshold.pct</name>  
3. 0.95f</value>  
4. </property>


 

3,ip和域名解析的问题

也会造成File jobtracker.info could only be replicated to 0 nodes, instead of 1的问题
此时要检查/etc/hosts文件中主机名的映射是否正确,不要使用127.0.1.1或localhost。

 

4,报错:Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out.

执行任务时,任务卡死在reduce上,不执行
原因:任务最后会在最后将所有的reduce task复制到一台机器上,做最后总的reduce,此时需要ip和主机域名的配置正确
解决方法:将各节点的ip和主机域名配置正确,不能使用127.0.1.1或localhost,使用内网ip可加快处理速度

 

5,Hive执行时报错 java.lang.OutOfMemoryError: GC overhead limit exceeded

原因:这个是JDK6新添的错误类型。是发生在GC占用大量时间为释放很小空间的时候发生的,是一种保护机制。
解决办法:,关闭该功能,可以添加JVM的启动参数来限制使用内存:在mapred-site.xml 里新增项:mapred.child.java.opts 内容:-XX:-UseGCOverheadLimit

 

 

如何杀掉当前正在执行的hadoop任务

1,使用hadoop帐号登录namenode

2,cd hadoop/hadoop-0.20.203.0

3,执行下面命令

 



Java代码  



1. bin/hadoop job -list


    会列出当前所有的正在执行hadoop任务

 

JobId   State   StartTime       UserName        Priority        SchedulingInfo
job_201112201934_0512   1       1325729383495   hadoop  NORMAL  NA

4,找到需要被删除的任务id,执行下面命令



Java代码  


1. bin/hadoop job -kill job_201112201934_0512  
2.