ToolRunner与eclipse hadoop 插件的替代品,简化M/R程序的开发
2012-09-11 13:20
302 查看
目前开发的时候测试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中,代码如下:
仅仅将jar包加入到M/R的ClassPath中是不行,我们还需要再做一件事,就是将本地的第三方的Jar包加入到我们本地的ClassPath(我 们是在本地执行不是)。但是这些工作都不需要我们来完成, GenericOptionsParser已经帮我们完成了前期的准备工作。代码如下
激动人心的来了,使用方法:
我将这些功能都封装在MagicRunner中,可以直接替换ToolRunner,代码如下。
这样无论你是在Eclipse中debug、run都可以运行了,当然你只能调试本地的那一步分,M/R的执行还是提交的服务器中,无法进行调试。
如果是以hadoop jar 方式 执行的话 代码中设置的第三方jar是不会处理的,需要手动指定,且新增加支持目录的设定。方法如下
以jar方式执行命令如下所示:
注意事项:
由于MagicRunner中只处理了libjars参数所以有一点需要注意,在使用libjars参数的时候务必使它位于开始。其它功能与ToolRunner并无差异。如
当然必须的文件还是要加入项目中的如: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
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
相关文章推荐
- ToolRunner与eclipse hadoop 插件的替代品,简化M/R程序的开发
- 在eclipse下安装开发hadoop程序的插件
- eclipse中配置hadoop开发环境-----删除之前版本的hadoop插件、编译hadoop eclipse插件、安装插件、eclipse下运行hadoop程序
- Ubuntu上为eclipse安装hadoop插件以及在eclipse运行Hadoop程序
- Hadoop学习笔记(九):如何在windows上使用eclipse远程连接hadoop进行程序开发
- Windows下使用Eclipse开发Hadoop程序
- Eclipse开发J2ME程序之插件安装
- ubuntu系统下eclipse配置hadoop开发环境并运行wordcount程序
- Linux下用Eclipse开发调试Hadoop程序后打jar包后,到Hadoop集群上运行
- 如何生成hadoop-1.1.2-eclipse开发插件
- 如何在windows上使用eclipse远程连接hadoop进行程序开发
- 可以让Eclipse开发C#程序的插件
- Eclipse 配置开发 Hadoop程序
- Hadoop集群实践-Windows上Eclipse远程Linux服务器集群Hadoop进行程序开发
- 配置插件hadoop-1.2.1 eclipse开发环境 【hadoop的eclipse插件hadoop-eclipse-plugin-1.2.1.jar 下载地址和具体用法】
- eclipse添加hadoop开发插件
- Windows下用Eclipse开发Hadoop程序遇到的问题及解决方法
- 如何在windows上使用eclipse远程连接hadoop进行程序开发
- 开发android程序时使用eclipse的svn插件时的一些设置
- eclipse下开发hadoop程序配置(二)