大讲台分享:关于MapReduce常见的问题及解决方案

来源:互联网 发布:新韩顺平php全套视频 编辑:程序博客网 时间:2024/05/17 23:32

本文中所涉及到的问题均来自大讲台Hadoop学员的提问,下面是具体问题描述及解决方案。

问题1:MapReduce和Yarn是什么关系?

问题描述:课件中说Hadoop框架的核心是HDFS和MapReduce,这课程主要讲的2.2版本,2版本中不是用Yarn了吗。

我看书上和网上有些人说Yarn是MapReduce二代,改进了MapReduce一代的一些弊端。

但我看Hadoop2.2中有MapReduce也有Yarn模块,那么MapReduce和Yarn到底是什么关系?

解决方案:这问题很好,我比较认同《Hadoop技术内幕》作者董西成的看法。

首先,YARN并不是下一代 MapReduce(MRv2),下一代MapReduce与第一代MapReduce(MRv1)在编程接口、数据处理引擎(MapTask和 ReduceTask)是完全一样的, 可认为MRv2重用了MRv1的这些模块,不同的是资源管理和作业管理系统,MRv1中资源管理和作业管理均是由JobTracker实现的,集两个功能 于一身,而在MRv2中,将这两部分分开了, 其中,作业管理由ApplicationMaster实现,而资源管理由新增系统YARN完成。

另 外,由于YARN具有通用性,因此YARN也可以作为其他计算框架的资源管理系统,不仅限于MapReduce,也是其他计算框架,比如Spark、 Storm等, 通常而言,我们一般将运行在YARN上的计算框架称为“X on YARN”,比如“MapReduce On YARN”, "Spark On YARN",“Storm On YARN”等。 

不知这种解释这位同学是否理解,如有异议,欢迎探讨

问题2:运行MapReduce程序,用到第三方jar包该怎么办?

问题描述:我写了一个hadoop 程序,用到了第三方jar包,我明明引用到项目里面了,放到集群上面运行,怎么总提示报错?说找不到相关的类!!!

解决方案:要想让mapreduce程序引用第三方jar文件, 可以采用如下方式:

  1. 通过命令行参数传递jar文件, 如-libjars等;
  2. 直接在conf中设置, 如conf.set(“tmpjars”,*.jar), jar文件用逗号隔开;
  3. 利用分布式缓存, 如DistributedCache.addArchiveToClassPath(path, job), 此处的path必须是hdfs, 即自己讲jar上传到hdfs上, 然后将路径加入到分布式缓存中;
  4. 第三方jar文件和自己的程序打包到一个jar文件中, 程序通过job.getJar()将获得整个文件并将其传至hdfs上. (很笨重)
  5. 在每台机器的$HADOOP_HOME/lib目录中加入jar文件. (不推荐)

p.s. 如果通过上面方法1.或2., 需要注意Configuration问题, 需要通过getConf()函数获得,而不要自己new一个对象.

问题3:mapreduce不能debug是什么情况?

问题描述:mapreduce不能debug是什么情况?本地程序无法调试?

解决方案:首先肯定告诉你,MapReduce可以debug调试程序。
MapReduce进入Debug 运行模式需要以下几步:
      第一步:选定一台调试机器,修改 mapred-site.xml文件,添加如下配置。
<property>
      <name>mapred.child.java.opts</name>
     <value>-agentlib:jdwp=transport=dt_socket,address=8883,server=y,suspend=y</value>
</property>
      第二步:关闭所有的TaskTracker,只保留上面配置的一台需要调试的 TaskTracker。
      第三步:启动MapReduce Job。
      第四步:右键 Hadoop 项目,选择“Debug As”——>“Debug Configuration”——>“Remote Java Application”,添加一个新的测试,输入远程 Host IP和监听端口,端口为8883,然后单击Apply。
      第五步:调试运行你的程序。

0 0
原创粉丝点击