用户登录
用户注册

分享至

mapreduce 分布式

  • 作者: 朝天R大象
  • 来源: 51数据库
  • 2020-09-21
一、 首先要知道此前提 转载
  若在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作业提交分析(一)~~(五)
  引用博文的附件中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

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



  一、 首先要知道此前提 转载
若在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作业提交分析(一)~~(五)
引用博文的附件中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程序。
软件
前端设计
程序设计
Java相关