`
jandyfish
  • 浏览: 15989 次
社区版块
存档分类
最新评论

远程提交mapreduce到hadoop集群

阅读更多
    从13年初,开始搞hadoop的时候,是采用hadoop-eclipse插件来进行开发mapreduce,发现使用这个插件,其实也就是把相关的jar,class文件提交到远程的hadoop集群。
    而实际上要部署应用的时候,如果不在远程提交,就得把任务代码打包成JAR,ftp到集群机器上进行执行。当然也可以在一个client机器上部署一套hadoop环境,把任务JAR放在这里,再提交到JobTracker。
    对于想在web应用中触发远程mapreduce任务(或者是本地java应用触发远程mapreduce任务),就比较麻烦,上述插件方式/打包JAR后ftp也并不可取。
    我实现了一个Util类,主要功能就是根据class寻找到相应的jar包,并把相应的jar路径添加到Configration中。而这样的话就摆脱了使用hadoop-eclipse插件进行开发,也方便应用集成远程mapreduce服务,适用于MR代码打包成独立JAR的情况。
    ConfigurationUtil 工具类实现如下:
   
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.springframework.context.MessageSource;

public class ConfigurationUtil {
	private static Map<MessageSource,Configuration> confs;
	private static final String DEFAULT_MAPRED_JOB_TRACKER="xxxxxx";
	private static final String DEFAULT_FS_NAME = "xxxxxxx";
	private static final String DEFAULT_REMOTE_USER = "xxxxxxx";
	
	static{
		confs = new HashMap<MessageSource,Configuration>();
	}
	/**
	 * 获取默认的hadoop用户默认配置
	 * @return
	 */
	public static Configuration getDefaultConfiguration(MessageSource messageSource){
		if(!confs.containsKey(messageSource)){
			synchronized(ConfigurationUtil.class){
				if(!confs.containsKey(messageSource)){
					confs.put(messageSource, getTempConfiguration(messageSource));
				}
			}
		}
	    return confs.get(messageSource);
	}
	/**
	 * 获取默认的hadoop用户临时配置
	 * @return
	 */
	public static Configuration getTempConfiguration(MessageSource messageSource){
		Configuration temp = new Configuration();
		temp.set("mapred.job.tracker", messageSource.getMessage("mapred.job.tracker", null, DEFAULT_MAPRED_JOB_TRACKER, null));
		temp.set("fs.default.name", messageSource.getMessage("fs.default.name", null, DEFAULT_FS_NAME, null));
		temp.set("user", messageSource.getMessage("remote.hadoop.user", null, DEFAULT_REMOTE_USER, null));
		return temp;
	}
	
	/**
	 * 设置userClass所在的jar
	 * @param userClass mr依赖的class
	 * @return
	 * @throws IOException
	 */
	public static Configuration getTempConfiguration(Class[] userClass,MessageSource messageSource) throws IOException{
		Configuration temp = getTempConfiguration(messageSource);
		for(Class c : userClass){
			addTmpJar(c,temp);
		}
		return temp;
	}
	/**
	 * 添加jar包
	 * @param jarPath
	 * @param conf
	 * @throws IOException
	 */
	protected static void addTmpJar(String jarPath, Configuration conf) throws IOException {  
	    System.setProperty("path.separator", ":");  
	    FileSystem fs = FileSystem.getLocal(conf);  
	    String newJarPath = new Path(jarPath).makeQualified(fs).toString();  
	    String tmpjars = conf.get("tmpjars");  
	    if (tmpjars == null || tmpjars.length() == 0) {  
	        conf.set("tmpjars", newJarPath);  
	    } else if(!(","+tmpjars).contains(","+newJarPath)){
	        conf.set("tmpjars", tmpjars + "," + newJarPath);  
	    }  
	}
	/**
	 * 根据class添加JAR
	 * @param cls
	 * @param conf
	 * @throws IOException
	 */
	protected static void addTmpJar(Class cls, Configuration conf) throws IOException {  
		addTmpJar(findContainingJar(cls),conf);
	}
	
	protected static String findContainingJar(Class cls) {
	    ClassLoader loader = cls.getClassLoader();
	    String class_file = cls.getName().replaceAll("\\.", "/") + ".class";
	    try {
	      for(Enumeration itr = loader.getResources(class_file);
	          itr.hasMoreElements();) {
	        URL url = (URL) itr.nextElement();
	        if ("jar".equals(url.getProtocol())) {
	          String toReturn = url.getPath();
	          if (toReturn.startsWith("file:")) {
	            toReturn = toReturn.substring("file:".length());
	          }
	          toReturn = URLDecoder.decode(toReturn, "UTF-8");
	          return toReturn.replaceAll("!.*$", "");
	        }
	      }
	    } catch (IOException e) {
	      throw new RuntimeException(e);
	    }
	    return null;
	 }
}
    


    使用此工具类,如下所示:
    
      Configuration conf = ConfigurationUtil.getTempConfiguration(new Class[]{ConfigurationUtil.class,Mapreduce.class},messageSource);
      Job job = new Job(conf, 'job-name');
      .
      .
      .
      job.waitForCompletion(true);
     

     如此,在此处需要依赖hadoop-core.jar包,我是用maven管理工程,所以把hadoop-core安装到了maven仓库进行使用。
     这样集成后,就可以在web/java项目中,自定义mapreduce任务,并远程提交到hadoop集群进行操作。
     时隔一年,整理一下文档,把这个分享出来。另外一种方式就是可以使用api把jar添加到distributcache。不过觉得没有这种方式方便。
    
分享到:
评论

相关推荐

    Hadoop集群搭建部署与MapReduce程序关键点个性化开发.doc

    总的来说,搭建Hadoop集群和开发MapReduce程序是一个系统性的工程,涉及到操作系统管理、网络配置、Java编程以及大数据处理原理。对于初学者来说,遵循详尽的步骤和代码示例是非常有益的,而逐步熟悉并理解这些过程...

    myEclipse10.0与hadoop集群远程连接

    在IT行业中,myEclipse10.0是一款广泛使用的Java集成开发环境,它为开发者提供了丰富的功能,包括...通过正确配置myEclipse、Hadoop集群以及编写MapReduce代码,开发者可以在本地环境中高效地管理远程大数据处理任务。

    利用ansible 自动 安装Hadoop 集群

    Hadoop作为大数据处理的核心组件,包括HDFS(Hadoop Distributed File System)和MapReduce等模块,构建一个Hadoop集群通常涉及多台服务器的配置、软件安装、服务启动和集群配置。通过Ansible,我们可以简化这个过程...

    大数据教程之搭建Hadoop集群.zip_大数据环境搭建hadoop

    3. "细细品味Hadoop_Hadoop集群(第4期)_SecureCRT使用.pdf":SecureCRT是一款远程终端工具,用于SSH连接,文件可能教读者如何使用SecureCRT来管理Hadoop集群中的节点。 4. "细细品味Hadoop_Hadoop集群(第5期)_...

    Windows下Eclispe远程开发Mapreduce程序

    用户可以在Eclipse中创建新的MapReduce项目,编写Mapper和Reducer代码,然后通过Eclipse的Map/Reduce透视图进行调试和运行,直接与远程的Hadoop集群进行交互。 总的来说,Windows下使用Eclipse远程开发MapReduce...

    Hadoop集群配置及MapReduce开发手册

    ### Hadoop集群配置及MapReduce开发相关知识点 #### 一、Hadoop集群配置说明 **1.1 环境说明** 本章节介绍了Hadoop集群的环境配置信息,包括操作系统的选择、硬件要求以及软件版本等关键要素。 - **操作系统**: ...

    pc机连接集群的HADOOP_HOME

    对于标签中的“客户端”,在Hadoop中,客户端是指运行在用户机器上的程序,它们可以访问Hadoop集群,执行读写操作,提交MapReduce作业等。这些客户端程序依赖于`HADOOP_HOME`环境变量来找到必要的库和配置。 至于...

    hadoop2.6(x64)Win7上远程调试hadoop 集群

    在Windows 7环境下配置和远程调试Hadoop集群是一项挑战,但通过正确的方法和步骤,可以成功实现这一目标。以下是关于这个主题的详细知识: 1. **Hadoop简介**: Hadoop是由Apache基金会维护的一个分布式计算框架,...

    【大数据入门笔记系列】第五节 SpringBoot集成hadoop开发环境(复杂版的WordCount)

    SpringBoot集成hadoop开发环境(复杂版的WordCount)前言环境清单创建SpringBoot项目创建包创建yml添加集群主机名映射hadoop配置文件环境变量HADOOP_HOME编写代码添加hadoop依赖jar包编译项目造数据IDEA远程提交...

    linux下Hadoop集群环境搭建

    在Linux环境下搭建Hadoop集群是一项复杂但至关重要的任务,它为大数据处理提供了强大的分布式平台。以下将详细介绍如何在一台虚拟机上安装多台Linux服务节点,并构建Hadoop集群环境。 首先,我们需要准备一个基础...

    大数据时代:高性能Hadoop集群与应用案例

    ### 大数据时代:高性能Hadoop集群与应用案例 #### 一、Hadoop概述与重要性 随着信息技术的快速发展,数据量呈爆炸性增长趋势,这不仅为数据分析带来了前所未有的机遇,同时也对数据处理能力提出了更高要求。...

    基于centos的大数据hadoop集群搭建说明文档

    将程序提交到集群,观察运行结果,确保Hadoop集群可以正确处理数据。 总结,搭建Hadoop集群是一个涉及多步骤的过程,涉及到网络配置、软件安装、环境变量设置等多个环节。遵循上述步骤,即使是初学者也能成功搭建出...

    远程调用执行Hadoop Map/Reduce

    通过以上介绍,我们可以看到,远程调用执行Hadoop Map/Reduce涵盖了从编写MapReduce程序到提交、监控和管理作业的全过程。理解和掌握这一过程对于开发和优化大数据处理应用至关重要。在实际项目中,开发者可以根据...

    LinuxRedHat、CentOS上搭建Hadoop集群.pdf

    3. 完全分布式模式:有实际意义的Hadoop集群,其规模可从几个节点的小集群到几千个节点的超大集群。 二、实验环境操作系统 实验环境操作系统为RedHat Enterprise Linux 5.6,使用三个节点:clovem001、clovem002和...

    window下eclipse中运行mapreduce程序所需要的Hadoop全部jar包

    7. **提交作业**:如果你的集群是远程的,你可以选择提交作业到集群。这需要配置Eclipse的“远程运行配置”,指定Hadoop集群的地址、用户名和密码。 8. **日志和调试**:使用Hadoop的JobHistory Server查看作业的...

    hadoop集群eclipse安装配置共30页.pdf.z

    6. **调试与运行**: 在Eclipse中可以直接运行和调试MapReduce程序,插件会将程序提交到Hadoop集群上执行,同时提供调试选项,如设置断点,查看变量值等。 7. **监控与日志查看**: 通过Eclipse可以监控Job的执行状态...

    基于Linux的Hadoop集群搭建的探索与实现.docx

    Linux提供了命令行工具,如SSH用于远程登录,FTP或SCP进行文件传输,以及各种文件管理、网络配置和系统监控命令,为Hadoop集群的搭建和管理提供了便利。 五、Linux环境下的Hadoop集群搭建 1. 安装Java环境:Hadoop...

    hadoop集群配置详解

    在这个详解中,我们将深入理解如何在Fedora和Ubuntu系统上搭建一个Hadoop集群。 首先,为了确保集群中的节点能够相互识别,我们需要配置静态IP地址。在Ubuntu系统中,可以通过图形界面进行配置,而在Fedora系统中,...

    Hadoop集群命令

    根据提供的文件标题、描述、标签以及部分内容,我们可以总结出与Hadoop集群命令相关的知识点: ### Hadoop集群命令 #### 概述 Hadoop是一个能够处理大量数据的分布式系统基础架构,它通过提供高可靠性、高效性和可...

Global site tag (gtag.js) - Google Analytics