时间不同步引起的错误

运行MapReduce时出现这种错误,是由于集群中没有设置时间同步(设置时间同步参照)

15/04/21 15:30:08 INFO mapreduce.Job: Task Id : attempt_1429584224671_0003_m_000007_1, Status : FAILED
Container launch failed for container_1429584224671_0003_01_000017 : org.apache.hadoop.yarn.exceptions.YarnException: Unauthorized request to start container.
This token is expired. current time is 1429630321325 found 1429602008427
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateException(SerializedExceptionPBImpl.java:168)
at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.deSerialize(SerializedExceptionPBImpl.java:106)
at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$Container.launch(ContainerLauncherImpl.java:155)
at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$EventProcessor.run(ContainerLauncherImpl.java:369)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

内存不够引起的错误

Container [pid=7830,containerID=container_1397098636321_27548_01_000297] is running beyond physical memory limits. 
Current usage: 1.4 GB of 1 GB physical memory used; 2.7 GB of 4.2 GB virtual

原因:
该错误是YARN的虚拟内存计算方式导致,上例中用户程序申请的内存为1Gb,YARN根据此值乘以一个比例(默认为2.1)得出申请的虚拟内存的值,当YARN计算的用户程序所需虚拟内存值大于计算出来的值时,就会报出以上错。默认不设置的情况下,ResourceManager会给每个map、reduce任务分配1G大小的物理内存
解决:
设置mapred-site.xml:
mapreduce.map.memory.mb: 4096
mapreduce.reduce.memory.mb: 8192
Map容器和Reduce容器的内存大小。上面的数字是根据你机器的内存大小来设置的。reduce一般要比map大。

同时设置JVM的最大内存值
mapreduce.map.java.opts: -Xmx3072m
mapreduce.reduce.java.opts: -Xmx6144m
Map和Reduce任务所允许的最大内存。分别比上面两个数字要小。因为还得分配给yarn内存处理。

<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>

<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx4096M</value>
</property>

<property>
<name>mapreduce.reduce.memory.mb</name>
<value>6144</value>
</property>

<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx6144M</value>
</property>

DFS访问权限问题

main" org.apache.hadoop.security.AccessControlException: Permission denied
在 hdfs-site.xml 总添加参数:
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>

线程数量不够问题

org.apache.hadoop.hdfs.DFSClient: DataStreamer Exception
java.lang.OutOfMemoryError: unable to create new native thread

程序里面打开的线程太多,系统一般默认是1024 (用ulimit -a可以看到)。
一般修改一般来说,修改ulimit的数值,只需要修改/etc/security/limits.conf即可,但是这个参数需要修改/etc/security/limits.d/90-nproc.conf
[root@datanode5 hadoop]# more /etc/security/limits.d/90-nproc.conf
# Default limit for number of user’s processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

* soft nproc 65535
* hard nproc 65535

说明:
* 代表针对所有用户
noproc 是代表最大进程数

nameNode格式化问题

ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in
:每次namenode format会重新创建一个namenodeId,而dfs.data.dir参数配置的目录中包含的是上次format创建的id,和dfs.name.dir参数配置的目录中的id不一致。namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空dfs.data.dir参数配置的目录。
再执行format命令
hadoop namenode -format

安全模式导致的错误

org.apache.hadoop.dfs.SafeModeException: Cannot delete …, Name node is in safe mode
当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。
Shell 命令
hadoop dfsadmin -safemode leave
参数value说明如下:
Enter : 进入安全模式
Leave :强制NameNode离开安全模式
Get : 返回安全模式是否开启的信息
Wait:等待,一直到安全模式结束。

NameNode和DataNode的namespaceID不一致

方法有两种:
第一种,参考1.5,删除DataNode的所有资料(及将集群中每个datanode的/hdfs/data/current中的VERSION删掉,然后执行hadoopnamenode-format重启集群。
第二种,改每个DataNode的namespaceID(位于/hdfs/data/current/VERSION文件中使其一致。