You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Perl中实现Databricks作业的提交、完成检测与耗时统计

解决Databricks作业提交后的耗时统计问题

你说得没错,databricks jobs run-now命令默认只是提交作业就返回,不会等待作业完成,所以直接用system调用的话,统计的只是提交作业的时间,不是实际运行耗时。要实现你想要的逻辑,需要分三步:获取作业运行的ID、轮询作业状态直到完成、计算实际运行时长。

1. 提交作业并获取Run ID

当你用databricks jobs run-now时,可以加上--output json参数让命令返回JSON格式的结果,里面包含关键的run_id字段。我们可以捕获这个输出,解析出Run ID,后续用来查询作业状态。

示例命令:

databricks jobs run-now --job-id <你的作业ID> --output json

返回的JSON结构大概如下:

{
  "run_id": 123456,
  "run_page_url": "https://xxx.databricks.com/...",
  ...
}

2. 轮询作业状态

拿到Run ID后,我们可以用databricks runs get --run-id <Run ID> --output json命令查询作业的实时状态。作业的终态包括:

  • SUCCEEDED:作业成功完成
  • FAILED:作业执行失败
  • CANCELLED:作业被主动取消

我们需要循环查询这个状态,直到作业进入上述终态为止。

3. Perl实现完整逻辑

下面是实现你需求的Perl代码,需要用到Time::HiRes做精确计时,JSON模块解析命令输出(记得先通过cpan install JSON或系统包管理器安装这个模块):

use strict;
use warnings;
use Time::HiRes qw(time);
use JSON;

# 配置你的作业ID和轮询间隔(秒)
my $JOB_ID = 12345;
my $POLL_INTERVAL = 10; # 每10秒查询一次状态,可根据需求调整

foreach my $entry (@entries) {
    # 记录作业提交开始时间
    my $start_time = time();
    
    # 提交作业并获取Run ID
    my $submit_output = `databricks jobs run-now --job-id $JOB_ID --output json`;
    die "Failed to submit job: $!" unless $submit_output;
    
    my $submit_result = decode_json($submit_output);
    my $run_id = $submit_result->{run_id};
    die "Could not get run_id from submission response" unless $run_id;
    
    print "Job submitted successfully, run_id: $run_id\n";
    
    # 轮询作业状态直到完成
    my $job_completed = 0;
    my $final_state;
    while (!$job_completed) {
        my $status_output = `databricks runs get --run-id $run_id --output json`;
        die "Failed to get job status: $!" unless $status_output;
        
        my $status_result = decode_json($status_output);
        my $life_cycle_state = $status_result->{state}->{life_cycle_state};
        
        print "Current run state: $life_cycle_state\n";
        
        # 判断是否进入终态
        if ($life_cycle_state =~ /^(SUCCEEDED|FAILED|CANCELLED)$/) {
            $job_completed = 1;
            $final_state = $life_cycle_state;
        } else {
            # 未完成则等待指定间隔后再查询
            sleep $POLL_INTERVAL;
        }
    }
    
    # 记录作业完成时间并计算耗时
    my $end_time = time();
    my $run_duration = sprintf("%.2f", $end_time - $start_time);
    
    # 输出结果
    print "Job run $run_id completed with state: $final_state\n";
    print "Total runtime: $run_duration seconds\n\n";
}

注意事项

  • Databricks CLI配置:确保远程服务器已通过databricks configure完成CLI认证,否则命令会执行失败。
  • 轮询间隔:不要设置过小的轮询间隔,避免触发Databricks API限流,10-30秒是比较合理的范围。
  • 错误处理:代码中加入了基础的错误捕获逻辑,你可以根据需求扩展,比如捕获作业失败的具体原因。
  • 依赖安装:如果你的Perl环境没有JSON模块,可通过sudo cpan install JSON或系统包管理器(如Debian/Ubuntu的libjson-perl包)安装。

内容的提问来源于stack exchange,提问作者con

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:37:36