Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 1065|回复: 0

Hadoop打包成jar包在集群上运行时出现的各种问题以及解决方案

[复制链接]
  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 803 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726482
    发表于 2021-4-13 13:49:38 | 显示全部楼层 |阅读模式

    之前将eclipse下编好的mapreduce代码放到集群上面跑,发现速度很慢,namenode节点的cpu和内存使用率很低,datanode节点基本上处于没有运行的状态,然后通过查看hadoop-etc-hadoop下面的配置文件,发现mapreduce-site.xml文件下面的mapreduce.framework.name名字中framework少了一个字母e,导致集群一直运行在伪分布模式下面,同时也导致web控制网页没有datanode的信息,打开master:8088网站显示no available datanode in the table,曾经这个问题困扰了我很久很久,因为如果网站打不开的话就没有办法查看运行的日志,没有办法通过日志来查看运行出错信息。在hadoop2.1以后就通过mapreduce-site.xml配置文件里面的mapreduce.jobhistory.webapp.address下面的value值master:19888网站来查看各个节点的运行状态了,开启jobhistory的命令是mr-jobhistory-sh start historyserver。

    运行jar包的时候提示空指针异常 java.lang.NullPointerException分析说明

    这个问题也困扰了我相当长的时间,直到后来通过日志log发现原来是程序没有读我的文件(文件格式是xml格式),后来把文件复制到各个节点下面相同的路径里面,然后在代码中输入路径(不可以只放在namenode节点上,不然datanonde读不到文件便会报空指针异常)。

    mapreduce框架中全局变量的设置

    在我的工程中需要在map函数里面调用一个类的方法,如果在每个map函数里面都新建类的话会导致运行时间很长,内存溢出。这里我想在代码运行之前新建这个类,在map方法里面直接调用这个类的方法,这个过程也困扰了我很长的时间,直到另一个需求的出现,在处理很多文件的时候我希望输出为多个文件,而不是只有一个输出文件。

    对于输出多个文件的分析

    在程序中加入以下代码

    复制代码
    private MultipleOutputs mos;
    
    protected void setup(Context context) throws IOException, InterruptedException { 
    
      mos=new MultipleOutputs(context);//初始化mos 
    }
    
    protected void cleanup( Context context) throws IOException, InterruptedException { 
    
    mos.close();//释放资源 
    } 
    
    public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException,NullPointerException{
    
    mos.write(new Text(key),new Text(value),filename);
    
    }
    复制代码

    实现以filename文件作为输入文件输出map的结果。

    这里我就发现了一个地方,在setup方法中新建了一个对象mos,然后在map函数中直接调用mos的方法,而网上说setup方法只运行一次,可以重载自己的功能,然后回到上一个问题,我把需要初始化的对象直接放到setup方法里面,然后在map函数里面执行对象的方法,结果空指针异常消失了,而且不会再每执行一次map函数就新建一个对象,这样减少了内存的消耗。

    运行时候出现Error: GC overhead limit exceeded

    在hadoop2.x中默认Container的yarn child jvm堆大小为200M,通过参数mapred.child.java.opts指定,可以在job提交的时候给定,是一个客户端生效的参数,配置在mapred-site.xml文件中,通过将该参数修改为-Xms200m -Xmx4096000m来更改jvm堆大小,异常解决。

    然后我继续运行jar包工程,运行时出现4.2 GB of 2.1 GB virtual memory used. Killing container.

    这个错误和物理内存无关,是虚拟内存超了。

    解决方法:

    在etc/hadoop/yarn-site.xml文件中,修改检查虚拟内存的属性为false,如下:

    <property>  
        <name>yarn.nodemanager.vmem-check-enabled</name>  
        <value>false</value>  
    </property>  

    参考资料:http://blog.csdn.net/ma0903/article/details/48289731

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-22 04:06 , Processed in 0.394178 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表