`
shidan66
  • 浏览: 65416 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

windows+eclipse运行Hadoop Job

 
阅读更多

        最近学习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, 

  1. 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集群中运行啦。

 

        另外,我在之前的一片文章中解决 

  1. 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运行啦,其实做的工作就相当于我们上面写的代码。

分享到:
评论

相关推荐

    Cygwin+Eclipse搭建Hadoop单机开发环境-1

    为了测试你的MapReduce程序,你可以使用Eclipse的Run As -&gt; Run Configurations菜单创建一个新的Hadoop Job配置。在这里,指定你的主类(MapReduce程序的入口点),以及输入和输出目录。一旦配置完毕,点击运行,...

    windows下连接hadoop2.2.0的eclipse+hadoop插件

    在Windows环境下,开发基于Hadoop的Java应用程序通常需要一个集成开发环境(IDE),Eclipse是其中常用的一个。本文将详细讲解如何使用Eclipse与Hadoop 2.2.0插件进行连接,以便于在Windows操作系统上进行Hadoop相关...

    windows上建立hadoop+eclipse开发环境

    【构建Windows上的Hadoop+Eclipse开发环境】 在Windows操作系统上搭建Hadoop与Eclipse的集成开发环境是开发Hadoop应用程序的基础步骤。以下是一份详细的指南,涵盖了从安装JDK、Cygwin到配置Hadoop环境以及安装...

    eclipse+maven+hadoop+文件增删改查

    6. **运行与调试**:使用Maven构建项目后,可以通过Eclipse的`Run As`菜单选择`Hadoop Job`来运行Hadoop程序。在调试时,可以设置断点并使用`Debug As`选项进行调试。 7. **hadoop01**:这可能是示例代码中包含的一...

    eclipse配置hadoop

    Eclipse 配置 Hadoop 及 MapReduce 开发指南 一、Eclipse 中配置 Hadoop 插件 配置 Hadoop 插件是使用 Eclipse 进行 MapReduce 开发的第一步。首先,需要安装 Eclipse 3.3.2 和 Hadoop 0.20.2-eclipse-plugin.jar ...

    hadoop-eclipse-2.75插件 centos6.5 +eclipse编译

    这个插件使得开发者可以直接在Eclipse中创建、管理和运行Hadoop作业。文件`hadoop-eclipse-plugin.jar`就是这个插件的实现,它可以将Hadoop的功能集成到Eclipse中。安装步骤如下: 1. 将`hadoop-eclipse-plugin.jar...

    hadoop-2.6.5 + eclipse附配置hdfs相关文件.zip

    4. **编写和运行MapReduce程序**:使用Eclipse创建Java项目,编写MapReduce代码,并使用Eclipse的Run As &gt; Hadoop Job选项直接在Hadoop集群上运行。 5. **调试和日志查看**:Eclipse还可以帮助调试MapReduce程序,...

    eclipse连接hadoop所需要的hadoop.ddl和eclipse插件和hadoop运行案例

    4. 使用插件:现在你可以通过Eclipse的“File” &gt; “New” &gt; “Job”等选项创建和管理Hadoop MapReduce作业了。 关于`hadoop运行案例`,这可能是提供的一些示例代码或者教程,用于展示如何在Eclipse中使用Hadoop...

    配置Eclipse连接Hadoop

    你可以通过"Run As" -&gt; "Hadoop Job"运行一个简单的MapReduce程序进行测试,比如WordCount。 - "单机测试 Hadoop.txt"可能是记录此类测试过程的文档,可以参照其中的步骤来检查配置是否正确。 5. **编写和调试...

    在windows上建立hadoop+eclipse开发环境

    在Windows上搭建Hadoop+Eclipse开发环境是一项重要的工作,它涉及到多个步骤,包括JDK、Cygwin、SSHD服务、Hadoop的安装与配置,以及Eclipse插件的安装。以下是对这些步骤的详细说明: 1. **安装JDK**:首先需要...

    Linux和Win下配置eclipse开发hadoop

    10. **运行和调试**: 在Eclipse中可以直接运行和调试Hadoop程序,通过Eclipse的Run As菜单选择Map/Reduce Job。 **二、Windows环境下配置Eclipse开发Hadoop** 1. **安装Java**: Windows上同样需要Java环境,下载并...

    Eclipse+Hadoop环境配置

    - Advance Parameters中的`hadoop.job.ugi`设置为`hadoop,Tardis`(如果Eclipse运行用户的名称与集群用户一致,则无需修改此设置)。 ##### 8. 在Eclipse中浏览Hadoop DFS目录 - 完成以上步骤后,可以在Eclipse中...

    eclipse hadoop2 插件

    - **运行配置**:可以直接在Eclipse内提交作业到Hadoop集群,无需手动执行命令行操作。 - **资源管理**:显示Hadoop集群的状态,包括节点、任务和作业信息。 - **依赖管理**:帮助管理项目中的Hadoop库和其他相关...

    eclipse+hadoop.zip

    这个插件是专门为Eclipse设计的,使得开发者可以直接在Eclipse环境中操作Hadoop集群,包括浏览HDFS文件系统、创建和运行MapReduce任务,大大简化了开发流程。 安装此插件的方法通常是将jar文件放入Eclipse的plugins...

    如何在Windows下的eclipse调试Hadoop2.2.0分布式集群

    在“Run Configurations”中,配置Hadoop Job运行参数,包括输入路径、输出路径、Job配置等。启动调试后,Eclipse会将JAR文件提交到Hadoop集群,并在遇到断点时暂停执行。 7. **远程调试**: 对于分布式集群,你...

    eclipse的hadoop2.7插件以及hadoop-common编译文件

    在安装了Hadoop插件之后,开发者可以在Eclipse中直接通过右键点击项目,选择“New -&gt; Map/Reduce Job”,创建一个新的MapReduce作业。在这里,你可以编写Map和Reduce函数,设置输入和输出路径,以及配置其他的Hadoop...

    Eclipse开发Hadoop相关项目本地配置插件

    4. **运行和调试Hadoop程序**:Eclipse插件提供了运行和调试MapReduce程序的功能。在项目中右键选择"Run As" -&gt; "Map/Reduce Job",设置输入输出路径和其他参数,然后点击"Run"。Eclipse会自动提交任务到Hadoop集群...

    eclipse hadoop 例子源代码

    在Eclipse中,开发者首先需要安装Hadoop插件,如Hadoop-Eclipse-Plugin,以便可以直接在IDE中创建、运行和调试Hadoop作业。MyWordCount的源代码通常会包含两个Java类:`Mapper.java`和`Reducer.java`,分别对应Map和...

    eclipse运行mr插件hadoop-eclipse-plugin-2.6.0.jar

    5. **编写MapReduce程序**: 使用Eclipse编写Java代码实现MapReduce任务,然后右键点击项目,选择`Run As` -&gt; `Hadoop Job`来提交作业到远程Hadoop集群。 6. **监控作业状态**: 插件还会在Eclipse的`Progress`视图中...

    eclipse3.3+hadoop-0.20.0+hadoop-0.20.0-eclipse-plugin环境成功搭建.docx

    Hadoop是一个分布式文件系统,而Eclipse则是一款强大的Java集成开发环境,通过Hadoop Eclipse插件,可以在Eclipse中直接编写、调试和运行Hadoop MapReduce程序,极大地提高了开发效率。 首先,选择合适的软件版本至...

Global site tag (gtag.js) - Google Analytics