MapReduce程序在hadoop集群中运行时遇到的问题

将单机模式的wordcount部署到hadoop集群上

在WordCountDriver类的main方法中将原来的FileInputFormat.setInputPaths(job, new Path("D:\\..."));FileOutputFormat.setOutputPaths(job, new Path("D:\\..."));修改为如下内容

FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPaths(job, new Path(args[1]));

args[]表示主函数的参数,也就是在执行jar包时,后面跟着的参数。

然后在pom.xml中添加以下依赖,也就是添加用来打包的插件,并更新。如果遇到问题,可以检查IDEA的settings中的maven是否设置得当,可以参考之前的文章。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

添加完毕,点击右侧的maven,点击【package】成功导出,成功后有两个jar包,其中一个jar包名的后面跟着“with-dependencies”这个是上面刚刚添加的那个插件的作用,可以把依赖的包一起导出。在这里我们先不用这第二个包,我们把第一个jar包先改个名“wordcount.jar”,之后把这个wordcount.jar放到集群中的一个主机中去,注意不是上传到分布式文件系统,而是先放到一个主机上。比如先放到hadoop102(工具可以使用Xftp)。

(x.x.x 换成自己的hadooop版本号)

比如可以放到/opt/module/hadoop x.x.x这个目录下,再准备好一个word的文件,放到集群路径/input下(这里是指HDFS中)。然后确保集群正常运行后,在/opt/module/hadoop x.x.x这个目录下输入下面这个命令。其中输出路径不能已经存在,否则报错。

hadoop jar wordcount.jar com.xunn.mapreduce.wordcount.Driver /input /output

如果出现问题,可以先运行一下下面这个命令,这个是官方的example,如果运行下面这个没出现问题,就是自己编写的wordcount程序有问题,或者导包有差池。如果下面这个有问题,那么目前来看不是自己程序的错误,而是集群有问题,可以看看显示的异常信息,去搜索原因和解决办法。

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-example-x.x.x.jar wordcount /input /output2

下面会给出一些我遇到的问题。

VMware虚拟机中CentOS7的ens33丢失

问题描述:在对应的主机上输入ifconfig命令查看网络信息,发现没有ens33.

解决办法:可以重启网络服务,依次执行下面两条命令,也就是暂时关闭NetworkManager,然后再重启网络服务。

systemctl stop NetworkManager
service network restart

2.3 GB of 2.1 GB virtual memory used. Killing container.

问题分析:在集群中运行mapreduce的example时,发生了这种错误,是因为集群的虚拟内存不够大了。在设定虚拟机的物理内存时给的1G的内存,然后在hadoop中,负责资源调度的YARN则默认设置集群的虚拟内存为物理内存的2.1倍,2.1GB就是这么来的。然后运行这个example时系统所占用的虚拟内存超出了限制,从而抛出了这个异常,进而整个mapreduce的过程也就终止了。

解决办法:既然虚拟内存太小,就把它设大一些。因为在hadooop3.x中,是由YARN管理资源调度,所以在如下目录/opt/module/hadoop3.x.x/etc/hadoop可以找到名为yarn-site.xml的文件。然后在里面加一个property,如果有就直接改。这个yarn.nodemanager.vmem-pmem-ratio指的是虚拟内存与物理内存的比值,默认2.1,我们把它改成4,虚拟内存就变成了了4g。

<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4</value> 
</property>

修改完之后,退出来,把修改通知给其他节点,然后可以再重启一下集群。需要用自己编写好的shell脚本,在这里不再赘述。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值