如何使用Azkaban Python API将流添加为Azkaban作业的依赖项?

时间:2018-07-30 18:18:13

标签: python-2.7 azkaban

我有一个作业A,需要将Azkaban流“ F”作为依赖项进行调用。我该如何提及作业A对流程F的依赖性?

这就是我现在与获取远程存储流“ F”有关的内容:

session = remote.Session("user@https://AZKABANURL")
workflows = session.get_workflows("FlowFProjectName")
flows = workflows[u"flows"]
flow_id = flows[0]["flowId"]

workflows = session.get_workflow_info("FlowFProjectName", flow_id)
node_id = workflows["nodes"][0]["id"]

现在我有了node_id,它是流F中最后一个作业的名称,如何在作业A中添加流F的依赖关系?是这样吗?

jobs["A"] = {
    "type": "command", 
    "command": 'echo "Hello World"', 
    "dependencies": "F"
}

执行以下操作会使我在上传到Azkaban时出错(通过在项目中捆绑此作业A):

jobs["a"] = Job({"type": "command", "command": 'echo "Hello World"',"dependencies": node_id})

这是错误:

azkaban.util.AzkabanError: Installation Failed.
Error found in upload. Cannot upload.
a cannot find dependency <node_id>

在这里,node_id是我所遮掩的作业的实际名称。

有人可以建议我添加对作业内部外部流的这些依赖吗?外部流程在Azkaban上(这就是为什么我必须使用Azkaban.remote)。

1 个答案:

答案 0 :(得分:0)

我找到了问题的答案:

  1. 调用远程流并等待其结束(在while循环中)
  2. 使用启动程序,使流F称为依赖作业。

选项1:这更容易理解-您使用while循环不断询问Azkaban是否仍在运行特定作业/流程。但是在执行此操作时,您应该使while循环持续运行几个小时,再加上使用get_running_workflows()方法检查流是否正在运行的方式。此方法不返回某个流的某个实例是否仍在运行,而仅返回所述流的任何实例是否在运行。

选项2:如果流F以作业f结尾,并且在流F完成执行后需要运行作业A,则将作业添加到流F的末尾,说f',以便f'调用Job

如果这很难理解:

原始工作图: 流程F,作业A依赖于流程F: f1-> f2-> ... f

添加启动作业后: 流f': f1-> f2-> ... f -> f'

在这里,f'应包含一个session.run_workflow(project_A, flow_A)

这是比选项1更好的方法,因为您可以确定只有在流程f成功执行后,才启动作业A。 我希望这对以后的人有所帮助。