zoukankan      html  css  js  c++  java
  • Hadoop打包成jar包在集群上运行时出现的各种问题以及解决方案

    之前将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

  • 相关阅读:
    解决 el-table在ie11中默认状态下不是百分百展开的问题
    在vue中使用lexible.js 通过props传的style样式无法转换成rem
    解决 el-select 与 el-radio 组合字体发生闪烁问题
    解决element生成的下拉菜单,不在父级之下,而是在body之下,通过父级控制该下拉菜单的样式,达到不跟别的地方冲突的目的
    解决nvm use提示切换node版本成功,实际却没有切换过对应版本
    vue-element-admin安装失败的问题
    今天转正了,感谢博客园让我找到工作!
    electron-vue中点击按钮,实现打开程序目录里面的某个文件
    项目实战---模拟站酷网站
    vue实现选项卡切换效果
  • 原文地址:https://www.cnblogs.com/lisi2016/p/5753036.html
Copyright © 2011-2022 走看看