Auto Loader
Use Auto Loader quando arquivos chegam ao longo do tempo e o Databricks deve descobri-los com checkpoints. ContractForge suporta execução finite available-now e registra evidências no stream e nos child batches.
Quando usar
Ingestão available-now
Execute o Auto Loader até que os arquivos atualmente disponíveis sejam processados, então pare e retorne um resultado de stream.
Aplicativos de streaming contínuo
Aplicativos de streaming de longa duração devem ser implementados como trabalhos de streaming dedicados fora do ContractForge.
Child runs
Cada microbatch executa um ingest_plan interno com um child run ID vinculado à stream run.
Métricas agregadas
ctrl_ingestion_streams armazena a contagem de lotes processados e o total de linhas lidas/gravadas/em quarentena.
Requisitos de runtime
| Exigência | Detalhes |
|---|---|
| Databricks Auto Loader | O runtime deve suportar cloudFiles e structured streaming em modo available-now. |
| Source access | O cluster ou ambiente serverless deve ler o landing path por Volume, External Location ou credenciais cloud. |
| Acesso ao ponto de verificação | O runtime deve ler e gravar o checkpoint location entre tentativas e reinícios de job. |
| Localização do esquema | O schema tracking path deve ser durável e específico da tabela. |
Exemplo JSON available-now
- YAML
- Python
source:
type: connector
connector: autoloader
format: json
path: /Volumes/main/landing/orders_json
read:
checkpoint_location: /Volumes/main/ops/checkpoints/orders_json
schema_location: /Volumes/main/ops/schemas/orders_json
available_now: true
schema: "order_id STRING, updated_at TIMESTAMP, payload STRUCT<amount:DOUBLE,status:STRING>"
cloudFiles.includeExistingFiles: true
cloudFiles.maxFilesPerTrigger: 100
target:
catalog: main
schema: bronze_sales
table: b_orders_autoloader
layer: bronze
mode: append
quality_rules:
not_null: [order_id]
from contractforge import ingest
result = ingest(
source={
"type": "connector",
"connector": "autoloader",
"format": "json",
"path": "/Volumes/main/landing/orders_json",
"read": {
"checkpoint_location": "/Volumes/main/ops/checkpoints/orders_json",
"schema_location": "/Volumes/main/ops/schemas/orders_json",
"available_now": True,
"schema": "order_id STRING, updated_at TIMESTAMP, payload STRUCT<amount:DOUBLE,status:STRING>",
"cloudFiles.includeExistingFiles": True,
"cloudFiles.maxFilesPerTrigger": 100,
},
},
catalog="main",
target_schema="bronze_sales",
target_table="b_orders_autoloader",
layer="bronze",
mode="append",
quality_rules={"not_null": ["order_id"]},
)
Exemplo de CSV disponível agora
- YAML
- Python
source:
type: connector
connector: autoloader
format: csv
path: /Volumes/main/landing/cdc_csv
read:
checkpoint_location: /Volumes/main/ops/checkpoints/cdc_csv
schema_location: /Volumes/main/ops/schemas/cdc_csv
available_now: true
schema: "submission_date DATE, state STRING, tot_cases BIGINT"
cloudFiles.includeExistingFiles: true
cloudFiles.schemaHints: "submission_date DATE, state STRING, tot_cases BIGINT"
options:
header: true
delimiter: ","
target:
catalog: main
schema: bronze_health
table: b_cdc_autoloader
layer: bronze
mode: append
from contractforge import ingest
result = ingest(
source={
"type": "connector",
"connector": "autoloader",
"format": "csv",
"path": "/Volumes/main/landing/cdc_csv",
"read": {
"checkpoint_location": "/Volumes/main/ops/checkpoints/cdc_csv",
"schema_location": "/Volumes/main/ops/schemas/cdc_csv",
"available_now": True,
"schema": "submission_date DATE, state STRING, tot_cases BIGINT",
"cloudFiles.includeExistingFiles": True,
"cloudFiles.schemaHints": "submission_date DATE, state STRING, tot_cases BIGINT",
},
"options": {
"header": True,
"delimiter": ",",
},
},
catalog="main",
target_schema="bronze_health",
target_table="b_cdc_autoloader",
layer="bronze",
mode="append",
)
Ciclo de vida de execução
- Iniciar execução do stream. ContractForge grava um registro pai em
ctrl_ingestion_streams. - Abra o Auto Loader readStream. O resolvedor de origem cria um leitor
cloudFilesa partir de opções de contrato. - Processar microlotes. Cada lote chama
ingest_planinternamente comsource=batch_df. - Métricas agregadas. As métricas de resultados em lote são normalizadas e gravadas na tabela de controle de fluxo.
- Concluir ou falhar. O status e os erros do fluxo persistem antes que o chamador receba sucesso ou uma exceção.
Locais de checkpoints e esquemas
Use locais estáveis que sobrevivam às reinicializações do trabalho. Evite caminhos de espaço de trabalho efêmeros para checkpoints de produção.
| Localização | Propósito | Recomendação |
|---|---|---|
checkpoint_location | Rastreia arquivos processados e estado de fluxo. | Use um volume controlado ou um caminho de armazenamento em nuvem dedicado à tabela. |
schema_location | Armazena informações de rastreamento de esquema do Auto Loader. | Use um caminho estável separado dos dados de origem e da tabela de destino. |
| Caminho de origem | Arquivos recebidos. | Use um prefixo de aterrissagem específico da tabela quando possível. |
Observabilidade de fluxo
Use métricas de fluxo para verificar se a ingestão disponível agora processou arquivos e gravou linhas. ContractForge agrega resultados de microlotes e métricas de execução infantil na tabela de controle de fluxo.
SELECT
stream_run_id,
status,
target_table,
batches_processed,
total_rows_read,
total_rows_written,
total_rows_quarantined,
error_message
FROM main.ops.ctrl_ingestion_streams
ORDER BY started_at_utc DESC;
SELECT
parent_run_id,
run_id,
status,
rows_read,
rows_written,
rows_quarantined
FROM main.ops.ctrl_ingestion_runs
WHERE parent_run_id = '<stream_run_id>'
ORDER BY started_at_utc;
Qualidade e quarentena em microlotes
As regras de qualidade se aplicam dentro de cada microlote. Se as linhas estiverem em quarentena, o resultado do lote filho registrará as métricas no nível da linha e o agregado do fluxo as somará.
- YAML
- Python
quality_rules:
not_null: [order_id]
expressions:
- name: positive_amount
expression: payload.amount >= 0
severity: quarantine
message: Amount must be non-negative
on_quality_fail: quarantine
from contractforge import ingest
autoloader_source = {
"type": "connector",
"connector": "autoloader",
"format": "json",
"path": "/Volumes/main/landing/orders_json",
"read": {
"checkpoint_location": "/Volumes/main/ops/checkpoints/orders_json",
"schema_location": "/Volumes/main/ops/schemas/orders_json",
"available_now": True,
"schema": "order_id STRING, updated_at TIMESTAMP, payload STRUCT<amount:DOUBLE,status:STRING>",
},
}
quality_rules = {
"not_null": ["order_id"],
"expressions": [
{
"name": "positive_amount",
"expression": "payload.amount >= 0",
"severity": "quarantine",
"message": "Amount must be non-negative",
}
],
}
result = ingest(
source=autoloader_source,
catalog="main",
target_schema="bronze_sales",
target_table="b_orders_autoloader",
layer="bronze",
mode="append",
quality_rules=quality_rules,
on_quality_fail="quarantine",
)
Problemas comuns
| Sintoma | Causa provável | Ação |
|---|---|---|
| Arquivos não coletados | O checkpoint já os marcou como processados ou includeExistingFiles é falso. | Use um novo checkpoint para testes ou valide opções de cloudFiles. |
| Erros de esquema | Desvio de esquema inferido ou localização de esquema ausente. | Declare dicas de esquema/esquema e use localização de esquema estável. |
| Stream diz zero linhas, mas o destino tem dados | Bug de agregação de métricas ou incompatibilidade de execução secundária. | Verifique ctrl_ingestion_runs.parent_run_id; as versões atuais agregam métricas secundárias. |
| Acesso negado | O runtime não pode acessar o caminho de origem/checkpoint/esquema. | Corrija localização externa, concessões de volume ou credenciais de armazenamento de cluster. |
| Fluxo contínuo esperado | O contrato usa semântica disponível agora. | Use um trabalho de streaming dedicado fora do ContractForge para fluxos sempre ativos. |