Otimizar o desempenho com cache no Azure Databricks

O Azure Databricks usa o cache de disco para acelerar as leituras de dados criando cópias de arquivos de dados remotos do Parquet no armazenamento local dos nós usando um formato de dados intermediário rápido. Os dados são automaticamente colocados em cache sempre que um ficheiro tem de ser obtido a partir de um local remoto. As leituras sucessivas dos mesmos dados são, em seguida, realizadas localmente, o que resulta numa melhoria significativa da velocidade de leitura. O cache funciona para todos os arquivos de dados do Parquet (incluindo tabelas Delta Lake).

Cache delta renomeado para cache de disco

O cache de disco no Azure Databricks era anteriormente conhecido como cache Delta e cache DBIO. O comportamento de cache de disco é um recurso proprietário do Azure Databricks. Esta mudança de nome procura resolver a confusão de que fazia parte do protocolo Delta Lake. O comportamento permanece inalterado com essa renomeação e é descrito abaixo.

Cache automático e manual

O cache de disco do Azure Databricks difere do cache do Apache Spark. O Azure Databricks recomenda o uso do cache automático de disco para a maioria das operações.

Quando o cache de disco está habilitado, os dados que precisam ser buscados de uma fonte remota são adicionados automaticamente ao cache. Este processo é totalmente transparente e não requer qualquer ação. No entanto, para pré-carregar dados no cache com antecedência, você pode usar o CACHE SELECT comando (consulte Armazenar em cache um subconjunto dos dados). Ao usar o cache do Spark, você deve especificar manualmente as tabelas e consultas a serem armazenadas em cache.

O cache de disco contém cópias locais de dados remotos. Ele pode melhorar o desempenho de uma ampla gama de consultas, mas não pode ser usado para armazenar resultados de subconsultas arbitrárias. O cache do Spark pode armazenar o resultado de quaisquer dados de subconsulta e dados armazenados em formatos diferentes do Parquet (como CSV, JSON e ORC).

Os dados armazenados no cache de disco podem ser lidos e operados mais rapidamente do que os dados no cache do Spark. Isso ocorre porque o cache de disco usa algoritmos de descompressão eficientes e produz dados no formato ideal para processamento adicional usando a geração de código de estágio inteiro.

Ao contrário do cache do Spark, o cache de disco não usa a memória do sistema. Devido às altas velocidades de leitura dos SSDs modernos, o cache de disco pode ser totalmente residente no disco sem um impacto negativo em seu desempenho.

Resumo

A tabela a seguir resume as principais diferenças entre o disco e o cache do Apache Spark para que você possa escolher a melhor ferramenta para seu fluxo de trabalho:

Funcionalidade cache de disco Cache do Apache Spark
Armazenado como Arquivos locais em um nó de trabalho. Blocos na memória, mas depende do nível de armazenamento.
Aplicada a Qualquer tabela Parquet armazenada em ABFS e outros sistemas de arquivos. Qualquer DataFrame ou RDD.
Acionado Automaticamente, na primeira leitura (se o cache estiver habilitado). Manualmente, requer alterações de código.
Avaliado Preguiçosamente. Preguiçosamente.
Forçar cache Comando CACHE SELECT .cache + qualquer ação para materializar o cache e .persist.
Disponibilidade Pode ser ativado ou desativado com sinalizadores de configuração, ativado por padrão em determinados tipos de nós. Sempre disponível.
Despejado Automaticamente na forma LRU ou em qualquer alteração de arquivo, manualmente ao reiniciar um cluster. Automaticamente à moda LRU, manualmente com unpersist.

Consistência do cache de disco

O cache de disco deteta automaticamente quando os arquivos de dados são criados, excluídos, modificados ou substituídos e atualiza seu conteúdo de acordo. Você pode gravar, modificar e excluir dados da tabela sem a necessidade de invalidar explicitamente os dados armazenados em cache. Todas as entradas obsoletas são automaticamente invalidadas e removidas do cache.

Selecionando tipos de instância para usar o cache de disco

A maneira recomendada (e mais fácil) de usar o cache de disco é escolher um tipo de trabalho com volumes SSD ao configurar o cluster. Esses trabalhadores são habilitados e configurados para cache de disco.

O cache de disco é configurado para usar no máximo metade do espaço disponível nos SSDs locais fornecidos com os nós de trabalho. Para obter opções de configuração, consulte Configurar o cache de disco.

Armazenar em cache um subconjunto dos dados

Para selecionar explicitamente um subconjunto de dados a serem armazenados em cache, use a seguinte sintaxe:

CACHE SELECT column_name[, column_name, ...] FROM [db_name.]table_name [ WHERE boolean_expression ]

Não é necessário usar esse comando para que o cache de disco funcione corretamente (os dados serão armazenados em cache automaticamente quando acessados pela primeira vez). Mas pode ser útil quando você precisa de um desempenho de consulta consistente.

Para obter exemplos e mais detalhes, consulte

Configurar o cache de disco

O Azure Databricks recomenda que você escolha tipos de instância de trabalho acelerados por cache para seus clusters. Essas instâncias são configuradas automaticamente de forma ideal para o cache de disco.

Nota

Quando um trabalhador é descomissionado, o cache do Spark armazenado nesse trabalhador é perdido. Portanto, se o dimensionamento automático estiver habilitado, haverá alguma instabilidade com o cache. O Spark precisaria então reler partições ausentes do código-fonte, conforme necessário.

Configurar o uso do disco

Para configurar como o cache de disco usa o armazenamento local dos nós de trabalho, especifique as seguintes definições de configuração do Spark durante a criação do cluster:

  • spark.databricks.io.cache.maxDiskUsage: espaço em disco por nó reservado para dados armazenados em cache em bytes
  • spark.databricks.io.cache.maxMetaDataCache: espaço em disco por nó reservado para metadados armazenados em cache em bytes
  • spark.databricks.io.cache.compression.enabled: os dados armazenados em cache devem ser armazenados em formato compactado

Exemplo de configuração:

spark.databricks.io.cache.maxDiskUsage 50g
spark.databricks.io.cache.maxMetaDataCache 1g
spark.databricks.io.cache.compression.enabled false

Habilitar ou desabilitar o cache de disco

Para habilitar e desabilitar o cache de disco, execute:

spark.conf.set("spark.databricks.io.cache.enabled", "[true | false]")

A desativação do cache não resulta na eliminação dos dados que já estão no armazenamento local. Em vez disso, ele impede que as consultas adicionem novos dados ao cache e leiam dados do cache.