从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。不过觉得没有这种方式方便。
分享到:
相关推荐
SpringBoot集成hadoop开发环境(复杂版的WordCount)前言环境清单创建SpringBoot项目创建包创建yml添加集群主机名映射hadoop配置文件环境变量HADOOP_HOME编写代码添加hadoop依赖jar包编译项目造数据IDEA远程提交...
IDEA SpringBoot集成hadoop运行环境,本地启动项目,GET请求接口触发远程提交MapReduce任务至生产集群报错: Error: java.lang.ClassNotFoundException: org.wltea.analyzer.core.IKSegmenter at java.net....
本书是Hadoop权威参考,程序员可从中探索如何分析海量数据集,管理员可以从中了解如何安装与运行Hadoop集群。 目录 第1章 初识Hadoop 数据!数据! 数据存储与分析 与其他系统相比 关系型数据库管理系统...
Hadoop系统安装运行与程序开发 1.单机Hadoop系统安装基本步骤 2.集群Hadoop系统安装基本步骤 3.Hadoop集群远程作业提交与执行 4.Hadoop MapReduce程序开发
利用基准测试程序测试Hadoop集群 Hadoop基准测试程序 用户的作业 云上的Hadoop Amazon EC2上的Hadoop 第10章 管理Hadoop HDFS 永久性数据结构 安全模式 日志审计 工具 监控 日志 度量 Java管理扩展(JMX) 维护 日常...
1.单机Hadoop系统安装基本步骤 2.集群Hadoop系统安装基本步骤 3.Hadoop集群远程作业提交与执行 4.Hadoop MapReduce程序开发
IDEA SpringBoot集成hadoop运行环境,,本地启动项目,GET请求接口触发远程提交MapReduce任务至生产集群报错: Failing this attempt.Diagnostics: [2020-02-17 00:44:42.444]Exception from container-launch. ...
* 具体的Hadoop集群搭建,集成开发环境(IDE)的构建,如果以后能够用到,我会将详细过程放在我的个人博客上(见“关于作者”部分)。 -------- 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的...
基于Hadoop,MapReduce粒计算,对肝病数据集进行属性约简,在集群上运行,用信息熵,和重要度+源代码+文档说明 -------- 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是...
一、Linux下配置hadoop集群(伪分布式或完全分布式) 1、https://blog.csdn.net/z1148059382/article/details/89459182 2、Windows下管理HDFS的神器:HDFS Explorer 二、在Windows环境下通过IDEA远程连接Linux里的...
如果您正在写入远程数据库(即如果您在多节点集群上运行此程序),请确保每个从节点上的“/etc/mysql/my.cnf”文件中的绑定地址是主节点。 在 hadoop mapreduce 程序的驱动程序类中,确保 DB URL 包含主节点的主机...
'[IT18掌www.it18zhang.com]010.Hadoop配置-独立与伪分布式模式.pptx' '[IT18掌www.it18zhang.com]Ambari Hadoop集群管理工具.pptx' '[IT18掌www.it18zhang.com]Spark调优.pptx' '[IT18掌www.it18zhang.com]011....
详细介绍 MapReduce编程框架,具体分析yMapReduce中shuffle阶段流程。...最后通过搭建Hadoop集群,运用 MapReduce分布式算法测试实验数据。实验结果证明优化重构后的Shuffle能显著提高MapReduce计算性能。
查询通过例如 Presto CLI 的客户端提交到协调器,协调器负责解析、分析和安排查询到不同的 worker 上执行。 此外,Presto 需要一个数据源来运行查询。当前 Presto 包含一个插件用来查询 Hive 上的数据,要求: ...
一切就绪后,以远程模式运行 Storm,提交用于在集群中运行的Topology。 要运行Storm集群,你需要Apache Zookeeper、ØMQ、JZMQ、Java 6和Python 2.6.6。ZooKeeper用于管理集群中的不同组件,ØMQ是内部消息系统,...
A、 为海量数据提供存储的 HDFS 和对数据进⾏计算的 MapReduce B、 提供整个 HDFS ⽂件系统的 NameSpace(命名空间)管理、块管理等所有服务 C、 Hadoop 不仅可以运⾏在企业内部的集群中,也可以运⾏在云计算环境中 D...