一.hadoop重新格式化namenode
因为之前正常启动过hadoop集群。所以在hadoop的对应data目录中,已经有很多相关文件夹了。我们在格式化之前得先删除相关文件夹才行。
解决方案:
一、对于master主节点进行操作
1、删除data、name、namesecondary三个文件夹。
2、删除mrlocal目录中的四个文件夹
3、删除logs文件夹中的所有文件
二、对Slaves从节点进行操作
删除对应的数据文件夹。
二.eclipse中开发hadoop需要导入的包
新建Map/Reduce工程,无需导入hadoop的jar包。
新建java project需要添加的hadoop相应jar包有:
/hadoop-2.3.0/share/hadoop/common下所有jar包,及里面的lib目录下所有jar包
/hadoop-2.3.0/share/hadoop/hdfs下所有jar包,不包括里面lib下的jar包
/hadoop-2.3.0/share/hadoop/mapreduce下所有jar包,不包括里面lib下的jar包
/hadoop-2.3.0/share/hadoop/yarn下所有jar包,不包括里面lib下的jar包
注:由于要添加的jar包所在的目录不只一个,为了方便,可以自己建立user library,添加相应的jar包。
三.hadoop运行wordcount程序,程序不报错,但是没有输出文件
在eclipse中对DFS Locations对文件进行操作,报错,permission denied。
因为对hdfs没有写权限,所以没有输出文件。
解决方案:
需要在hadoop配置文件中的hdfs-site.xml中添加配置信息:
目的是取消权限校验。
重启hadoop,就可以正常运行程序,得到输出结果文件了。
四.在Hadoop开发的过程中,如果遇到各种异常,首先使用jps命令查看节点的启动是否正常,然后再去看相关的日志文件,但是在查看相关日志之前,可以先查看一下一下几点:
1.防火墙原因:检查各个节点的防火墙是否关闭成功。(重点是检查NameNode)
2.检查IP地址与主机名的映射关系是否绑定成功
3.检查NameNode是否处于安全模式
4.检查NameNode是否已经进行了格式化处理
5.检查配置文件的配置是否成功
五.Hadoop-root-datanode-master.log 中有如下错误:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in
导致datanode启动不了。
1.原因:每次namenode format会重新创建一个namenodeId,而dfs.data.dir参数配置的目录中包含的是上次format创建的id,和dfs.name.dir参数配置的目录中的id不一致。namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所以失败的原因是版本不一致造成的。
2.两种解决办法:
第一种:
进入每个datanode的dfs.data.dir的current目录,修改里面的文件VERSION
进入每个datanode的 dfs.data.dir 的 current目录,修改里面的文件VERSION
#Fri Nov 23 15:00:17 CST 2012
namespaceID=246015542
storageID=DS-2085496284-192.168.1.244-50010-1353654017403
cTime=0
storageType=DATA_NODE
layoutVersion=-32
里面有个 namespaceID 将其修改成为报错信息中的
namenode namespaceID = (报错信息中的ID号)
相同的 namespaceID .
然后重新启动 datanode全部都能正常启动了
第二种:
直接删除数据节点上的文件,直接删除每个datanode上面dfs.data.dir目录下所有的文件
rm -rf *
删除之后,重新启动,也是可以正常的启动所有的datanode。进到dfs.data.dir目录下,所有的datanode又全部重新生成了。这样旧的数据全都不会再能找回了。其实namenode格式化了,这些数据也就无用了。
六.MapReduce问题
1:hadoop /tmp/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1
启动了集群之后发现namenode起来了,但是各个slave节点的datanode却都没起起来。去看namenode日志发现错误日志:
INFO org.apache.hadoop.ipc.Server: IPC Server handler1on9000, call addBlock(/opt/hadoop/tmp/mapred/system/jobtracker.info, DFSClient_502181644) from127.0.0.1:2278: error: java.io.IOException: File /opt/hadoop/tmp/mapred/system/jobtracker.info could only be replicated to0nodes, instead of1
java.io.IOException: File /opt/hadoop/tmp/mapred/system/jobtracker.info could only be replicated to0nodes, instead of1
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1271)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:422)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:508)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:959)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:955)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:953)
具体原因还不是很清楚,当防火墙不关闭的时候可能出现,但是当异常宕掉整个系统再重启的时候也会出现。解决办法是master和slave同时重新格式化
2:ERROR mapred.JvmManager: Caught Throwable in JVMRunner. Aborting TaskTracker.
java.lang.OutOfMemoryError: unable to create new native thread
在运行任务的过程中,计算突然停止,去计算节点查看TaskTracker日志,发现在计算的过程中抛出以上错误,经查证是因为你的作业打开的文件个数超过系统设置一个进程可以打开的文件的个数的上限。更改/etc/security/limits.conf的配置加入如下配置
hadoop soft nproc 10000
hadoop hard nproc 64000