文档章节

ToolRunner与eclipse hadoop 插件的替代品,简化M/R程序的开发

martin_li
 martin_li
发布于 2012/09/11 13:20
字数 1037
阅读 638
收藏 3

目前开发的时候测试M/R程序有三种方式

    1. 直接打成jar包,然后放到服务器中去执行。此方法步骤繁琐,每次都要打包上传。

    2. 使用Hadoop的Ecilpse插件,但是对于N多的Hadoop版本总替换插件,是不是也是一种痛苦呢?

    3. 使用Hadoop的测试框架,这种情况我使用的比较少,感觉不太方便,每都相当于在本地启动各个服务(我电脑配置不好,压力啊!!汗一个) 其实Hadoop自带的ToolRunner只差一步就可以实现在Eclipse中运行了,而我们所要做的就是扩展一下而已。

Ok废话不多说了,原理如下:

    JobClient类在提交job的时候需要一个jar包,这个很简单,我们使用Ecipse编译出的class文件创建一个Jar包即可。如果你使用的是hadoop自带的那些jar,ok那没有问题,但是如果你引用了第三方的类库,那么问题随之而来,有两种解决办法

    1. 将你所需要第三方jar包加入到TaskTracker的ClassPath中,这样每新加入一个jar包就需要重启所有的TaskTracker。     2. 将第三方类库加入到M/R的ClassPath中,这就需要使用Hadoop的缓存机制,在M/R执行前将这些jar包都放入到Hadoop中,每个M/R就可以使用这些jar包中的类了。 很明显第二种方法是最适合的,而且Hadoop已经实现了这一功能。     JobClient在提交Job时会检查 tmpjars这个参数,如果里面指定的文件存在就是将这些文件加入hadoop的DistributedCache中,代码如下:

private void copyAndConfigureFiles(JobConf job, Path submitJobDir, 
      short replication) throws IOException, InterruptedException {
...
String libjars = job.get("tmpjars");
...
if (libjars != null) {
      FileSystem.mkdirs(fs, libjarsDir, mapredSysPerms);
      String[] libjarsArr = libjars.split(",");
      for (String tmpjars: libjarsArr) {
        Path tmp = new Path(tmpjars);
        Path newPath = copyRemoteFiles(fs, libjarsDir, tmp, job, replication);
        DistributedCache.addArchiveToClassPath
          (new Path(newPath.toUri().getPath()), job, fs);
      }
    }
...
}

仅仅将jar包加入到M/R的ClassPath中是不行,我们还需要再做一件事,就是将本地的第三方的Jar包加入到我们本地的ClassPath(我 们是在本地执行不是)。但是这些工作都不需要我们来完成, GenericOptionsParser已经帮我们完成了前期的准备工作。代码如下

private void processGeneralOptions(Configuration conf,
      CommandLine line) throws IOException {
...
URL[] libjars = getLibJars(conf);
      if(libjars!=null && libjars.length>0) {
        conf.setClassLoader(new URLClassLoader(libjars, conf.getClassLoader()));
        Thread.currentThread().setContextClassLoader(
            new URLClassLoader(libjars, 
                Thread.currentThread().getContextClassLoader()));
      }
...
}

激动人心的来了,使用方法:

我将这些功能都封装在MagicRunner中,可以直接替换ToolRunner,代码如下。 

MagicRunner.run(new WordCount(), args,"bin","../common/commons-configuration-1.6.jar");
//MagicRunner.run(new WordCount(), args,"bin","lib");
//MagicRunner.run(new WordCount(), args,"bin",""); 
//第三个参数为Eclipse编译的class文件的位置,第四个为第三方类库可以是文件也可以是目录,如果不使用传空字符串即可,第三个参数可是必不可少的哦!!!!

这样无论你是在Eclipse中debug、run都可以运行了,当然你只能调试本地的那一步分,M/R的执行还是提交的服务器中,无法进行调试。

如果是以hadoop jar 方式 执行的话 代码中设置的第三方jar是不会处理的,需要手动指定,且新增加支持目录的设定。方法如下

-libjars libs,../common/ commons-configuration-1.6.jar

以jar方式执行命令如下所示:

bin/hadoop jar wordCount.jar mr.example.WordCount -libjars libs,./commons-configuration-1.6.jar  -Dmapred.reduce.tasks=2   /test/20120907 /tmp/123

