O que é o modo de listagem de diretórios do Carregador Automático?
O Carregador Automático usa o modo de listagem de diretório por padrão. No modo de listagem de diretório, o Carregador Automático identifica novos arquivos listando o diretório de entrada. O modo de listagem de diretórios permite que se inicie rapidamente fluxos do Carregador automático sem nenhuma configuração de permissão, além do acesso aos dados no armazenamento em nuvem.
Para obter o melhor desempenho com o modo de listagem de diretórios, use o Databricks Runtime 9.1 ou superior. Este artigo descreve a funcionalidade padrão do modo de listagem de diretório, bem como otimizações com base na ordenação lexical de arquivos.
Como funciona o modo de listagem de diretórios?
O Azure Databricks otimizou o modo de listagem de diretórios para o Carregador Automático descobrir arquivos no armazenamento em nuvem com mais eficiência do que outras opções do Apache Spark.
Por exemplo, se você tiver arquivos sendo carregados a cada cinco minutos como /some/path/YYYY/MM/DD/HH/fileName
, para encontrar todos os arquivos nesses diretórios, a origem do arquivo do Apache Spark listará todos os subdiretórios em paralelo. O seguinte algoritmo estima o número total de chamadas de diretório da API LIST
para o armazenamento de objetos:
1 (diretório base) + 365 (por dia) * 24 (por hora) = 8761 chamadas
Ao receber uma resposta nivelada do armazenamento, o Carregador Automático reduz o número de chamadas à API para o número de arquivos no armazenamento dividido pelo número de resultados retornados por cada chamada à API, reduzindo consideravelmente os custos de nuvem. A seguinte tabela mostra o número de arquivos retornados por cada chamada à API para o armazenamento de objetos comum:
Resultados retornados por chamada | Armazenamento de objetos |
---|---|
1000 | S3 |
5.000 | ADLS Gen2 |
1024 | GCS |
Listagem incremental (preterida)
Importante
Esse recurso foi preterido. O Databricks recomenda usar o modo de notificação de arquivo em vez de listagem incremental.
Observação
Disponível no Databricks Runtime 9.1 LTS e superior.
A listagem incremental está disponível para o Azure Data Lake Storage Gen2 (abfss://
), S3 (s3://
) e GCS (gs://
).
Para os arquivos gerados lexicograficamente, o Carregador Automático aproveita a ordenação lexical de arquivos e as APIs de listagem otimizadas para aprimorar a eficiência da listagem de diretório listando os arquivos ingeridos recentemente em vez de listar o conteúdo de todo o diretório.
Por padrão, o Carregador Automático detecta automaticamente se um diretório especificado é aplicável à listagem incremental verificando e comparando os caminhos do arquivo de listagens de diretório concluídas anteriormente. Para garantir a conclusão definitiva dos dados no modo auto
, o Carregador Automático dispara automaticamente a listagem completa de diretórios depois de concluir sete listagens incrementais consecutivas. Pode-se controlar a frequência de listas de diretórios completas definindo cloudFiles.backfillInterval
para disparar provisionamentos assíncronos em um determinado intervalo.
Ordenação lexical de arquivos
Para que os arquivos sejam ordenados lexicalmente, os novos arquivos carregados precisam ter um prefixo que seja lexicograficamente maior que os arquivos existentes. Alguns exemplos de diretórios ordenados de forma léxica são mostrados abaixo.
Arquivos com versão
O Delta Lake faz as confirmações nos logs de transações de tabela em uma ordem lexical.
<path-to-table>/_delta_log/00000000000000000000.json
<path-to-table>/_delta_log/00000000000000000001.json <- guaranteed to be written after version 0
<path-to-table>/_delta_log/00000000000000000002.json <- guaranteed to be written after version 1
...
O DMS da AWS carrega arquivos CDC para a AWS S3 com versões.
database_schema_name/table_name/LOAD00000001.csv
database_schema_name/table_name/LOAD00000002.csv
...
Arquivos particionados de data
Os arquivos podem ser carregados em um formato particionado de data. Alguns exemplos disso são:
// <base-path>/yyyy/MM/dd/HH:mm:ss-randomString
<base-path>/2021/12/01/10:11:23-b1662ecd-e05e-4bb7-a125-ad81f6e859b4.json
<base-path>/2021/12/01/10:11:23-b9794cf3-3f60-4b8d-ae11-8ea320fad9d1.json
...
// <base-path>/year=yyyy/month=MM/day=dd/hour=HH/minute=mm/randomString
<base-path>/year=2021/month=12/day=04/hour=08/minute=22/442463e5-f6fe-458a-8f69-a06aa970fc69.csv
<base-path>/year=2021/month=12/day=04/hour=08/minute=22/8f00988b-46be-4112-808d-6a35aead0d44.csv <- this may be uploaded before the file above as long as processing happens less frequently than a minute
Quando os arquivos são carregados com o particionamento de data, é necessário analisar:
- Os meses, dias, horas e minutos precisam ser deixados com zeros para garantir a ordenação lexical (devem ser carregados como
hour=03
, em vez dehour=3
ou2021/05/03
em vez de2021/5/3
). - Os arquivos não precisam necessariamente ser carregados na ordem lexical no diretório mais baixo, desde que o processamento ocorra com menos frequência do que a granularidade de tempo do diretório pai.
Alguns serviços que podem carregar arquivos em uma ordenação lexical particionada de data são:
- O Azure Data Factory pode ser configurado para carregar arquivos em uma ordem lexical. Veja um exemplo aqui.
- Kinesis Firehose
Alterar o caminho de origem para o Carregador Automático
No Databricks Runtime 11.3 LTS e posterior, você pode alternar o caminho de entrada do diretório para o Carregador Automático configurado com o modo de listagem de diretórios sem precisar escolher um novo diretório de ponto de verificação.
Aviso
Essa funcionalidade não tem suporte para o modo de notificação de arquivo. Se o modo de notificação de arquivo for usado e o caminho for alterado, você poderá falhar ao ingerir arquivos que já estão presentes no novo diretório no momento da atualização do diretório.
Por exemplo, se você desejar executar um trabalho de ingestão diário que carrega todos os dados de uma estrutura de diretório organizada por dia, como /YYYYMMDD/
, você pode usar o mesmo ponto de verificação para acompanhar informações de estado de ingestão em um diretório de origem diferente todos os dias, mantendo informações de estado para arquivos ingeridos de todos os diretórios de origem usados anteriormente.