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

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

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

    2. 使用Hadoop的Ecilpse插件,可是对于N多的Hadoop版本总替换插件,是否是也是一种痛苦呢?服务器

    3. 使用Hadoop的测试框架,这种状况我使用的比较少,感受不太方便,每都至关于在本地启动各个服务(我电脑配置很差,压力啊!!汗一个) 其实Hadoop自带的ToolRunner只差一步就能够实如今Eclipse中运行了,而咱们所要作的就是扩展一下而已。 框架

Ok废话很少说了,原理以下: oop

    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中,代码以下:.net

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()));
      }
...
}

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

我将这些功能都封装在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

相关文章
相关标签/搜索