最近学习Hadoop,遇到一个问题,在eclipse中写完MapReduce之后如何在Hadoop中运行呢,常见的做法是将程序打成一个Jar包,然后传到hadoop集群中,通过命令行$HADOOP_HOME/bin/hadoop jar命令来运行,但是每次都要这样,十分麻烦。
当然,也可以在eclipse中安装hadoop的插件,可以方便的run on hadoop来运行。但是我们可以看到,client端的代码常见形式是在main方法中创建Configuration对象和job对象,具体代码如下
Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if(otherArgs.length!=2){ System.err.println("Usage: wordcount <in> <out>"); System.exit(2); } Job job = new Job(conf,"combiner_test_job"); job.setJarByClass(CombinerTest.class); job.setMapperClass(CombinerTestMapper.class); job.setReducerClass(CombinerTestReducer.class); job.setCombinerClass(CombinerTestReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1);
,既然有main方法,我们能不能作为普通的java application来运行呢?试过之后我们很有可能会得到一个IOException,
- java.io.IOException: Failed to set permissions of path: \XX..XX\.staging to 0700
这个问题在我的另一篇blog中有说明,想进一步了解的点这里。解决了这个问题之后,应该就可以运行啦,好像这样问题就解决啦。但是,如果深入分析为什么为得到这个错误,我们会发现之前成功的运行job其实是在本机中运行的,也就是hadoop的local模式,job并没有在集群中的hadoop上运行,充其量也只是使用了一下HDFS。因为我们没有设置mapred.job.tracker,默认就是local。待我们将该属性设置为集群对应的值后,再运行,我们会发现,还是有错误。这次应该会得到一个ClassNotFoundException,其实是Mapper或者Reducer的类找不到。
为什么会找不到类呢?带着这个疑问,在网上查找一番,终于有所收获,大家可以看一下这篇文章,挺不错的,按照作者的分析,问题出在setJarByClass这个方法里面,其实最终调用的是JobConf类中的setJarByClass方法,该方法代码如下
public void setJarByClass(Class cls) { String jar = findContainingJar(cls); if (jar != null) { setJar(jar); } }
首先,该方法会通过参数中的class查找对应的Jar文件,在命令行运行的情况下,是可以找到的,因为我们是将程序打好jar包之后调用hadoop jar来执行的,但是默认情况下,该jar肯定是不存在的,这样,就不会调用下面的setJar方法,所以程序中使用到的class就找不到了。知道了原因,我们只要将包含Mapper和Reducer以及其他类的Jar包通过setJar方法设置一下,就可以啦。
但是默认情况下,jar包是不存在的,我们可以在程序中通过代码实现将class打jar包,然后再进行设置。这里参考网上的资料,写了一个JarUtil类
package com.shidan.hadoop.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; public class JarUtil{ public static void jar(String inputFileName, String outputFileName){ JarOutputStream out = null; try{ out = new JarOutputStream(new FileOutputStream(outputFileName)); File f = new File(inputFileName); jar(out, f, ""); }catch (Exception e){ e.printStackTrace(); }finally{ try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } private static void jar(JarOutputStream out, File f, String base) throws Exception { if (f.isDirectory()) { File[] fl = f.listFiles(); base = base.length() == 0 ? "" : base + "/"; // 注意,这里用左斜杠 for (int i = 0; i < fl.length; i++) { jar(out, fl[ i], base + fl[ i].getName()); } } else { out.putNextEntry(new JarEntry(base)); FileInputStream in = new FileInputStream(f); byte[] buffer = new byte[1024]; int n = in.read(buffer); while (n != -1) { out.write(buffer, 0, n); n = in.read(buffer); } in.close(); } } }
该类可以将指定的目录下的文件jar成一个jar包,所以我们只需要将class文件所在的目录作为inputFileName传递给jar方法,并指定输出的jar包的名称作为outputFileName。具体使用参考下面的代码
JarUtil.jar(CombinerTest.class.getClassLoader().getResource("").getFile(), "CombinerTest.jar"); System.out.println(new File("CombinerTest.jar").getAbsolutePath()); Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if(otherArgs.length!=2){ System.err.println("Usage: wordcount <in> <out>"); System.exit(2); } conf.set("mapred.job.tracker", "192.168.15.130:9001"); Job job = new Job(conf,"combiner_test_job"); job.setJarByClass(CombinerTest.class); ((JobConf)job.getConfiguration()).setJar("CombinerTest.jar"); job.setMapperClass(CombinerTestMapper.class);
上面的CombinerTest类其实就是这段代码所在的类,192.168.15.130:9001是hadoop集群的jobtracker。需要注意的是,setJar方法是JobConf中的才有的,需要将Configuration类强制转换为JobConf后才能调用。经过这样的一番操作后,就可以直接运行main方法,Job就会在你所指定的hadoop集群中运行啦。
另外,我在之前的一片文章中解决
- java.io.IOException: Failed to set permissions of path: \XX..XX\.staging to 0700
这个问题的后,还对run on hadoop 和run as application运行job的区别有所疑问。其实,hadoop插件会将项目中的类和资源文件自动打包,这样就可以直接run on hadoop运行啦,其实做的工作就相当于我们上面写的代码。
相关推荐
为了测试你的MapReduce程序,你可以使用Eclipse的Run As -> Run Configurations菜单创建一个新的Hadoop Job配置。在这里,指定你的主类(MapReduce程序的入口点),以及输入和输出目录。一旦配置完毕,点击运行,...
在Windows环境下,开发基于Hadoop的Java应用程序通常需要一个集成开发环境(IDE),Eclipse是其中常用的一个。本文将详细讲解如何使用Eclipse与Hadoop 2.2.0插件进行连接,以便于在Windows操作系统上进行Hadoop相关...
【构建Windows上的Hadoop+Eclipse开发环境】 在Windows操作系统上搭建Hadoop与Eclipse的集成开发环境是开发Hadoop应用程序的基础步骤。以下是一份详细的指南,涵盖了从安装JDK、Cygwin到配置Hadoop环境以及安装...
6. **运行与调试**:使用Maven构建项目后,可以通过Eclipse的`Run As`菜单选择`Hadoop Job`来运行Hadoop程序。在调试时,可以设置断点并使用`Debug As`选项进行调试。 7. **hadoop01**:这可能是示例代码中包含的一...
Eclipse 配置 Hadoop 及 MapReduce 开发指南 一、Eclipse 中配置 Hadoop 插件 配置 Hadoop 插件是使用 Eclipse 进行 MapReduce 开发的第一步。首先,需要安装 Eclipse 3.3.2 和 Hadoop 0.20.2-eclipse-plugin.jar ...
这个插件使得开发者可以直接在Eclipse中创建、管理和运行Hadoop作业。文件`hadoop-eclipse-plugin.jar`就是这个插件的实现,它可以将Hadoop的功能集成到Eclipse中。安装步骤如下: 1. 将`hadoop-eclipse-plugin.jar...
4. **编写和运行MapReduce程序**:使用Eclipse创建Java项目,编写MapReduce代码,并使用Eclipse的Run As > Hadoop Job选项直接在Hadoop集群上运行。 5. **调试和日志查看**:Eclipse还可以帮助调试MapReduce程序,...
4. 使用插件:现在你可以通过Eclipse的“File” > “New” > “Job”等选项创建和管理Hadoop MapReduce作业了。 关于`hadoop运行案例`,这可能是提供的一些示例代码或者教程,用于展示如何在Eclipse中使用Hadoop...
你可以通过"Run As" -> "Hadoop Job"运行一个简单的MapReduce程序进行测试,比如WordCount。 - "单机测试 Hadoop.txt"可能是记录此类测试过程的文档,可以参照其中的步骤来检查配置是否正确。 5. **编写和调试...
在Windows上搭建Hadoop+Eclipse开发环境是一项重要的工作,它涉及到多个步骤,包括JDK、Cygwin、SSHD服务、Hadoop的安装与配置,以及Eclipse插件的安装。以下是对这些步骤的详细说明: 1. **安装JDK**:首先需要...
10. **运行和调试**: 在Eclipse中可以直接运行和调试Hadoop程序,通过Eclipse的Run As菜单选择Map/Reduce Job。 **二、Windows环境下配置Eclipse开发Hadoop** 1. **安装Java**: Windows上同样需要Java环境,下载并...
- Advance Parameters中的`hadoop.job.ugi`设置为`hadoop,Tardis`(如果Eclipse运行用户的名称与集群用户一致,则无需修改此设置)。 ##### 8. 在Eclipse中浏览Hadoop DFS目录 - 完成以上步骤后,可以在Eclipse中...
- **运行配置**:可以直接在Eclipse内提交作业到Hadoop集群,无需手动执行命令行操作。 - **资源管理**:显示Hadoop集群的状态,包括节点、任务和作业信息。 - **依赖管理**:帮助管理项目中的Hadoop库和其他相关...
这个插件是专门为Eclipse设计的,使得开发者可以直接在Eclipse环境中操作Hadoop集群,包括浏览HDFS文件系统、创建和运行MapReduce任务,大大简化了开发流程。 安装此插件的方法通常是将jar文件放入Eclipse的plugins...
在“Run Configurations”中,配置Hadoop Job运行参数,包括输入路径、输出路径、Job配置等。启动调试后,Eclipse会将JAR文件提交到Hadoop集群,并在遇到断点时暂停执行。 7. **远程调试**: 对于分布式集群,你...
在安装了Hadoop插件之后,开发者可以在Eclipse中直接通过右键点击项目,选择“New -> Map/Reduce Job”,创建一个新的MapReduce作业。在这里,你可以编写Map和Reduce函数,设置输入和输出路径,以及配置其他的Hadoop...
4. **运行和调试Hadoop程序**:Eclipse插件提供了运行和调试MapReduce程序的功能。在项目中右键选择"Run As" -> "Map/Reduce Job",设置输入输出路径和其他参数,然后点击"Run"。Eclipse会自动提交任务到Hadoop集群...
在Eclipse中,开发者首先需要安装Hadoop插件,如Hadoop-Eclipse-Plugin,以便可以直接在IDE中创建、运行和调试Hadoop作业。MyWordCount的源代码通常会包含两个Java类:`Mapper.java`和`Reducer.java`,分别对应Map和...
5. **编写MapReduce程序**: 使用Eclipse编写Java代码实现MapReduce任务,然后右键点击项目,选择`Run As` -> `Hadoop Job`来提交作业到远程Hadoop集群。 6. **监控作业状态**: 插件还会在Eclipse的`Progress`视图中...
Hadoop是一个分布式文件系统,而Eclipse则是一款强大的Java集成开发环境,通过Hadoop Eclipse插件,可以在Eclipse中直接编写、调试和运行Hadoop MapReduce程序,极大地提高了开发效率。 首先,选择合适的软件版本至...