您的位置:首页 > 运维架构

Hadoop集群常见的错误

2018-01-10 18:17 295 查看

时间不同步引起的错误

运行MapReduce时出现这种错误,是由于集群中没有设置时间同步(设置时间同步参照http://download.csdn.net/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文件中使其一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: