INFO-Azkaban环境变量

功能说明
离线开发

具体说明

Azkaban环境变量
使用示例
// 获取当前运行的实例 id
String execId = System.getProperty("azkaban.execid");

// 获取 flow id
String flowId = System.getProperty("azkaban.flowid");

// 获取 job id
String jobId = System.getProperty("azkaban.jobid");

Hadoop 相关

String hadoopHome = System.getenv("HADOOP_HOME");

String hadoopConfDir = System.getenv("HADOOP_CONF_DIR");

String hiveHome = System.getenv("HIVE_HOME");
  1. ClassPath 加载顺序 Azkaban 会默认加载一些 class,然后再加载用户的 classPath (可以通过 classPath 属性来设置,以逗号分隔),如果用户没有填写 classPath 的话,则会加载 workingDir 目录下所有以 .jar 结尾的文件到 classPath 中

  2. 如何获取任务执行的工作根目录 前提假设

假设您上传的 Zip 目录的层次结构如下:

  • root 目录
    • A.job 文件
    • job 目录
      • B.job 文件

获取逻辑

Azkaban 并不直接将任务执行的根目录(也即 root 目录)置入到任务运行的环境变量中,但却将任务的当前目录设置为任务进程的 working directory(也即:对于 A.job 来说是 root 目录;对于 B.job 来说是 root/job 目录)
可以通过如下手段获取到 working directory:
String workingDir = System.getProperty("user.dir");
基于此,您可以根据你运行的具体任务动态的获取工程的root目录 // 对于 A.job,您的 workingDir 就是工程的 root 目录 String workingDir = System.getProperty("user.dir"); String rootDir = workingDir; // 对于 B.job,您的 workingDir 父目录才是工程的 root 目录 String workingDir = System.getProperty("user.dir"); String rootDir = new File(workingDir).getParentFile().getAbsolutePath(); 高级用法 Azkaban 将用户的 Job 所需要的信息都保存在一个 properties 文件,可以通过读取该文件来获取对应的信息
// 获取 job properties 
String jobPropertiesFilePath = System.getenv("JOB_PROP_FILE");
Properties properties = new Properties();
properties.load(new FileInputStream(jobPropertiesFilePath))

获取任务基本信息

String projectId = properties.getProperty("azkaban.flow.projectid");
String flowId = properties.getProperty("azkaban.flow.flowid");
String jobId = properties.getProperty("azkaban.job.id");

获取任务执行目录

string currentDir = properties.getProperty("working.dir");
String rootDir = properties.getProperty("base.working.dir");

环境变量的排除

Azkaban 以用户配置的属性为主,因此您可以在任务运行时,通过设置更多参数,来设置 Azkaban 的环境变量,例如您想添加一个环境变量到您的任务中,那么可以通过设置 env.var.A -> value_A 的方式来进行,如果想排除的话,可以 env.var.A -> 的方式,建议不要排除 Azkaban 本身的环境变量,否则可能会影响到任务的正常运行。

作者:qianzhaoyuan