在不启动新集群的情况下从 Airflow 触发 Databricks 作业
Triggering Databricks job from Airflow without starting new cluster
我正在使用气流来触发数据块上的作业。我有很多 DAG 运行ning databricks 作业,我希望只使用一个集群而不是多个集群,因为据我所知,这将减少这些任务将产生的成本。
使用 DatabricksSubmitRunOperator
有两种方法可以 运行 在数据块上创建作业。使用 运行ning 集群通过 id
调用它
'existing_cluster_id' : '1234-567890-word123',
或开始一个新集群
'new_cluster': {
'spark_version': '2.1.0-db3-scala2.11',
'num_workers': 2
},
现在我想尽量避免为每个任务启动一个新的集群,但是集群在停机期间关闭,因此它将不再通过它的 id 可用,我会得到一个错误,所以唯一的选择在我看来是一个新集群。
1) 有没有办法让集群即使在关闭时也可以通过 id 调用?
2) 人们只是让集群保持活力吗?
3) 还是我完全错了,为每个任务启动集群不会产生更多成本?
4) 有什么我完全错过的吗?
根据@YannickSSE 的评论回复更新
我不使用数据块;您能否使用与您可能期望或可能不期望的集群相同的 ID 启动一个新集群 运行,并在它是 运行 的情况下让它成为空操作?也许不是,或者你可能不会问这个。 响应:不,启动新集群时不能提供 id。
你能写一个 python 或 bash 运算符来测试集群的存在吗? (响应:这将是一个测试作业提交……不是最好的方法。)如果找到并成功,下游任务将使用现有的集群 ID 触发您的作业,但如果没有另一个下游任务可以使用 trigger_rule
all_failed
来执行相同的任务,但使用新的集群。然后这两个任务 DatabricksSubmitRunOperator
可以有一个下游任务 trigger_rule
one_success
。 (响应:或者使用分支运算符来确定执行的运算符。)
这可能并不理想,因为我想您的集群 ID 会不时更改,导致您必须跟上。 …集群是该操作员的数据块挂钩连接的一部分,以及可以更新的内容吗?也许您想在需要它的任务中将其指定为 {{ var.value.<identifying>_cluster_id }}
并将其更新为气流变量。 (响应:集群 id 不在钩子中,因此变量或 DAG 文件在更改时必须更新。)
事实上,当你想通过气流执行笔记本时,你必须指定集群的特性。
databricks 会将您的笔记本视为一项新工作,并将其放在您创建的集群上。但是当执行完成后创建的集群会被自动删除
验证这一点:当工作 运行 正在使用气流时 ==> 去查看日志 => 它给你一个 link => link 将你转发到数据块: 在那里你点击查看集群,所以你会看到在一个新创建的集群上执行,例如 job-1310-运行-980
Databricks 最近似乎添加了一个选项,可以在作业中重用作业集群,在任务之间共享它。
Until now, each task had its own cluster to accommodate for the
different types of workloads. While this flexibility allows for
fine-grained configuration, it can also introduce a time and cost
overhead for cluster startup or underutilization during parallel
tasks.
In order to maintain this flexibility, but further improve
utilization, we are excited to announce cluster reuse. By sharing job
clusters over multiple tasks customers can reduce the time a job
takes, reduce costs by eliminating overhead and increase cluster
utilization with parallel tasks.
这似乎也适用于新的 API。 https://docs.databricks.com/dev-tools/api/latest/jobs.html#operation/JobsCreate
job_clusters Array of objects (JobCluster) <= 100 items
A list of job cluster specifications that can be shared and reused by
tasks of this job. Libraries cannot be declared in a shared job
cluster. You must declare dependent libraries in task settings.
为了适合您的用例,您可以为您的作业启动一个新集群,在您的任务之间共享它,它会在结束时自动关闭。
我仍然不完全理解如果我们想让作业无延迟地启动,我们如何才能让作业集群一直保持热状态。我也不认为在作业之间共享这些集群是可能的。
目前,此信息应该提供不错的领先优势。
我正在使用气流来触发数据块上的作业。我有很多 DAG 运行ning databricks 作业,我希望只使用一个集群而不是多个集群,因为据我所知,这将减少这些任务将产生的成本。
使用 DatabricksSubmitRunOperator
有两种方法可以 运行 在数据块上创建作业。使用 运行ning 集群通过 id
'existing_cluster_id' : '1234-567890-word123',
或开始一个新集群
'new_cluster': {
'spark_version': '2.1.0-db3-scala2.11',
'num_workers': 2
},
现在我想尽量避免为每个任务启动一个新的集群,但是集群在停机期间关闭,因此它将不再通过它的 id 可用,我会得到一个错误,所以唯一的选择在我看来是一个新集群。
1) 有没有办法让集群即使在关闭时也可以通过 id 调用?
2) 人们只是让集群保持活力吗?
3) 还是我完全错了,为每个任务启动集群不会产生更多成本?
4) 有什么我完全错过的吗?
根据@YannickSSE 的评论回复更新
我不使用数据块;您能否使用与您可能期望或可能不期望的集群相同的 ID 启动一个新集群 运行,并在它是 运行 的情况下让它成为空操作?也许不是,或者你可能不会问这个。 响应:不,启动新集群时不能提供 id。
你能写一个 python 或 bash 运算符来测试集群的存在吗? (响应:这将是一个测试作业提交……不是最好的方法。)如果找到并成功,下游任务将使用现有的集群 ID 触发您的作业,但如果没有另一个下游任务可以使用 trigger_rule
all_failed
来执行相同的任务,但使用新的集群。然后这两个任务 DatabricksSubmitRunOperator
可以有一个下游任务 trigger_rule
one_success
。 (响应:或者使用分支运算符来确定执行的运算符。)
这可能并不理想,因为我想您的集群 ID 会不时更改,导致您必须跟上。 …集群是该操作员的数据块挂钩连接的一部分,以及可以更新的内容吗?也许您想在需要它的任务中将其指定为 {{ var.value.<identifying>_cluster_id }}
并将其更新为气流变量。 (响应:集群 id 不在钩子中,因此变量或 DAG 文件在更改时必须更新。)
事实上,当你想通过气流执行笔记本时,你必须指定集群的特性。
databricks 会将您的笔记本视为一项新工作,并将其放在您创建的集群上。但是当执行完成后创建的集群会被自动删除
验证这一点:当工作 运行 正在使用气流时 ==> 去查看日志 => 它给你一个 link => link 将你转发到数据块: 在那里你点击查看集群,所以你会看到在一个新创建的集群上执行,例如 job-1310-运行-980
Databricks 最近似乎添加了一个选项,可以在作业中重用作业集群,在任务之间共享它。
Until now, each task had its own cluster to accommodate for the different types of workloads. While this flexibility allows for fine-grained configuration, it can also introduce a time and cost overhead for cluster startup or underutilization during parallel tasks.
In order to maintain this flexibility, but further improve utilization, we are excited to announce cluster reuse. By sharing job clusters over multiple tasks customers can reduce the time a job takes, reduce costs by eliminating overhead and increase cluster utilization with parallel tasks.
这似乎也适用于新的 API。 https://docs.databricks.com/dev-tools/api/latest/jobs.html#operation/JobsCreate
job_clusters Array of objects (JobCluster) <= 100 items
A list of job cluster specifications that can be shared and reused by tasks of this job. Libraries cannot be declared in a shared job cluster. You must declare dependent libraries in task settings.
为了适合您的用例,您可以为您的作业启动一个新集群,在您的任务之间共享它,它会在结束时自动关闭。
我仍然不完全理解如果我们想让作业无延迟地启动,我们如何才能让作业集群一直保持热状态。我也不认为在作业之间共享这些集群是可能的。
目前,此信息应该提供不错的领先优势。