分享

怎么在log4j配置文件里面获得mapreduce的taskid

shlp 发表于 2015-11-27 11:24:23 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 10553
怎么在log4j.properties里面获得mapreduce的taskid? 我看配置文件里面有个&{hadoop.tasklog.taskid},那个是mapreduce的taskid吗?但是在此之前声明hadoop.tasklog.taskid值为null。

已有(1)人评论

跳转到指定楼层
xuanxufeng 发表于 2015-11-27 14:58:59



楼主可参考下面
public final void run() {
    ……
    TaskAttemptID taskid = t.getTaskID();
    LocalDirAllocator lDirAlloc = new LocalDirAllocator("mapred.local.dir");
    File jobCacheDir = null;
    if (conf.getJar() != null) {
      jobCacheDir = new File(
                        new Path(conf.getJar()).getParent().toString());
    }
    File workDir = new File(lDirAlloc.getLocalPathToRead(
                              TaskTracker.getLocalTaskDir(
                                t.getJobID().toString(),
                                t.getTaskID().toString(),
                                t.isTaskCleanupTask())
                              + Path.SEPARATOR + MRConstants.WORKDIR,
                              conf). toString());
    FileSystem fileSystem;
    Path localPath;
    ……
    //拼写classpath
    String baseDir;
    String sep = System.getProperty("path.separator");
    StringBuffer classPath = new StringBuffer();
    // start with same classpath as parent process
    classPath.append(System.getProperty("java.class.path"));
    classPath.append(sep);
    if (!workDir.mkdirs()) {
      if (!workDir.isDirectory()) {
        LOG.fatal("Mkdirs failed to create " + workDir.toString());
      }
    }
    String jar = conf.getJar();
    if (jar != null) {      
      // if jar exists, it into workDir
      File[] libs = new File(jobCacheDir, "lib").listFiles();
      if (libs != null) {
        for (int i = 0; i < libs.length; i++) {
          classPath.append(sep);            // add libs from jar to classpath
          classPath.append(libs);
        }
      }
      classPath.append(sep);
      classPath.append(new File(jobCacheDir, "classes"));
      classPath.append(sep);
      classPath.append(jobCacheDir);
    }
    ……
    classPath.append(sep);
    classPath.append(workDir);
    //拼写命令行java及其参数
    Vector<String> vargs = new Vector<String>(8);
    File jvm =
      new File(new File(System.getProperty("java.home"), "bin"), "java");
    vargs.add(jvm.toString());
    String javaOpts = conf.get("mapred.child.java.opts", "-Xmx200m");
    javaOpts = javaOpts.replace("@taskid@", taskid.toString());
    String [] javaOptsSplit = javaOpts.split(" ");
    String libraryPath = System.getProperty("java.library.path");
    if (libraryPath == null) {
      libraryPath = workDir.getAbsolutePath();
    } else {
      libraryPath += sep + workDir;
    }
    boolean hasUserLDPath = false;
    for(int i=0; i<javaOptsSplit.length ;i++) {
      if(javaOptsSplit.startsWith("-Djava.library.path=")) {
        javaOptsSplit += sep + libraryPath;
        hasUserLDPath = true;
        break;
      }
    }
    if(!hasUserLDPath) {
      vargs.add("-Djava.library.path=" + libraryPath);
    }
    for (int i = 0; i < javaOptsSplit.length; i++) {
      vargs.add(javaOptsSplit);
    }
    //添加Child进程的临时文件夹
    String tmp = conf.get("mapred.child.tmp", "./tmp");
    Path tmpDir = new Path(tmp);
    if (!tmpDir.isAbsolute()) {
      tmpDir = new Path(workDir.toString(), tmp);
    }
    FileSystem localFs = FileSystem.getLocal(conf);
    if (!localFs.mkdirs(tmpDir) && !localFs.getFileStatus(tmpDir).isDir()) {
      throw new IOException("Mkdirs failed to create " + tmpDir.toString());
    }
    vargs.add("-Djava.io.tmpdir=" + tmpDir.toString());
    // Add classpath.
    vargs.add("-classpath");
    vargs.add(classPath.toString());
    //log文件夹
    long logSize = TaskLog.getTaskLogLength(conf);
    vargs.add("-Dhadoop.log.dir=" +
        new File(System.getProperty("hadoop.log.dir")
        ).getAbsolutePath());
    vargs.add("-Dhadoop.root.logger=INFO,TLA");
    vargs.add("-Dhadoop.tasklog.taskid=" + taskid);
    vargs.add("-Dhadoop.tasklog.totalLogFileSize=" + logSize);
    // 运行map task和reduce task的子进程的main class是Child
    vargs.add(Child.class.getName());  // main of Child
    ……
    //运行子进程
    jvmManager.launchJvm(this,
        jvmManager.constructJvmEnv(setup,vargs,stdout,stderr,logSize,
            workDir, env, pidFile, conf));
}


来自:Map-Reduce的过程解析
http://www.aboutyun.com/thread-16307-1-1.html
(出处: about云开发)

回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条