美文网首页
无法创建线程导致的nodemanager频繁挂掉

无法创建线程导致的nodemanager频繁挂掉

作者: invincine | 来源:发表于2018-08-21 16:22 被阅读0次

hadoop集群在执行一个MapReduce任务时,其中一个节点的nodemanager频繁挂掉,以下是日志中纪录的报错内容:

2018-08-21 14:31:05,210 FATAL org.apache.hadoop.yarn.event.AsyncDispatcher: Error in dispatcher thread
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)
    at org.apache.hadoop.util.Shell.runCommand(Shell.java:521)
    at org.apache.hadoop.util.Shell.run(Shell.java:455)
    at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:715)
    at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.containerIsAlive(DefaultContainerExecutor.java:430)
    at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.signalContainer(DefaultContainerExecutor.java:401)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.cleanupContainer(ContainerLaunch.java:419)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainersLauncher.handle(ContainersLauncher.java:139)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainersLauncher.handle(ContainersLauncher.java:55)
    at org.apache.hadoop.yarn.event.AsyncDispatcher.dispatch(AsyncDispatcher.java:173)
    at org.apache.hadoop.yarn.event.AsyncDispatcher$1.run(AsyncDispatcher.java:106)
    at java.lang.Thread.run(Thread.java:745)
2018-08-21 14:31:05,214 INFO org.apache.hadoop.yarn.event.AsyncDispatcher: Exiting, bbye.

报错内容显而易见,是因为jvm没有多余的内存来创建新的线程导致的
由于该节点是新扩容的服务器,最开始想到的是系统限制用户创建线程数
ulimit -u命令查看,果然是默认的1024
修改数值:ulimit -u 102400
启动nodemanager
但过了一会儿,nodemanager又挂掉了,一样的报错:无法分配线程

最后找到一篇文章,解决了这个问题:
文章地址:https://blog.csdn.net/hw446/article/details/47908571
由于MapReduce分配了过多的内存,导致没有多余的内存供jvm分配线程
解决方法是修改mapred-site.xml配置文件相关参数
修改之前:

mapred-site.xml
    <property>
        <name>mapreduce.map.memory.mb</name>
        <value>4096</value>
    </property>

    <property>
        <name>mapreduce.map.java.opts</name>
        <value>-Xmn1200m -Xms3600m  -Xmx3600m -XX:MaxPermSize=100m -XX:PermSize=100m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC -Dfile.encoding=UTF-8</value>
    </property>

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

    <property>
        <name>mapreduce.reduce.java.opts</name>
        <value>-Xmn2000m -Xms7200m  -Xmx7200m -XX:MaxPermSize=200m -XX:PermSize=200m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC -Dfile.encoding=UTF-8</value>
    </property>

修改之后:

    <property>
        <name>mapreduce.map.java.opts</name>
        <value>-Xmn1200m -Xms1600m  -Xmx1600m -XX:MaxPermSize=100m -XX:PermSize=100m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC -Dfile.encoding=UTF-8</value>
    </property>

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

    <property>
        <name>mapreduce.reduce.java.opts</name>
        <value>-Xmn2000m -Xms3072m  -Xmx3072m -XX:MaxPermSize=200m -XX:PermSize=200m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC -Dfile.encoding=UTF-8</value>
    </property>

最后重启nodemanager

相关文章

  • 无法创建线程导致的nodemanager频繁挂掉

    hadoop集群在执行一个MapReduce任务时,其中一个节点的nodemanager频繁挂掉,以下是日志中纪录...

  • 线程池基本使用

    1. 线程池使用 使用new Thread()创建线程存在的问题: 频繁创建线程,执行完后又被回收,导致频繁GC ...

  • 线程池

    使用线程池的好处?重用已经创建的好的线程,避免频繁创建进而导致的频繁GC控制线程并发数,合理使用系统资源,提高应用...

  • Android ThreadPool、AsyncTask、Fut

    使用多线程用new Thread():1.多任务情况下,避免线程频繁的创建销毁;2.多个线程频繁的创建会占用大量的...

  • 线程池设计原理

    线程池就是存储线程的一个池子,为了避免频繁地创建、删除线程而设,因为线程是操作系统中稀缺的资源,频繁创建和删除会带...

  • 加了一个synchronized锁,程序就崩了

    一 故事背景 一个非常频繁调用方法加了synchronized 导致程序崩溃 二 模拟事故的发生 创建线程池模拟多...

  • java线程池(简单实现)

    什么是线程池: 为了避免系统频繁的创建和销毁线程,我们可以让创建的线程进行复用。在线程池中,总有那么几个活跃线程,...

  • Android线程池实现原理

    线程池的好处 频繁的创建和销毁线程,会带来性能的问题。线程的创建和销毁都需要时间,当有大量的线程创建和销毁时,那么...

  • Java语言进阶篇:Android线程池实现原理

    线程池的好处 频繁的创建和销毁线程,会带来性能的问题。线程的创建和销毁都需要时间,当有大量的线程创建和销毁时,那么...

  • 源码修炼笔记之线程池ThreadPoolExecutor详解

    多线程编程过程中,用new Thread()的方式需要频繁的创建和销毁线程,线程的创建存在系统调用clone(),...

网友评论

      本文标题:无法创建线程导致的nodemanager频繁挂掉

      本文链接:https://www.haomeiwen.com/subject/aqkjiftx.html