分享

hadoop作业提交脚本分析(2)

本帖最后由 howtodown 于 2014-2-21 17:11 编辑
此篇是在hadoop作业提交脚本分析(1) 的基础上
阅读本文可以带着下面问题:
1.能否把下面红字部分 :传入Hadoop Home的地址,变成用户可以选择的?
2.提交作业时,要把conf放到什么中?





前面对Hadoop的作业提交流程基本明了了,下面我们就可以开始编写代码模拟这个流程。

  第一步要做的是添加Hadoop的依赖库和配置文件到classpath。最常用的方法就是用一个容器先把各个要添加到classpath的文件或文件夹存储起来,后面再作为类加载器的URL搜索路径。
  1. /**
  2.    * Add a directory or file to classpath.
  3.    *
  4.    * @param component
  5.    */
  6.   public static void addClasspath(String component) {
  7.     if ((component != null) && (component.length() > 0)) {
  8.       try {
  9.     File f = new File(component);
  10.     if (f.exists()) {
  11.       URL key = f.getCanonicalFile().toURL();
  12.       if (!classPath.contains(key)) {
  13.         classPath.add(key);
  14.       }
  15.     }
  16.       } catch (IOException e) {
  17.       }
  18.     }
  19.   }
复制代码
上面的classPath变量就是我们声明用来装载classpath组件的容器。
  1. private static ArrayList<URL> classPath = new ArrayList<URL>();
复制代码
由于需要添加一些文件夹下的所有Jar包,所以我们还要实现一个遍历添加某文件夹下文件的方法。
  1. /**
  2.    * Add all jars in directory to classpath, sub-directory is excluded.
  3.    *
  4.    * @param dirPath
  5.    */
  6.   public static void addJarsInDir(String dirPath) {
  7.     File dir = new File(dirPath);
  8.     if (!dir.exists()) {
  9.       return;
  10.     }
  11.     File[] files = dir.listFiles();
  12.     if (files == null) {
  13.       return;
  14.     }
  15.     for (int i = 0; i < files.length; i++) {
  16.       if (files[i].isDirectory()) {
  17.         continue;
  18.       } else {
  19.     addClasspath(files[i].getAbsolutePath());
  20.       }
  21.     }
  22.   }
复制代码
简单起见,这个方法没有使用Filter,对文件夹下的文件是通吃,也忽略掉了子文件夹,只处理根文件夹。

  好了,有了基础方法,下面就是照着bin/hadoop中脚本所做的,把相应classpath添加进去。
  1. /**
  2.    * Add default classpath listed in bin/hadoop bash.
  3.    *
  4.    * @param hadoopHome
  5.    */
  6.   public static void addDefaultClasspath(String hadoopHome) {
  7.     // Classpath initially contains conf dir.
  8.     addClasspath(hadoopHome + "/conf");
  9.     // For developers, add Hadoop classes to classpath.
  10.     addClasspath(hadoopHome + "/build/classes");
  11.     if (new File(hadoopHome + "/build/webapps").exists()) {
  12.       addClasspath(hadoopHome + "/build");
  13.     }
  14.     addClasspath(hadoopHome + "/build/test/classes");
  15.     addClasspath(hadoopHome + "/build/tools");
  16.     // For releases, add core hadoop jar & webapps to classpath.
  17.     if (new File(hadoopHome + "/webapps").exists()) {
  18.       addClasspath(hadoopHome);
  19.     }
  20.     addJarsInDir(hadoopHome);
  21.     addJarsInDir(hadoopHome + "/build");
  22.     // Add libs to classpath.
  23.     addJarsInDir(hadoopHome + "/lib");
  24.     addJarsInDir(hadoopHome + "/lib/jsp-2.1");
  25.     addJarsInDir(hadoopHome + "/build/ivy/lib/Hadoop/common");
  26.   }
复制代码
至此,该添加classpath的都已添加好了(未包括第三方库,第三方库可用Conf中的tmpjars属性添加。),下去就是调用RunJar类了。本文为了方便,把RunJar中的两个方法提取了出来,去掉了一些可不要的Hadoop库依赖,然后整合到了类EJob里。主要改变是把原来解压Jar包的“hadoop.tmp.dir”文件夹改为"java.io.tmpdir",并提取出了fullyDelete方法。

  利用这个类来提交Hadoop作业很简单,下面是一个示例:
  1. args = new String[4];
  2.     args[0] = "E:\\Research\\Hadoop\\hadoop-0.20.1+152\\hadoop-0.20.1+152-examples.jar";
  3.     args[1] = "pi";
  4.     args[2] = "2";
  5.     args[3] = "100";
  6.     // 传入Hadoop Home的地址,自动添加相应classpath。
  7.     EJob.addDefaultClasspath("E:\\Research\\Hadoop\\hadoop-0.20.1+152");
  8.     EJob.runJar(args);
复制代码
 上面这个示例调用了Hadoop官方例子Jar包里的pi计算例子,传递参数时同bin/hadoop jar *.jar mainclass args命令类似,但是忽略掉了bin/hadoop jar这个命令,因为我们现在不需要这个脚本来提交作业了。新建一个Project,添加一个class,在main里粘上上面的代码,然后Run as Java Application。注意看你的Console,你会发现你已经成功把作业提交到Hadoop上去了。
  有图有真相,粘一下我的运行示例(在Win上开Eclipse,Hadoop Cluster在Linux,配置文件同Cluster的一样)。
   r_job1.jpg
  下面是在Cloudera Desktop看到的Job信息(它的时间是UTC的)。
   r_job2.jpg
  用上述方法,我们可以做一个类似Cloudera Desktop的Web应用,接受用户提交的Jar,并在Action处理中提交到Hadoop中去运行,然后把结果返回给用户。
  由于篇幅原因,加上前面介绍过RunJar类,所本文没有粘关于RunJar类的代码,不过你放心,本文提供例子工程下载。你可以在此基础上优化它,添加更多功能。由于大部分是Hadoop的代码,So,该代码基于Apache License。
下载地址 jobutil.rar (9.96 KB, 下载次数: 30)

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条