Azkaban环境变量

功能说明

适用模块

离线开发

具体说明

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");

ClassPath 加载顺序

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

如何获取任务执行的工作根目录

前提假设

假设您上传的 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