版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lmy86263/article/details/77925859
本文使用的Hadoop版本是2.7.4;
操作系统是:Linux下的Ubuntu16.04以及其定制版Linux mint 18.1
一、背景
因为工作和以后课题方向的原因,开始涉及大数据的方向,在大数据的领域,Hadoop无论如何是绕不过去的话题,于是进入这个方向也是着手从Hadoop开始,但是从Hadoop开始,并不代表我们一定要采用它的解决方案,因为现在Hadoop自身各个组件的解耦做得已经才能够当好了,所以说我们可以把某一个组件单独拿出来使用,或者和别的框架相结合,比如单单使用HDFS,但是因为采用的计算模型可能和我们实际的业务并不相同,所以说HDFS之上,我们可以采用Spark,Storm等计算框架。
这篇文章只是一篇“入坑文”,在我看来,因为对于这样一个庞大的生态系统,早点遇到一些问题还是好的,因为如果在生产环境中遇到,那真是一件想死的事情。
对于下边的体验和实践,我都在两种环境下进行了测试,其结果并不完全相同。其中最开始我是在阿里云的服务器上搭建的,开始买的是学生优惠的服务器 ,但是整体服务器的性能并不是很强(由于窘迫的经济),但是对于折腾一下还是足够的,但是一在运行Hadoop的时候就出现问题了,后面会详说;同时我还在自己的笔记本上运行了一下,对于整个过程来说,相对于阿里云上的测试还是比较顺利的。
下面是我的服务器的配置对比,可以给大家做参考。
指标/配置
阿里云服务器
本地服务器
CPU
单处理器*单核 Intel Xeon E5-2682 v4
4处理器*双核 Intel Core i5-3210M
内存
2G
8G
操作系统
Ubuntu 16.04.2 LTS
Linux Mint 18.1 Serena
磁盘
40G
512G
网络
1M带宽
6M带宽
对于Hadoop运行环境的选择,个人更偏向Linux,虽然目前Hadoop是使用Java
开发的,天然支持跨平台,而且也开始支持windows,但是由于是部署在服务器上的,而Linux是服务器领域无愧的王者,所以最好还是在Linux平台上。
本文主要是在单机和伪分布式模式下运行,参考的是Hadoop的官方文档 。对于一些简单的配置和运行在文档中已经写的很清楚了,在上述两台服务器上运行的都没有问题,但是对于YARN on a Single Node部分(我们假设运行之前的HDFS的程序和配置是没有问题的),在两台服务器的运行就开始有差别了 ,这是因为作为Hadoop 2.x最明显的改变就是讲JobTracker分开了,成为两部分:
所以在这部分涉及了资源管理的内容,导致在两台服务器上的运行效果不同。下面是测试的结果、问题和解决办法。
二、测试过程
2.1 相关参数的配置
这一步的目的在于提供Hadoop运行MapReduce任务、资源管理和节点管理等的配置信息,默认情况下,Hadoop给我们提供了关于这些程序运行的所有参数配置,这里涉及到的是:
etc/Hadoop/mapred-site.xml:用于配置MapReduce应用的配置信息,这是只有你在选择了MapReduce计算模型后才会来配置该文件,如果你选择的是Spark的话,则需要考虑另外的配置文件,默认的配置在mapred-default.xml ;
etc/Hadoop/yarn-site.xml:这个配置文件里提供的是Yarn相关的配置参数,默认的配置参数在yarn-default.xml ;
在官方的文档中,上述两个文件的配置如下:
mapred-site.xml
<configuration >
<property >
<name > mapreduce.framework.name</name >
<value > yarn</value >
</property >
</configuration >
yarn-site.xml
<configuration >
<property >
<name > yarn.nodemanager.aux-services</name >
<value > mapreduce_shuffle</value >
</property >
</configuration >
从上述的配置中也可以看出来,Hadoop已经将计算框架从Hadoop本身剥离出来了,连配置文件都是独立的。
2.2 启动yarn
配置完毕之后就要启动yarn脚本了,这个脚本中包括ResourceManager和NodeManager两个守护进程,是独立运行的。开启之后你可以通过jps查看运行情况,这个命令可以查看运行的JVM实例,如果正常的话,结果如下:
10356 NameNode
10661 SecondaryNameNode
26840 ResourceManager
26953 NodeManager
10492 DataNode
9340 Jps
对于上述结果:
前提是你的HDFS已经运行起来了;
这里虽然所有程序都已经显示了,但是根据我运行时的经验,jps这个命令有时候不太灵,有些程序原本运行失败,但是它仍然显示出来了,在手册上也显示这个命令处于实验阶段,所以稳定性还有待提高;此时我们应该去查看对应的日志看看时候有异常出现,但是对于这一点,对于Hadoop有不满的一点,所有的异常都是写到文件中的,在控制台没有丝毫的提示信息,导致出现异常不能及时发现 ,对应的日志在logs目录下;
在我运行的时候,出现的问题如下:
NodeManager 启动失败,查看日志发现异常如下:
org.apache.Hadoop.yarn.exceptions.YarnRuntimeException: org.apache.Hadoop.yarn.exceptions.YarnRuntimeException: Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ResourceManager: NodeManager from localhost doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager.
从日志中来看,明显是服务器的资源不能满足程序运行的需要,此时只能去查找默认NodeManager的资源配置,所谓的资源,这里涉及到的由内存和CPU,默认情况下,这两种资源的配置如下:
yarn.nodemanager.resource.memory-mb
:用于配置可以分给运行的containers的物理内存的数量,默认是8192MB,也就是8G;
yarn.nodemanager.resource.cpu-vcores
:用于containers运行的虚拟核心的数量,这里指的是虚拟核心,而不是物理核心,指的是使用牙膏厂的超线程技术虚拟出来的核心,默认是8;
情况很明显,对于这两个要求,我的服务器都不满足,所以只能更改配置,在如下:
对于阿里云服务器:
<property >
<name > yarn.nodemanager.resource.memory-mb</name >
<value > 1600</value >
</property >
<property >
<name > yarn.nodemanager.resource.cpu-vcores</name >
<value > 1</value >
</property >
对于本地服务器:
<property >
<name > yarn.nodemanager.resource.memory-mb</name >
<value > 3000</value >
</property >
<property >
<name > yarn.nodemanager.resource.cpu-vcores</name >
<value > 3</value >
</property >
对于这个配置过程真是一波三折,期间和各种其他的默认配置相冲突,导致不断推到重来,而且在加上使用的服务器那点资源,真是捉急呀!对于整个配置的过程,需要对Yarn的构建组件和彼此之间的关系十分清楚,才能找出各个配置之间的关系,这里主要关注内存分配之间的关系:
yarn.scheduler.minimum-allocation-mb
& yarn.scheduler.maximum-allocation-mb
该参数的作用阶段在:应用(以Container的形式)向ResourceManager请求内存分配的时候,如果应用请求的内存,记为Mem(Container Request),出现以下情况则会抛出InvalidResourceRequestException
异常:
Mem(Container Request) < Mem(yarn.scheduler.minimum-allocation-mb
)
Mem(Container Request) > Mem(yarn.scheduler.maximum-allocation-mb
)
对于这两个参数和yarn.nodemanager.resource.memory-mb
的关系,这两个参数决定的是一个Container运行所需资源的波动范围,而应用都是要在各个Node上运行的,yarn.nodemanager.resource.memory-mb
决定的是一个Node能够提供给containers多少内存资源,所以这三个参数决定了一个Node同时能够运行的最多的Container有多少,记为Num(Max Running Container):
N u m ( M a x R u n n i n g C o n t a i n e r ) = M e m ( ′ y a r n . n o d e m a n a g e r . r e s o u r c e . m e m o r y m b ′ ) M e m ( ′ y a r n . s c h e d u l e r . m i n i m u m a l l o c a t i o n m b ′ )
<script type="math/tex; mode=display" id="MathJax-Element-1">
Num(Max Running Container) = \frac{Mem('yarn.nodemanager.resource.memory-mb')}{Mem('yarn.scheduler.minimum-allocation-mb')}
mapreduce.map.memory.mb
& mapreduce.reduce.memory.mb
这两个参数的作用阶段在:Container已经在各个Node上运行起来了,NodeManager起到监控和预警的作用,相当于设定的阈值,如果实际情况下的Map或者Reduce任务使用的资源超过这两个设定值的话,会被killed掉,具体满足何种条件才会监控,包括对于虚拟内存的监控相关的参数参考相关文章的第2篇,作为一篇入坑文,本文不详细阐述。所以这两个参数的值满足:
Mem(yarn.nodemanager.resource.memory-mb
) > Mem(mapreduce.map.memory.mb
)
Mem(yarn.nodemanager.resource.memory-mb
) > Mem(mapreduce.reduce.memory.mb
)
yarn.app.mapreduce.am.resource.mb
该参数决定了运行在特定Node的Application Master使用的内存的总数,由于Application Master是和NodeManager一起用来执行和监控运行在Node上的所有Application的,包括它们的执行状态和执行过程,由于Application Master也是在Node上运行的,所以它要使用的内存也是由NodeManager提供的,所以也要满足一下条件,在提交客户端的时候会检查如下:
Mem(yarn.nodemanager.resource.memory-mb
) > Mem(yarn.app.mapreduce.am.resource.mb
)
2.3 提交MapReduce应用
当启动Yarn成功后,我们可以提交MapReduce任务,当提交MapReduce任务时候可能会出现奇怪的异常,比如任务:
bin/Hadoop jar share/Hadoop/mapreduce/Hadoop-mapreduce -examples - 2.7 .4 . jar grep input output 'dfs[a-z.]+'
异常如下:
WARN hdfs.DataStreamer :
Caught exceptionjava .lang .InterruptedException at java .lang .Object .wait (Native Method) at java.lang .Thread .join (Thread.java :1245 ) at java.lang .Thread .join (Thread.java :1319 ) at org.apache .Hadoop .hdfs .DataStreamer .closeResponder (DataStreamer.java :871 ) at org.apache .Hadoop .hdfs .DataStreamer .endBlock (DataStreamer.java :519 ) at org.apache .Hadoop .hdfs .DataStreamer .run (DataStreamer.java :696 )
这个对于初学者来说有点恐慌,其实这是Hadoop本身的一个bug ,而且还没有修复。
到此为止,所有的流程全部完成,对于两个服务器来说,结果是不同的:
本地服务器:成功运行,虽然运行的时间很长,但是结果完全正确;
阿里云服务器:执行的Application一致卡在Running状态,搜索了很多,都将矛头指向了内存分配,但是无奈,巧妇难为无米之炊;
关于初次体验Hadoop,最直接的感受和印象就是对资源管理要很熟悉才行,才能了解各种参数之间的关系,但是想要达到这个目的,首先要了解Hadoop整体的架构组成,以及各个组件详细的功能、彼此之间的关系 。
相关文章:
Difference between ‘yarn.scheduler.maximum-allocation-mb’ and ‘yarn.nodemanager.resource.memory-mb’
https://mapr.com/blog/best-practices-yarn-resource-management/
Configuring Memory for MapReduce Running on YARN
APACHE Hadoop YARN – CONCEPTS AND APPLICATIONS
Determining HDP Memory Configuration Settings