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

3 篇文章 0 订阅

目前开发的时候测试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是不会处理的,需要手动指定,且新增加支持目录的设定。方法如下

 -libjarslibs,../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://blog.csdn.net/magicdreaming/article/details/7966074 版权所有,转载请保留原文链接。

代码下载地址:http://download.csdn.net/detail/magicdreaming/4569367


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException java.lang.NullPointerException at org.json.JSONObject.<init>(JSONObject.java:144) at org.apache.sqoop.util.SqoopJsonUtil.getJsonStringforMap(SqoopJsonUtil.java:43) at org.apache.sqoop.SqoopOptions.writeProperties(SqoopOptions.java:867) at org.apache.sqoop.mapreduce.JobBase.putSqoopOptionsToConfiguration(JobBase.java:393) at org.apache.sqoop.mapreduce.JobBase.createJob(JobBase.java:379) at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:255) at org.apache.sqoop.manager.SqlManager.importQuery(SqlManager.java:747) at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:536) at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:633) at org.apache.sqoop.Sqoop.run(Sqoop.java:146) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76) at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:182) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:233) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:242) at org.apache.sqoop.Sqoop.main(Sqoop.java:251) Log Type: stdout Log Upload Time: Mon Jul 24 10:47:38 +0800 2023 Log Length: 74530 Showing 4096 bytes of 74530 total. Click here for the full log. 35517561_3806_01_000001: PRELAUNCH_OUT=/yarn/container-logs/application_1683335517561_3806/container_1683335517561_3806_01_000001/prelaunch.out: NM_AUX_SERVICE_mapreduce_shuffle=AAA0+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=: NM_PORT=8041: HADOOP_YARN_HOME=/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hadoop-yarn: USER=admin: CLASSPATH=/yarn/nm/usercache/admin/appcache/application_1683335517561_3806/container_1683335517561_3806_01_000001:/yarn/nm/usercache/admin/appcache/application_1683335517561_3806/container_1683335517561_3806_01_000001/*:/etc/hadoop/conf.cloudera.yarn:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hadoop/*:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hadoop/lib/*:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hadoop-hdfs/*:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hadoop-hdfs/lib/*:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hadoop-yarn/*:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hadoop-yarn/lib/*:: PRELAUNCH_ERR=/yarn/container-logs/application_1683335517561_3806/container_1683335517561_3806_01_000001/prelaunch.err: HADOOP_TOKEN_FILE_LOCATION=/yarn/nm/usercache/admin/appcache/application_1683335517561_3806/container_1683335517561_3806_01_000001/container_tokens: LOCAL_USER_DIRS=/yarn/nm/usercache/admin/: OOZIE_ACTION_CONF_XML=/yarn/nm/usercache/admin/appcache/application_1683335517561_3806/container_1683335517561_3806_01_000001/action.xml: SHLVL=2: HOME=/home/: CONTAINER_ID=container_1683335517561_3806_01_000001: MALLOC_ARENA_MAX=4:怎么回事
07-25

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值