如何在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
相关产品推荐
相关产品推荐

