hadoop提供的一种程序驱动管理程序

hadoop开发包里一般都携带一些基准测试程序,这是一批程序,如何管理好大型项目的测试程序,做一个方便好用的工具呢?

我们都知道,java程序的基本单位是类,程序的入口是指定类的main方法,有时候可能会通过抽象工厂方法实现程序的适配,这种方式当然也是行之有效的,但是有时候更简单的方式是控制程序启动的入口。

hadoop的基准测试程序就是这样做的。

首先给每一个测试程序起一个名字,例如mrbench,nnbench,TestDFSIO...等,然后工具类需要想办法收集所有测试程序的执行类及入口地址。这时候hadoop是这样实现的,这个工具类叫做ProgramDriver :

首先采集所有的测试程序描述,

  public void addClass (String name, Class mainClass, String description) throws Throwable {
    programs.put(name , new ProgramDescription(mainClass, description));
  }
/*programs是一个map,程序的名字,可以自定义作为key,程序描述类ProgramDescription作为value。
ProgramDescription是一个完整程序的描述类,其中,保存了程序的Class对象,用于反射。
保存程序的Main方法*/

    static final Class<?>[] paramTypes = new Class<?>[] {String[].class};
private Method main;
    private String description; 
    public ProgramDescription(Class<?> mainClass, 
                              String description)
      throws SecurityException, NoSuchMethodException {
      this.main = mainClass.getMethod("main", paramTypes);//对每一个测试类抽出main方法
      this.description = description;
    }
    public void invoke(String[] args)
      throws Throwable {
      try {
        main.invoke(null, new Object[]{args});
      } catch (InvocationTargetException except) {
        throw except.getCause();
      }
    }

    public String getDescription() {
      return description;
    }
/************************************************************************
  ProgramDriver 之后执行driver方法:
***********************************************************************/

  public void driver(String[] args) 
    throws Throwable 
  {
    // Make sure they gave us a program name.
    if (args.length == 0) {
      System.out.println("An example program must be given as the" + 
                         " first argument.");
      printUsage(programs);
//遍历出所有方法的用法描述符
      System.exit(-1);
    }

    // And that it is good.
    ProgramDescription pgm = programs.get(args[0]);
    if (pgm == null) {
      System.out.println("Unknown program '" + args[0] + "' chosen.");
      printUsage(programs);
      System.exit(-1);
    }

    // Remove the leading argument and call main
    String[] new_args = new String[args.length - 1];
    for(int i=1; i < args.length; ++i) {
      new_args[i-1] = args[i];
    }
    pgm.invoke(new_args);
//执行main Method的invoke方法,具体执行测试程序。
  }

这样一个简单地程序管理工具就做好了,是不是很简单,也很好用?



你可能感兴趣的:(java,hadoop,类,测试,管理)