Hadoop初次体验:各种坑以及解决办法

  • 本文使用的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.namename>
          <value>yarnvalue>
      property>
    configuration>
  • yarn-site.xml

    <configuration>
      <property>
          <name>yarn.nodemanager.aux-servicesname>
          <value>mapreduce_shufflevalue>
      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-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异常:

    • 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):

    Num(MaxRunningContainer)=Mem(yarn.nodemanager.resource.memorymb)Mem(yarn.scheduler.minimumallocationmb)

  • 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整体的架构组成,以及各个组件详细的功能、彼此之间的关系


相关文章:

  1. Difference between ‘yarn.scheduler.maximum-allocation-mb’ and ‘yarn.nodemanager.resource.memory-mb’?

  2. https://mapr.com/blog/best-practices-yarn-resource-management/

  3. Configuring Memory for MapReduce Running on YARN

  4. APACHE Hadoop YARN – CONCEPTS AND APPLICATIONS

  5. Determining HDP Memory Configuration Settings

你可能感兴趣的:(分布式,大数据,Hadoop)