- 本文使用的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分开了,成为两部分:
所以在这部分涉及了资源管理的内容,导致在两台服务器上的运行效果不同。下面是测试的结果、问题和解决办法。
这一步的目的在于提供Hadoop运行MapReduce任务、资源管理和节点管理等的配置信息,默认情况下,Hadoop给我们提供了关于这些程序运行的所有参数配置,这里涉及到的是:
在官方的文档中,上述两个文件的配置如下:
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
configuration>
从上述的配置中也可以看出来,Hadoop已经将计算框架从Hadoop本身剥离出来了,连配置文件都是独立的。
配置完毕之后就要启动yarn脚本了,这个脚本中包括ResourceManager和NodeManager两个守护进程,是独立运行的。开启之后你可以通过jps查看运行情况,这个命令可以查看运行的JVM实例,如果正常的话,结果如下:
10356 NameNode
10661 SecondaryNameNode
26840 ResourceManager
26953 NodeManager
10492 DataNode
9340 Jps
对于上述结果:
在我运行的时候,出现的问题如下:
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-mbname>
<value>1600value>
property>
<property>
<name>yarn.nodemanager.resource.cpu-vcoresname>
<value>1value>
property>
对于本地服务器:
<property>
<name>yarn.nodemanager.resource.memory-mbname>
<value>3000value>
property>
<property>
<name>yarn.nodemanager.resource.cpu-vcoresname>
<value>3value>
property>
对于这个配置过程真是一波三折,期间和各种其他的默认配置相冲突,导致不断推到重来,而且在加上使用的服务器那点资源,真是捉急呀!对于整个配置的过程,需要对Yarn的构建组件和彼此之间的关系十分清楚,才能找出各个配置之间的关系,这里主要关注内存分配之间的关系:
yarn.scheduler.minimum-allocation-mb
& yarn.scheduler.maximum-allocation-mb
该参数的作用阶段在:应用(以Container的形式)向ResourceManager请求内存分配的时候,如果应用请求的内存,记为Mem(Container Request),出现以下情况则会抛出InvalidResourceRequestException
异常:
yarn.scheduler.minimum-allocation-mb
)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):
mapreduce.map.memory.mb
& mapreduce.reduce.memory.mb
这两个参数的作用阶段在:Container已经在各个Node上运行起来了,NodeManager起到监控和预警的作用,相当于设定的阈值,如果实际情况下的Map或者Reduce任务使用的资源超过这两个设定值的话,会被killed掉,具体满足何种条件才会监控,包括对于虚拟内存的监控相关的参数参考相关文章的第2篇,作为一篇入坑文,本文不详细阐述。所以这两个参数的值满足:
yarn.nodemanager.resource.memory-mb
) > Mem(mapreduce.map.memory.mb
)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提供的,所以也要满足一下条件,在提交客户端的时候会检查如下:
yarn.nodemanager.resource.memory-mb
) > Mem(yarn.app.mapreduce.am.resource.mb
)当启动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,而且还没有修复。
到此为止,所有的流程全部完成,对于两个服务器来说,结果是不同的:
关于初次体验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