皮皮网

【CR优化指标源码】【星源数字人源码】【多账号管理源码】toolrunner 源码分析

2024-12-23 01:40:24 来源:傲玩捕鱼源码

1.如何分布式运行mapreduce程序

toolrunner 源码分析

如何分布式运行mapreduce程序

       ã€€ã€€ä¸€ã€ 首先要知道此前提 转载

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

       ã€€ã€€è‹¥ä¸æ‹·è´ï¼Œå·¥ç¨‹ä¸­bin目录没有完整的xml配置文件,则windows执行的mapreduce程序全部通过本机的jvm执行,作业名也是带有“local"字眼的作业,如 job_local_。 这不是真正的分布式运行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上,源码CR优化指标源码执行命令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] -- ::, - org.apache.hadoop.mapreduce.Job - [main] INFO org.apache.hadoop.mapreduce.Job - map 0% reduce 0%

       ã€€ã€€[work] -- ::, - org.apache.hadoop.mapreduce.Job - [main] INFO org.apache.hadoop.mapreduce.Job - Task Id : attempt___m__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:)

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

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

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

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

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

       ã€€ã€€at javax.security.auth.Subject.doAs(Subject.java:)

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

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

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

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

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

       ã€€ã€€... 8 more

       ã€€ã€€# Error:后重复三次

       ã€€ã€€-- ::, - org.apache.hadoop.mapreduce.Job - [main] INFO org.apache.hadoop.mapreduce.Job - map % reduce %

       ã€€ã€€çŽ°è±¡å°±æ˜¯ï¼šæŠ¥é”™ï¼Œæ— è¿›åº¦ï¼Œæ— è¿è¡Œç»“果。

       ã€€ã€€

       ã€€ã€€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:)

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

       ã€€ã€€å’ŒæŠ¥é”™ï¼š

       ã€€ã€€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上执行。

       ã€€ã€€çŽ°è±¡å°±æ˜¯ï¼šæ— æŠ¥é”™ï¼Œæœ‰è¿›åº¦ï¼Œæœ‰è¿è¡Œç»“果。

       ã€€ã€€ä½†æŸäº›èŠ‚点上运行会报错如下,且运行结果。:

       ã€€ã€€// :: INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/hduser/.staging/job__

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

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

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

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

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

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

       ã€€ã€€at org.apache.hadoop.mapreduce.Job$.run(Job.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.Job$.run(Job.java:)

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

       ã€€ã€€at javax.security.auth.Subject.doAs(Subject.java:)

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

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

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

       ã€€ã€€at com.etrans.anaSpeed.AnaActionMr.run(AnaActionMr.java:)

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

       ã€€ã€€at com.etrans.anaSpeed.AnaActionMr.main(AnaActionMr.java:)

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

       ã€€ã€€at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)

       ã€€ã€€at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)

       ã€€ã€€at java.lang.reflect.Method.invoke(Method.java:)

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

       ã€€ã€€ç¬¬äºŒç‚¹ç»“论就是: Linux上,只需拷贝jar文件到集群master上,执行命令hadoop jarPackage.jar MainClassName即可分布式运行mapreduce程序。