一. 对hadoop eclipse plugin认识不足
http://zy19982004.iteye.com/blog/2024467曾经说到我最hadoop eclipse plugin作用的认识。但事实上我犯了一个错误,Win7 Eclipse里的MyWordCount程序一直在本地运行,没有提交到集群环境上运行(查看192.168.1.200:50030)没有这个Job。运行方式分为两种,右键Run As
- Java Application
- Run on Hadoop
如果说Run As Java Application在本地运行还好说,它直接使用项目下的依赖的Hadoop Jar,使用Hdfs作为input,对MyWordCount main方法的一步步调用,把输出结果写入Hdfs完成。这一切都跟MapReduce集群无关。
但Run on Hadoop为什么不行呢,难道这个插件的作用仅仅如http://zy19982004.iteye.com/blog/2024467说到的这么简单?
二. Hadoop2.x eclispe-plugin
再次下载源码https://github.com/winghc/hadoop2x-eclipse-plugin。简单看了几个类,如
Wizard for publishing a job to a Hadoop server public class RunOnHadoopWizard extends Wizard {} Representation of a Map/Reduce running job on a given location public class HadoopJob {}
从注释就可以看出来插件是支持远程提交Job的。那是我使用不当吗?
三. Hadoop2.x eclispe-plugin工作原理
Run on Hadoop时
- 会在EclipseWorkspace\.metadata\.plugins\org.apache.hadoop.eclipse\下生成一个MapReduce Jar和一个对应文件夹(包含core-site.xml)。我们在Eclipse里配置的Hadoop集群信息会写到core-site.xml里面。
- 然后把此Job依据配置信息提交到本地或者集群。
我去看了下Job对应的core-site.xml,mapreduce.framework.name居然是local,yarn.resourcemanager.address居然是0.0.0.0:8032,于是回到Eclispe配置集群环境的地方,发现果然是这样的,也就是说插件根本没有把集群环境下的配置信息全部copy到Eclipse下。把Eclipse下这两项修改后,还是在本地运行,我就奇怪了,于是我在程序里加上
conf.set("mapreduce.framework.name", "yarn"); conf.set("yarn.resourcemanager.address", "192.168.1.200:8032");
终于正常提交到集群环境了。我怀疑插件最后在什么地方还是读取到了local和0.0.0.0:8032,写入了core-site.xml,有时间再去看看插件的源码。
四. 继续出问题
Job虽然是提交到了集群环境,但运行失败了。查看日志如下
2014-04-01 19:50:36,731 INFO org.apache.hadoop.yarn.server.resourcemanager.amlauncher.AMLauncher: Command to launch container container_1396351641800_0005_02_000001 : %JAVA_HOME% -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=<LOG_DIR> -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster 1><LOG_DIR>/stdout 2><LOG_DIR>/stderr 2014-03-13 22:50:41,317 INFO org.apache.hadoop.mapreduce.Job - Job job_1394710790246_0003 failed with state FAILED due to: Application application_1394710790246_0003 failed 2 times due to AM Container for appattempt_1394710790246_0003_000002 exited with exitCode: 1 due to: Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException: /bin/bash: line 0: fg: no job control at org.apache.hadoop.util.Shell.runCommand(Shell.java:464) at org.apache.hadoop.util.Shell.run(Shell.java:379) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:589) at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:283) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:79) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)
上网找答案,发现是Hadoop本身的问题。
https://issues.apache.org/jira/browse/YARN-1298
https://issues.apache.org/jira/browse/MAPREDUCE-5655。
五. 自己编译Hadoop2.2
- 下载Hadoop2.2源码http://apache.fayea.com/apache-mirror/hadoop/common/hadoop-2.2.0/hadoop-2.2.0-src.tar.gz
- 下载https://issues.apache.org/jira/i#browse/MAPREDUCE-5655两个patch
- 下载https://issues.apache.org/jira/i#browse/HADOOP-10110这个patch
- patch指令。patch -p0 < MRApps.patch。p0的0代表进去层次。不会的参考http://hi.baidu.com/thinkinginlamp/item/0ba1d051319b5ac09e2667f8
- 然后按照http://my.oschina.net/yiyuqiuchi/blog/188510去编译。hadoop-2.2.0-src/hadoop-dist/targethadoop-2.2.0.tar.gz就是编译好的。
给两张patch前后的对照图
下图左边为patch前Hadoop源码
下图左边为patch成功后Hadoop源码
六. 使用自己编译的包
- 检查看看patch是否被打包进去了。通过查看MRApps.class字节码得知已经被打包进去。通过查看YARNRunner.class字节码也是正确的,我在YARNRunner.java里面设置了一个PATCH_TEST编译时常量,"zy19982004"的字节码已经被内嵌到class的字节码里。
- 替换集群Jar,因为上述三个patch只涉及到两个Jar,另外一个pacth是修改pom文件并且是scope test,可以不管。用hadoop-2.2.0\share\hadoop\mapreduce\hadoop-mapreduce-client-common-2.2.0.jar(MRApps.patch)替换集群下的对应jar,用hadoop-2.2.0\share\hadoop\mapreduce\hadoop-mapreduce-client-jobclient-2.2.0.jar(YARNRunner.patch)替换集群下的对应jar。
- 修改windows环境下的mapred-site.xml,添加
<property> <name>mapred.remote.os</name> <value>Linux</value> <description>Remote MapReduce framework's OS, can be either Linux or Windows</description> </property>
- 重启集群,这个错误已经没有了,但出现了另外的错误。
Application application_1396339724108_0014 failed 2 times due to AM Container for appattempt_1396339724108_0014_000002 exited with exitCode: 1 due to: Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException: 2014-04-01 19:50:36,731 INFO org.apache.hadoop.yarn.server.resourcemanager.amlauncher.AMLauncher: Command to launch container container_1396351641800_0005_02_000001 : $JAVA_HOME/bin/java -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=<LOG_DIR> -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster 1><LOG_DIR>/stdout 2><LOG_DIR>/stderr
然后1) Add such config property to your mapred-site.xml (client side only): <property> <name>mapreduce.application.classpath</name> <value> $HADOOP_CONF_DIR, $HADOOP_COMMON_HOME/share/hadoop/common/*, $HADOOP_COMMON_HOME/share/hadoop/common/lib/*, $HADOOP_HDFS_HOME/share/hadoop/hdfs/*, $HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*, $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*, $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*, $HADOOP_YARN_HOME/share/hadoop/yarn/*, $HADOOP_YARN_HOME/share/hadoop/yarn/lib/* </value> </property>
终于成功了。。。
七. 不使用hadoop eclispe plugin的场景
自己调试Hadoop源码的时候,Debug As Java Application即可。前面两篇博客解决错误都是通过debug源码来解决的。
八. 总结
Window向Linux Hadoop提交作业的方法
- 配置好hadoop eclipse plugin。
- Job配置文件里mapreduce.framework.name为yarn。其它配置也需要正确。
- Run On Hadoop
Run As Application其实也可以提交Job,依赖于上一次Run on Hadoop过程中产生的jar,这为我们debug提供了一种思路。
相关推荐
4. **运行Job**:配置好MapReduce作业后,提交到Hadoop集群进行执行。集群会自动调度任务,将工作分配给各个节点。 5. **结果收集**:MapReduce完成后,最终的词频统计结果会被写入HDFS,可以进一步进行可视化或...
在Windows环境下,使用Eclipse开发MapReduce程序时,必须确保所有必要的Hadoop库都被正确引入。这是因为MapReduce是Hadoop生态系统中的核心组件,用于处理分布式计算任务。以下是一些关于如何在Eclipse中配置和使用...
### Hadoop MapReduce任务提交与执行流程解析 #### 一、客户端提交任务 在Hadoop MapReduce框架中,客户端的任务提交是整个MapReduce作业启动的关键步骤。这一过程主要由`JobClient`类中的`runJob(JobConf job)`...
在Hadoop MapReduce框架中,Job的提交过程是整个分布式计算流程中的关键步骤。这个过程涉及到客户端、JobTracker(在Hadoop 2.x版本中被ResourceManager替代)和TaskTracker(在Hadoop 2.x版本中被NodeManager替代)...
### Hadoop概述与环境搭建详解 #### 一、Hadoop简介 Hadoop是一个开源软件框架,主要用于处理大规模数据集(GB到PB级别)的分布式计算。它最初由Apache基金会开发,现已成为大数据处理领域的基石之一。Hadoop的核心...
总结来说,"hadoop eclipse mapreduce下开发所有需要用到的JAR包"涉及到的是Hadoop MapReduce开发的环境配置,确保正确导入所有必要的依赖库,以便在Eclipse中编写、测试和运行MapReduce程序。这些JAR包是Hadoop生态...
4. Job Submission and Monitoring:负责提交作业到集群并提供监控作业执行过程的功能。 5. Job Input:处理作业的输入数据,通常是读取HDFS中的数据。 6. Job Output:处理作业的输出数据,通常是将结果写回到HDFS...
根据提供的文件信息,本文将详细解析Hadoop 2.x集群的搭建步骤以及遇到的问题,特别是针对MapReduce提交Job执行失败的情况进行分析。 ### Hadoop 2.x 集群搭建 #### 一、前期准备 在搭建Hadoop 2.x集群之前,我们...
在大数据处理领域,Hadoop MapReduce 是一个至关重要的框架,用于分布式处理海量数据。通过优化 MapReduce Job 的配置和设计,可以显著提升处理效率。以下是一些关键知识点,旨在帮助你提升 Hadoop MapReduce Job 的...
Eclipse与Hadoop的集成使得开发者可以在本地环境中编写、测试和调试MapReduce作业,然后再将其部署到Hadoop集群上运行。 要开始在Eclipse中开发MapReduce项目,首先你需要安装以下关键的JAR包,这些包提供了Hadoop ...
此外,还需要配置Job参数,如输入路径、输出路径、Mapper和Reducer类等,并提交Job到Hadoop集群执行。 压缩包中的"tfidf"文件可能是包含源代码、测试数据或者运行结果的文件。源代码可能包含了Mapper和Reducer的...
【Hadoop实战视频教程】是针对大数据处理领域的一款专业学习资源,主要涵盖了Hadoop的各个方面,包括环境搭建、核心组件的使用以及实际案例的应用。这个教程不仅提供了视频讲解,还包含有配套的环境搭建文件,使得...
10. **配置MapReduce参数**:编辑`mapred-site.xml`,设置JobTracker地址和端口,集群模式下需改为其他节点IP: ``` <name>mapred.job.tracker <value>localhost:9001 ``` 11. **格式化NameNode**:启动...
在大数据处理领域,Hadoop MapReduce 是一个至关重要的框架,它允许开发者编写分布式应用程序来处理海量数据。"Hadoop MapReduce HelloWorld 能调试" 的主题意味着我们将深入理解如何设置、运行以及调试 MapReduce ...
通过Hadoop的`Job`类和相关输入输出格式类,可以设置这些参数并提交作业到Hadoop集群执行。 总结起来,这个实验不仅介绍了MapReduce的基本概念,还展示了如何用Java实现MapReduce任务,以解决实际问题。通过这种...
本笔记将从环境搭建、HDFS配置、YARN配置、分布式配置到MapReduce编程,全方位介绍Hadoop的学习过程,并结合JavaWeb项目实践,帮助读者深入理解Hadoop的工作原理和应用。 ### 一、环境搭建 在开始Hadoop的学习之前...
文中没有详细说明如何运行作业,但在Hadoop MapReduce中,一般通过Hadoop命令行工具来提交作业,命令通常类似于“hadoop jar wc3.jar”。 整个过程大致如下: 1. 搭建Hadoop环境(以CDH5为基础)。 2. 编写或获取...
在Windows环境下,使用Eclipse进行Hadoop 2.2.0分布式集群的调试是一项重要的技能,这可以帮助开发者更好地理解和优化Hadoop程序。以下是一些关键的知识点,将指导你完成这个过程。 首先,Hadoop是一个开源的分布式...
在Java编程环境中,访问Hadoop集群是一项常见的任务,特别是在大数据处理和分析的场景下。Hadoop是一个开源框架,主要用于存储和处理大规模数据集。本文将深入探讨如何利用Java API来与Hadoop集群进行交互,包括读取...