Jobs são a orquestração nativa do Databricks. Um Job é composto por uma ou mais tasks com dependências entre elas, formando um DAG (Directed Acyclic Graph) de execução.
Alternativa à necessidade de Apache Airflow para pipelines inteiramente dentro do Databricks.
Tipos de task
| Tipo | Quando usar |
|---|---|
| Notebook | Scripts exploratórios, ETL simples com lógica em notebook |
| Python Script | Scripts .py versionados no repositório |
| Python Wheel | Pacotes Python buildados, melhor para código de produção testável |
| Spark Submit | Submissão de JARs Spark ou scripts com configurações avançadas |
| SQL | Queries SQL no Databricks SQL Warehouse |
| dbt | Tasks dbt integradas nativamente |
| Pipeline (DLT) | Dispara um Lakeflow Declarative Pipeline |
| Run Job | Dispara outro Job como subtask |
| Condition | Lógica condicional (if/else) no fluxo do DAG |
| For Each | Itera sobre uma lista dinamicamente, executando uma task por item |
Estrutura de um Job (UI / YAML)
# resources/jobs/pipeline_vendas.yml (dentro de um DAB)
resources:
jobs:
pipeline_vendas:
name: "Pipeline Vendas"
schedule:
quartz_cron_expression: "0 0 6 * * ?" # 06:00 UTC diário
timezone_id: "America/Sao_Paulo"
pause_status: UNPAUSED
max_concurrent_runs: 1
timeout_seconds: 7200 # 2 horas: falha se passar disso
email_notifications:
on_start: []
on_success: []
on_failure:
- [email protected]
no_alert_for_skipped_runs: true
tasks:
- task_key: ingestao_crm
notebook_task:
notebook_path: ./src/notebooks/ingestao_crm.py
base_parameters:
data: "{{ds}}" # variável de data da execução
catalog: "gold"
job_cluster_key: cluster_ingestion
timeout_seconds: 1800
retry_on_timeout: false
max_retries: 2
min_retry_interval_millis: 60000
- task_key: ingestao_erp
notebook_task:
notebook_path: ./src/notebooks/ingestao_erp.py
job_cluster_key: cluster_ingestion
max_retries: 2
- task_key: transformacao_silver
depends_on:
- task_key: ingestao_crm
- task_key: ingestao_erp # executa após AMBAS completarem
python_wheel_task:
package_name: pipeline_vendas
entry_point: transformar_silver
parameters:
- "--catalog=gold"
- "--date={{ds}}"
job_cluster_key: cluster_transform
- task_key: validacao
depends_on:
- task_key: transformacao_silver
notebook_task:
notebook_path: ./src/notebooks/validacao.py
job_cluster_key: cluster_transform
- task_key: dlt_gold
depends_on:
- task_key: validacao
pipeline_task:
pipeline_id: "{{pipelines.dlt_pedidos}}" # referência ao pipeline DLT
full_refresh: false
job_clusters:
- job_cluster_key: cluster_ingestion
new_cluster:
spark_version: "15.4.x-scala2.12"
node_type_id: Standard_D4ds_v5
num_workers: 2
data_security_mode: SINGLE_USER
- job_cluster_key: cluster_transform
new_cluster:
spark_version: "15.4.x-scala2.12"
node_type_id: Standard_D8ds_v5
autoscale:
min_workers: 2
max_workers: 8
data_security_mode: SINGLE_USERTriggers
Agendamento (Cron)
schedule:
quartz_cron_expression: "0 30 8 * * MON-FRI" # 08:30 seg-sex
timezone_id: "America/Sao_Paulo"Sintaxe Quartz Cron: segundos minutos horas dia-do-mês mês dia-da-semana
File Arrival Trigger
Dispara quando um novo arquivo chega em um path monitorado:
trigger:
file_arrival:
url: "s3://meu-bucket/landing/pedidos/"
min_time_between_triggers_seconds: 300 # no mínimo 5 min entre triggers
wait_after_last_change_seconds: 60 # aguarda 60s de inatividadeContinuous (low latency)
trigger:
pause_status: UNPAUSED
continuous:
pause_status: UNPAUSEDManual / API
# Via CLI
databricks jobs run-now --job-id 12345
# Com parâmetros
databricks jobs run-now --job-id 12345 \
--notebook-params '{"data": "2026-05-01", "catalog": "gold"}'Task parameters e variáveis dinâmicas
Databricks suporta dynamic value references, variáveis preenchidas automaticamente em runtime:
| Variável | Valor |
|---|---|
{{job.id}} | ID do job |
{{run.id}} | ID da execução atual |
{{start_time}} | Timestamp de início (epoch ms) |
{{ds}} | Data da execução agendada (YYYY-MM-DD) |
{{tasks.<task_key>.values.<output_key>}} | Output de task anterior |
Task values: passar dados entre tasks
# Task A: produz um valor de saída
from databricks.sdk.runtime import dbutils
dbutils.jobs.taskValues.set(key="qtd_registros", value=1234)
# Task B: consome o valor da Task A
qtd = dbutils.jobs.taskValues.get(
taskKey="task_a",
key="qtd_registros",
default=0,
debugValue=0
)For Each Task
Executa iterativamente uma sub-task para cada item de uma lista:
- task_key: processar_regioes
for_each_task:
inputs: "[\"SP\", \"RJ\", \"MG\", \"RS\"]"
concurrency: 3 # até 3 iterações em paralelo
task:
task_key: processar_regiao_iter
notebook_task:
notebook_path: ./src/notebooks/processar_regiao.py
base_parameters:
regiao: "{{input}}" # valor da iteração atualRepair Run
Quando um job falha, é possível re-executar apenas as tasks que falharam (sem re-executar as que já tiveram sucesso):
# Via CLI
databricks jobs repair-run --run-id 98765 --rerun-tasks "transformacao_silver,validacao"
# Via UI: Run > Repair Run > selecionar tasksEssencial para jobs com muitas tasks onde re-executar do zero seria caro.
Jobs vs. Airflow
| Databricks Jobs | Apache Airflow | |
|---|---|---|
| Setup | Zero (nativo) | Requer infraestrutura separada |
| Integração Databricks | Nativa | Via DatabricksRunNowOperator |
| Tasks externas ao Databricks | Não (só recursos DB) | Sim (qualquer sistema via operators) |
| Observabilidade | Dashboard nativo | Airflow UI + integração externa |
| Quando preferir | Pipeline 100% Databricks | Orquestração multi-sistema |
Ver também: databricks | databricks-asset-bundles | databricks-lakeflow-pipelines | databricks-clusters | ferramentas-engenharia-dados