Hadoop集群常见的错误

本文列举并解析了MapReduce运行过程中常见的错误,包括时间不同步、内存不足、DFS访问权限问题等,并提供了相应的解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间不同步引起的错误

运行MapReduce时出现这种错误,是由于集群中没有设置时间同步(设置时间同步参照http://download.youkuaiyun.com/download/cdl2008sky/9381519)

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 memory used. Killing container.

原因:
该错误是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文件中使其一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值