文档章节

如何分布式运行mapreduce程序

Zero零_度
 Zero零_度
发布于 2015/09/06 15:11
字数 1308
阅读 245
收藏 1

如何分布式运行mapreduce程序


一、 首先要知道此前提

     若在windows的Eclipse工程中直接启动mapreduc程序,需要先把hadoop集群的配置目录下的xml都拷贝到src目录下,让程序 自动读取集群的地址后去进行分布式运行(您也可以自己写java代码去设置job的configuration属性)。

    若不拷贝,工程中bin目录没有完整的xml配置文件,则windows执行的mapreduce程序全部通过本机的jvm执行,作业名也是带有 “local"字眼的作业,如 job_local2062122004_0001。 这不是真正的分布式运行mapreduce程序。    

       估计得研究org.apache.hadoop.conf.Configuration的源码,反正xml配置文件会影响执行mapreduce使用的 文件系统是本机的windows文件系统还是远程的hdfs系统; 还有影响执行mapreduce的mapper和reducer的是本机的jvm还是集群里面机器的jvm

 

二、 本文的结论

第一点就是: windows上执行mapreduce,必须打jar包到所有slave节点才能正确分布式运行mapreduce程序。(我有个需求是要windows上触发一个mapreduce分布式运行)

第二点就是: Linux上,只需拷贝jar文件到集群master上,执行命令hadoop jarPackage.jar MainClassName即可分布式运行mapreduce程序。  

第三点就是:  推荐使用附一,实现了自动打jar包并上传,分布式执行的mapreduce程序。


附一、 推荐使用此方法:实现了自动打jar包并上传,分布式执行的mapreduce程序:


 请先参考博文五篇:

Hadoop作业提交分析(一)~~(五)

http://www.cnblogs.com/spork/archive/2010/04/07/1706162.htm


          引用博文的附件中EJob.java到你的工程中,然后main中添加如下方法和代码。

       public static File createPack() throws IOException {

File jarFile = EJob.createTempJar("bin");

ClassLoader classLoader = EJob.getClassLoader();

Thread.currentThread().setContextClassLoader(classLoader);

return jarFile;

       在作业启动代码中使用打包:

Job job = Job.getInstance(conf, "testAnaAction");

       添加:

String jarPath = createPack().getPath();

job.setJar(jarPath);

      即可实现直接run as java application 在windows跑分布式的mapreduce程序,不用手工上传jar文件。



附二、得出结论的测试过程

   (未有空看书,只能通过愚笨的测试方法得出结论了)

一. 直接通过windows上Eclipse右击main程序的java文件,然后"run as application"或选择hadoop插件"run on hadoop"来触发执行MapReduce程序的测试。

1,如果不打jar包到进集群任意linux机器上,它报错如下:

[work] 2012-06-25 15:42:47,360 - org.apache.hadoop.mapreduce.Job -10244 [main] INFO  org.apache.hadoop.mapreduce.Job  -  map 0% reduce 0%

[work] 2012-06-25 15:42:52,223 - org.apache.hadoop.mapreduce.Job -15107 [main] INFO  org.apache.hadoop.mapreduce.Job  - Task Id : attempt_1403517983686_0056_m_000000_0, Status : FAILED

Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class bookCount.BookCount$BookCountMapper not found

at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1720)

at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)

at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:721)

at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)

at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:415)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)

at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157)

Caused by: java.lang.ClassNotFoundException: Class bookCount.BookCount$BookCountMapper not found

at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1626)

at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1718)

... 8 more

  # Error:后重复三次

 2012-06-25 15:44:53,234 - org.apache.hadoop.mapreduce.Job -37813 [main] INFO  org.apache.hadoop.mapreduce.Job  -  map 100% reduce 100%


   现象就是:报错,无进度,无运行结果。

 

2, 拷贝jar包到“只是”集群master的$HADOOP_HOME/share/hadoop/mapreduce/目录上,直接通过windows的 eclipse "run as application"和通过hadoop插件"run on hadoop"来触发执行,它报错同上。 

   现象就是:报错,无进度,无运行结果。


3, 拷贝jar包到集群某些slave的$HADOOP_HOME/share/hadoop/mapreduce/目录上,直接通过windows的 eclipse "run as application"和通过hadoop插件"run on hadoop"来触发执行 

   和报错:

Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class bookCount.BookCount$BookCountMapper not found