注意事项:

由于MagicRunner中只处理了libjars参数所以有一点需要注意,在使用libjars参数的时候务必使它位于开始。其它功能与ToolRunner并无差异。如

-libjars libs,../common/ commons-configuration-1.6.jar  -Dmapred.reduce.tasks=2

当然必须的文件还是要加入项目中的如:hdfs-site.xml   core-site.xml   mapred-site.xml 等,最简单的是直接放到src中

Hadoop的权限问题是没有办法避免的,所以必须要禁用或都在本地建一个同名帐户

 

本文地址:http://my.oschina.net/u/139278/blog/77943    版权所有,转载请保留原文链接。

 下载地址:http://www.oschina.net/code/snippet_139278_13675

 

 

 

© 著作权归作者所有

martin_li
粉丝 3
博文 6
码字总数 3870
作品 0
杭州
高级程序员
私信 提问
Hadoop实战之 MapReduce

私塾在线 整体课程概览 第一部分:开始云计算之旅 第二部分:初识Hadoop 第三部分:Hadoop 环境安装部署 第四部分:Hadoop Shell 基本操作介绍 第五部分:Hadoop 分布式文件系统1 第五部分:...

linni
2014/01/08
739
0
windows 环境下Eclipse开发MapReduce环境设置

1、Hadoop开发环境简介 1.1 Hadoop集群简介 Java版本:jdk-6u31-linux-i586.bin Linux系统:CentOS6.0 Hadoop版本:hadoop-1.0.0.tar.gz 1.2 Windows开发简介 Java版本:jdk-6u31-windows-i5......

加油_张
2013/11/30
13.6K
0
Hadoop集群(第7期)_Eclipse开发环境设置

1、Hadoop开发环境简介 1.1 Hadoop集群简介   Java版本:jdk-6u31-linux-i586.bin   Linux系统:CentOS6.0   Hadoop版本:hadoop-1.0.0.tar.gz 1.2 Windows开发简介   Java版本:jdk...

Carl_
2015/06/25
53
0
实战 windows7 下 eclipse 远程调试 linux hadoop

恩,之所以有这篇博客,是因为最近又有童鞋咨询怎么在 windows 7 下用eclipse远程调试部署在linux下的hadoop,其实我自己不这么混搭的,既然有童鞋这么问了,那我就索性随着折腾一把了。 首先...

大数据之路
2013/04/15
18.8K
13
Hadoop集群_Eclipse开发环境设置

1、Hadoop开发环境简介 1.1 Hadoop集群简介   Java版本:jdk-6u31-linux-i586.bin   Linux系统:CentOS6.0   Hadoop版本:hadoop-1.0.0.tar.gz 1.2 Windows开发简介   Java版本:jdk...

不语者
2016/11/03
30
0

没有更多内容

加载失败,请刷新页面

加载更多

Rust:最小化窗口后 CPU占用率高 (winit,glutin,imgui-rust)

最近试着用 imgui-rust 绘制界面,发现窗口最小化后CPU占用会增大。 查询的资料如下: https://github.com/rust-windowing/winit/issues/783 https://github.com/ocornut/imgui/issues/1151 ...

reter
20分钟前
6
0
cloud-zuul路由网关

九、zuul路由网关 概述 1.1 能干嘛 路由、过滤 路由基本配置 路由访问映射规则 十、springCloud config分布式配置中心

榴莲黑芝麻糊
20分钟前
6
0
Circuit Breaker模式

Circuit Breaker模式会处理一些需要一定时间来重连远程服务和远端资源的错误。该模式可以提高一个应用的稳定性和弹性。 问题 在类似于云的分布式环境中,当一个应用需要执行一些访问远程资源...

mskk
33分钟前
9
0
写论文之前的准备都有哪些?干货来了!

原文链接:https://www.lwfdy.com/archives/144.html 之前跟大家谈了许多有关于初稿修改以及写作事项需要注意的问题,那么今天我们来说一说,在写之前,我们需要做哪些准备呢,为了做到下笔如...

辅导员
39分钟前
7
0
idea快捷键

Alt + Enter 引入类 Ctrl + O 查看我们继承的类或者接口中的方法,以及我们要实现的方法 Ctrl + Alt + b 查看接口实现类中方法(就是我们使用接口编程时,在调用实现类方法处直接Ctrl+鼠标左...

行者终成事
47分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部