Azkaban:将参数传递给基础工作代码

时间:2015-05-07 23:46:31

标签: azkaban

是否可以将选项从azkaban工作流传递到基础工作代码?

我有类似的东西,它适用于硬编码/预先知道的日期,但我希望可以选择指定执行流程的日期:

from azkaban import Job, Project
import datetime
import os
from datetime import datetime, timezone, timedelta




options = {
            'start.date' : today.strftime('%Y-%m-%d'), # Can we pass this as an argument to the underlying code?
            'day.offset' : 1
            }

project = Project('my_project',root=__file__)
project.add_file('my_shell_script.sh', 'my_shell_script.sh')
project.add_job('my_job', Job(options, {'type' : 'command' : 'bash my_shell_script <pass date here?>'}))
project.add_job('my_job', Job(options, {'type' : 'command' : 'java -jar test.jar <pass date here?>'}))

谢谢, 沙拉斯

3 个答案:

答案 0 :(得分:4)

大图:通过将参数写入磁盘

使参数持久化

在Azkaban流程中,在非相邻作业之间传递参数的一种方法是在需要参数之前对JOB_OUTPUT_PROP_FILE进行操作。 必须使用shell脚本执行此操作,因为JOB_OUTPUT_PROP_FILE变量不能直接用于给定作业。 此方法将相关信息写入文件,并在需要之前使用帮助程序脚本读取它。通过在每一步写入JOB_OUTPUT_PROP_FILE,可以将参数传递给相邻的作业。

Pass parameters between jobs diagram

概念

  1. 将文件写入包含您希望传递的信息的磁盘
  2. 创建一个帮助器/准备shell脚本,该脚本在需要参数
  3. 的作业之前运行
  4. 使用作业中的参数
  5. 实施例

    在运行流中的第一个作业的日期需要由后一个作业使用的情况下,首先将相关数据写入文件。在此示例中,YYYY-MM-DD格式的当前日期将写入名为rundate.text的本地文件

    #step_1.job
    type=command
    dependencies=initialize_jobs
    command=whoami
    command.1=/bin/sh -c "date '+%Y-%m-%d' > rundate.text"
    

    然后,在需要参数之前,运行准备脚本以使参数可用。

    #step_4_preparation.job
    type=command
    dependencies=step_3
    command=whoami
    command.1=/bin/bash rd.sh
    

    第4步准备执行以下shell脚本(rd.sh)

    #!/bin/sh
    # this script takes the run_date value from the text file and passes it to Azkaban
    # Now, the variable can be used in the next step of the job
    
    RD=$(cat rundate.text)
    
    echo "Now setting Job Output Property File with RD (run date) variable"
    echo $RD
    
    
    #This is the point where the parameter is written in JSON format
    #to the JOB_OUTPUT_PROP_FILE, which allows it to be used in the next step
    echo '{"RD" : "'"$RD"'"}' > "${JOB_OUTPUT_PROP_FILE}"
    

    然后,在以下步骤中,可以使用参数,在此示例中为$ {RD}。

    # step_4.job
    type=command
    dependencies=step_4_preparation
    command=whoami
    command.1=bash -c "echo ${RD} is the run date"
    

答案 1 :(得分:2)

好吧,

根据azkaban doc,只能覆盖全局流属性。 在python中,我们可以用这种方式设置全局属性:

    project = Project('emr-cluster-creation', root=__file__)

project.properties = {
                                                    'emr.cluster.name' : 'default-clustername',
                                                    'emr.master.instance.type' : 'r3.xlarge',
                                                    'emr.core.instance.type' : 'r3.xlarge',
                                                    'emr.task.instance.type' : 'r3.xlarge',
                                                    'emr.instance.count' : 11,
                                                    'emr.task.instance.count' : 5,
                                                    'emr.hadoop.conf.local.path' : 's3n://bucket/hadoop-configuration.json',
                                                    'emr.hive.site.s3.path' : 's3n://bucket/hive-site.xml',
                                                    'emr.spark.version' : '1.4.0.b',
#                                                   'emr.service.role' : 'some-role', #amazon IAM role.
                                                    'emr.service.role' : '\'\'', #amazon IAM role.
                                                    'emr.cluster.output' : '\'\''
    }

# do something...

这些参数可以作为$ {emr.cluster.name}传递给底层应用程序/脚本。这将支持传递默认属性值,并在azkaban服务器web-ui上或使用azkaban ajax API覆盖流参数。

答案 2 :(得分:1)

正如eeasterly所说的正确方法是使用JOB_OUTPUT_PROP_FILE,但是与其将其传递给所有依赖项的特征,不如将其持久化到文件系统中( Creating Flows > Job configuration > Parameter Output > "Properties can be exported to be passed to its dependencies"

要利用此功能,只需使需要导出参数的作业与导出它们的作业相关即可。在极端情况下,丢弃中间step 4 preparation,而仅使step 4依赖于step 1