at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1720)

at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)

  和报错:

  Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class bookCount.BookCount$BookCountReducer not found

 

    现象就是:有报错,但仍然有进度,有运行结果。


4, 拷贝jar包到集群所有slave的$HADOOP_HOME/share/hadoop/mapreduce/目录上,直接通过windows的 eclipse "run as application"和通过hadoop插件"run on hadoop"来触发执行:

   现象就是:无报错,有进度,有运行结果。


第一点结论就是: windows上执行mapreduce,必须打jar包到所有slave节点才能正确分布式运行mapreduce程序。



二 在Linux上的通过以下命令触发MapReduce程序的测试。

    hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/bookCount.jar bookCount.BookCount

   

  1,只拷贝到master,在master上执行。

       现象就是:无报错,有进度,有运行结果。


  2,拷贝随便一个slave节点,在slave上执行。 

       现象就是:无报错,有进度,有运行结果。 

      但某些节点上运行会报错如下,且运行结果。:

14/06/25 16:44:02 INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/hduser/.staging/job_1403517983686_0071

Exception in thread "main" java.lang.NoSuchFieldError: DEFAULT_MAPREDUCE_APPLICATION_CLASSPATH

        at org.apache.hadoop.mapreduce.v2.util.MRApps.setMRFrameworkClasspath(MRApps.java:157)

        at org.apache.hadoop.mapreduce.v2.util.MRApps.setClasspath(MRApps.java:198)

        at org.apache.hadoop.mapred.YARNRunner.createApplicationSubmissionContext(YARNRunner.java:443)

        at org.apache.hadoop.mapred.YARNRunner.submitJob(YARNRunner.java:283)

        at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:415)

        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1268)

        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1265)

        at java.security.AccessController.doPrivileged(Native Method)

        at javax.security.auth.Subject.doAs(Subject.java:415)

        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)

        at org.apache.hadoop.mapreduce.Job.submit(Job.java:1265)

        at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1286)

        at com.etrans.anaSpeed.AnaActionMr.run(AnaActionMr.java:207)

        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)

        at com.etrans.anaSpeed.AnaActionMr.main(AnaActionMr.java:44)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.util.RunJar.main(RunJar.java:212)


第二点结论就是: Linux上,只需拷贝jar文件到集群master上,执行命令hadoop jarPackage.jar MainClassName即可分布式运行mapreduce程序。  




附三、本附程序的主要代码:

    请参考我另外的博文

    Hadoop的mapreduce编程新旧API的简单例子  

    http://keyknight.blog.163.com/blog/static/36637840201452651146607/


本文转载自:http://keyknight.blog.163.com/blog/static/3663784020145255627172/

Zero零_度
粉丝 69
博文 1267
码字总数 263854
作品 0
程序员
私信 提问
【hadoop】16.MapReduce-简介

简介 本章节我们先来了解一些关于MapReduce的理论知识。从本章节您可以学习到:MapReduce的相关知识。 1、概念 Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析...

Areya
01/12
19
0
Hadoop之MapReduce的基本概念

MapReduce 的概念 MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于 hadoop 的数据分析应用”的核心框架; MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一...

飞鱼说编程
01/16
51
0
大数据教程(8.1)mapreduce核心思想

上一章介绍了hadoop的HDFS文件系统的原理及API使用。本章博主将继续对hadoop的mapreduce编程框架进行分享。 mapreduce原理篇 mapreduce是一个分布式运算程序的编程框架,是用户开发“基于had...

em_aaron
2018/11/19
68
0
Hadoop实战之 MapReduce

私塾在线 整体课程概览 第一部分:开始云计算之旅 第二部分:初识Hadoop 第三部分:Hadoop 环境安装部署 第四部分:Hadoop Shell 基本操作介绍 第五部分:Hadoop 分布式文件系统1 第五部分:...

linni
2014/01/08
736
0
2014-11-12--Hadoop的基础学习(三)--Hadoop中MapReduce框架入门

1.MapReduce的简单概念 百度百科:MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",和他们的主要思想,都是从函数式编程语言里借来的...

查封炉台
2014/11/16
8.3K
8

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
3
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
7
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部