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。
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.