从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程序是一个系统性的工程,涉及到操作系统管理、网络配置、Java编程以及大数据处理原理。对于初学者来说,遵循详尽的步骤和代码示例是非常有益的,而逐步熟悉并理解这些过程...
在IT行业中,myEclipse10.0是一款广泛使用的Java集成开发环境,它为开发者提供了丰富的功能,包括...通过正确配置myEclipse、Hadoop集群以及编写MapReduce代码,开发者可以在本地环境中高效地管理远程大数据处理任务。
Hadoop作为大数据处理的核心组件,包括HDFS(Hadoop Distributed File System)和MapReduce等模块,构建一个Hadoop集群通常涉及多台服务器的配置、软件安装、服务启动和集群配置。通过Ansible,我们可以简化这个过程...
3. "细细品味Hadoop_Hadoop集群(第4期)_SecureCRT使用.pdf":SecureCRT是一款远程终端工具,用于SSH连接,文件可能教读者如何使用SecureCRT来管理Hadoop集群中的节点。 4. "细细品味Hadoop_Hadoop集群(第5期)_...
用户可以在Eclipse中创建新的MapReduce项目,编写Mapper和Reducer代码,然后通过Eclipse的Map/Reduce透视图进行调试和运行,直接与远程的Hadoop集群进行交互。 总的来说,Windows下使用Eclipse远程开发MapReduce...
### Hadoop集群配置及MapReduce开发相关知识点 #### 一、Hadoop集群配置说明 **1.1 环境说明** 本章节介绍了Hadoop集群的环境配置信息,包括操作系统的选择、硬件要求以及软件版本等关键要素。 - **操作系统**: ...
对于标签中的“客户端”,在Hadoop中,客户端是指运行在用户机器上的程序,它们可以访问Hadoop集群,执行读写操作,提交MapReduce作业等。这些客户端程序依赖于`HADOOP_HOME`环境变量来找到必要的库和配置。 至于...
在Windows 7环境下配置和远程调试Hadoop集群是一项挑战,但通过正确的方法和步骤,可以成功实现这一目标。以下是关于这个主题的详细知识: 1. **Hadoop简介**: Hadoop是由Apache基金会维护的一个分布式计算框架,...
SpringBoot集成hadoop开发环境(复杂版的WordCount)前言环境清单创建SpringBoot项目创建包创建yml添加集群主机名映射hadoop配置文件环境变量HADOOP_HOME编写代码添加hadoop依赖jar包编译项目造数据IDEA远程提交...
在Linux环境下搭建Hadoop集群是一项复杂但至关重要的任务,它为大数据处理提供了强大的分布式平台。以下将详细介绍如何在一台虚拟机上安装多台Linux服务节点,并构建Hadoop集群环境。 首先,我们需要准备一个基础...
### 大数据时代:高性能Hadoop集群与应用案例 #### 一、Hadoop概述与重要性 随着信息技术的快速发展,数据量呈爆炸性增长趋势,这不仅为数据分析带来了前所未有的机遇,同时也对数据处理能力提出了更高要求。...
将程序提交到集群,观察运行结果,确保Hadoop集群可以正确处理数据。 总结,搭建Hadoop集群是一个涉及多步骤的过程,涉及到网络配置、软件安装、环境变量设置等多个环节。遵循上述步骤,即使是初学者也能成功搭建出...
通过以上介绍,我们可以看到,远程调用执行Hadoop Map/Reduce涵盖了从编写MapReduce程序到提交、监控和管理作业的全过程。理解和掌握这一过程对于开发和优化大数据处理应用至关重要。在实际项目中,开发者可以根据...
3. 完全分布式模式:有实际意义的Hadoop集群,其规模可从几个节点的小集群到几千个节点的超大集群。 二、实验环境操作系统 实验环境操作系统为RedHat Enterprise Linux 5.6,使用三个节点:clovem001、clovem002和...
7. **提交作业**:如果你的集群是远程的,你可以选择提交作业到集群。这需要配置Eclipse的“远程运行配置”,指定Hadoop集群的地址、用户名和密码。 8. **日志和调试**:使用Hadoop的JobHistory Server查看作业的...
6. **调试与运行**: 在Eclipse中可以直接运行和调试MapReduce程序,插件会将程序提交到Hadoop集群上执行,同时提供调试选项,如设置断点,查看变量值等。 7. **监控与日志查看**: 通过Eclipse可以监控Job的执行状态...
Linux提供了命令行工具,如SSH用于远程登录,FTP或SCP进行文件传输,以及各种文件管理、网络配置和系统监控命令,为Hadoop集群的搭建和管理提供了便利。 五、Linux环境下的Hadoop集群搭建 1. 安装Java环境:Hadoop...
在这个详解中,我们将深入理解如何在Fedora和Ubuntu系统上搭建一个Hadoop集群。 首先,为了确保集群中的节点能够相互识别,我们需要配置静态IP地址。在Ubuntu系统中,可以通过图形界面进行配置,而在Fedora系统中,...
根据提供的文件标题、描述、标签以及部分内容,我们可以总结出与Hadoop集群命令相关的知识点: ### Hadoop集群命令 #### 概述 Hadoop是一个能够处理大量数据的分布式系统基础架构,它通过提供高可靠性、高效性和可...