Indexar grandes conjuntos de dados no Azure Search

Se você precisar indexar conjuntos de dados grandes ou complexos em sua solução de pesquisa, este artigo explora estratégias para acomodar processos de longa execução no IA do Azure Search.

Essas estratégias pressupõem familiaridade com as duas abordagens básicas para importação de dados: enviar dados para um índice ou extrair dados de uma fonte de dados suportada usando um indexador de pesquisa. Se o cenário envolver o enriquecimento de IA com uso intensivo de computação, serão necessários indexadores, considerando a dependência do conjunto de habilidades neles.

Este artigo complementa o texto Dicas para aprimorar o desempenho, que oferece práticas recomendadas sobre design de índice e consulta. Um índice bem projetado que inclui apenas os campos e atributos necessários é um pré-requisito importante para indexação em grande escala.

Recomendamos usar um serviço de pesquisa mais recente, criado após 3 de abril de 2024, para obter um maior armazenamento por partição.

Observação

As estratégias descritas neste artigo pressupõem uma única fonte de dados grande. Se sua solução exigir indexação de várias fontes de dados, confira Indexar várias fontes de dados no Azure Cognitive Search para obter uma abordagem recomendada.

Dados de índice usando as APIs push

APIs Push, como a Documents Index REST API ou o método IndexDocuments (Azure SDK para .NET), são a forma mais predominante de indexação no IA do Azure Search. Para soluções que usam uma API push, a estratégia para indexação de longa duração tem um ou ambos os seguintes componentes:

  • Envio em lote de documentos
  • Como gerenciar threads

Vários documentos em lote por solicitação

Um mecanismo simples para indexar uma grande quantidade de dados é enviar vários documentos ou registros em uma solicitação. Desde que a carga útil total seja inferior a 16 MB, uma solicitação pode manipular até 1.000 documentos em uma operação de fazer upload em massa. Esses limites se aplicam se você está usando a API REST Índice de Documentos ou o método IndexDocuments no SDK do .NET. Usando qualquer uma das API, você pode empacotar 1.000 documentos no corpo de cada solicitação.

O agrupamento de documentos reduz significativamente o tempo necessário para trabalhar com um grande volume de dados. Determinar o tamanho de lote ideal para seus dados é um componente-chave de otimização de velocidades de indexação. Os dois fatores principais que influenciam o tamanho de lote ideal são:

  • O esquema do índice
  • O tamanho dos seus dados

Como o tamanho de lote ideal depende do índice e dos dados, a melhor abordagem é testar diferentes tamanhos de lote para determinar o que resulta nas velocidades de indexação mais rápidas no seu cenário. Para obter um código de exemplo para testar tamanhos de lote usando o .NET SDK, veja Tutorial: Otimizar a indexação com a API push.

Gerenciar threads e uma estratégia de repetição

Os indexadores têm gerenciamento de threads integrado, mas quando você usa as APIs push, o código do seu aplicativo precisa gerenciar threads. Certifique-se de que há threads suficientes para fazer uso total da capacidade disponível, especialmente se você aumentou recentemente as partições ou atualizou para um serviço de pesquisa de nível superior.

  1. Aumente o número de threads simultâneas no código do cliente.

  2. Conforme você aumenta as solicitações que chegam ao serviço de pesquisa, pode encontrar códigos de status HTTP indicando que a solicitação não foi totalmente concluída com sucesso. Durante a indexação, dois códigos de status HTTP comuns são:

    • 503 Serviço Não Disponível: esse erro significa que o sistema está sob carga pesada e sua solicitação não pode ser processada no momento.

    • 207 Status Múltiplo: esse erro significa que alguns documentos foram bem-sucedidos, mas pelo menos um deles falhou.

  3. Para lidar com falhas, as solicitações devem ser repetidas usando uma estratégia de repetição de retirada exponencial.

O SDK do Azure .NET tenta novamente automaticamente solicitações 503s e outras solicitações com falha, mas você precisa implementar sua própria lógica para tentar novamente solicitações 207s. Ferramentas de software livre, como Polly, também podem ser usadas para implementar uma estratégia de repetição.

Use indexadores e as APIs pull

Os indexadores têm várias funcionalidades que são úteis para processos de execução prolongada:

  • Envio em lote de documentos
  • Indexação paralela sobre dados particionados
  • Agendamento e detecção de alterações para indexação apenas de documentos novos e alterados ao longo do tempo

Os agendamentos do indexador podem retomar o processamento no último ponto de interrupção conhecido. Se os dados não estiverem totalmente indexados na janela de processamento, o indexador continuará de onde parou na próxima execução, supondo que você esteja usando uma fonte de dados que fornece detecção de alterações.

A partição de dados em fontes de dados individuais menores habilita o processamento paralelo. Você pode dividir dados de origem, por exemplo, em vários contêineres no Armazenamento de Blobs do Azure, criar uma fonte de dados para cada partição e executar os indexadores em paralelo, sujeito ao número de unidades de pesquisa do serviço Pesquisa.

Verificar o tamanho do lote do indexador

Assim como na API push, os indexadores permitem que você configure o número de itens por lote. Para indexadores com base em Criar o indexador do API REST, pode-se definir o batchSize argumento para personalizar essa configuração para corresponder melhor as características de seus dados.

Os tamanhos de lote padrão são específicos da fonte de dados. O Banco de Dados SQL do Azure e o Azure Cosmos DB têm um tamanho de lote padrão de 1.000. Em contraste, a indexação de Blobs do Azure define o tamanho do lote em 10 documentos ao reconhecer o maior tamanho médio do documento.

Agendar indexadores para processos de execução prolongada

O agendamento do indexador é um mecanismo importante para processar conjuntos de dados grandes e acomodar processos de execução lenta, como a análise de imagem em um pipeline de enriquecimento.

Normalmente, o processamento do indexador é executado em uma janela de duas horas. Se a carga de trabalho de indexação levar dias em vez de horas para ser concluída, você poderá colocar o indexador em um agendamento consecutivo e recorrente que começa a cada duas horas. Supondo que a fonte de dados tenha o rastreamento de alterações habilitado, o indexador retoma o processamento de onde parou. Nesse ritmo, um indexador pode percorrer uma lista de pendências de documentos em uma série de dias até que todos os documentos não processados sejam processados.

{
    "dataSourceName" : "hotels-ds",
    "targetIndexName" : "hotels-idx",
    "schedule" : { "interval" : "PT2H", "startTime" : "2024-01-01T00:00:00Z" }
}

Quando não há mais documentos novos ou atualizados na fonte de dados, o histórico de execução do indexador informa 0/0 documentos processados ​​e nenhum processamento ocorre.

Para obter mais informações sobre como definir agendas, veja a API REST Criar indexadorou Como agendar indexadores para IA do Azure Search.

Observação

Alguns indexadores executados em uma arquitetura de runtime mais antiga têm uma janela de processamento máximo de 24 horas, em vez de duas horas. O limite de duas horas é para processadores de conteúdo mais recentes que são executados em um ambiente multilocatário gerenciado internamente. Sempre que possível, o Azure AI Search tenta descarregar o processamento do indexador e do conjunto de habilidades para o ambiente multilocatário. Se o indexador não puder ser migrado, ele será executado no ambiente privado e poderá permanecer em execução por até 24 horas. Se você estiver agendando um indexador que exiba essas características, considere uma janela de processamento de 24 horas.

Executar indexadores em paralelo

Se você particionar os dados, poderá criar várias combinações do tipo “indexador-fonte de dados” que façam extrações de cada fonte de dados e gravações no mesmo índice de pesquisa. Como cada indexador é distinto, é possível executá-los ao mesmo tempo, o que preenche um índice de pesquisa mais rapidamente do que se você os tivesse executado sequencialmente.

Verifique se você tem capacidade suficiente. Uma unidade de pesquisa em seu serviço pode executar um indexador a qualquer momento. A criação de vários indexadores só será útil se eles puderem ser executados em paralelo.

O número de trabalhos de indexação que podem ser executados simultaneamente varia de acordo com a indexação baseada em texto e em habilidades. Para saber mais, confira Execução do indexador.

Se sua fonte de dados for um Contêiner de Armazenamento de Blobs do Azure ou Azure Data Lake Storage Gen 2, a enumeração de um grande número de blobs pode levar muito tempo (até horas) até que essa operação seja concluída. Como resultado, a contagem de documentos bem-sucedidos do seu indexador não parece aumentar durante esse tempo e pode parecer que ele não está fazendo nenhum progresso, quando está. Se você quiser que o processamento de documentos seja mais rápido para um grande número de blobs, considere particionar seus dados em vários contêineres e crie indexadores paralelos apontando para apenas um índice.

  1. Entre no portal do Azure e verifique o número de unidades de pesquisa usadas pelo serviço de pesquisa. Selecione Configurações>Dimensionar para ver o número na parte superior da página. O número de indexadores executados em paralelo é aproximadamente igual ao número de unidades de pesquisa.

  2. Particione dados de origem entre vários contêineres ou várias pastas virtuais dentro do mesmo contêiner.

  3. Crie várias fontes de dados, uma para cada partição, emparelhada com seu próprio indexador.

  4. Especifique o mesmo índice de pesquisa de destino em cada indexador.

  5. Agende os indexadores.

  6. Examine o histórico de execução e o status do indexador para confirmação.

Há alguns riscos associados à indexação paralela. Primeiro, lembre-se de que a indexação não é executada em segundo plano, aumentando a probabilidade de que as consultas sejam limitadas ou descartadas.

Segundo, o Azure AI Search não bloqueia o índice para atualizações. As gravações simultâneas são gerenciadas invocando uma nova tentativa quando uma gravação específica não é bem-sucedida na primeira tentativa, mas é possível observar um aumento nas falhas de indexação.

Embora vários conjuntos de fontes de dados de indexador possam ter como destino o mesmo índice, tenha cuidado com as execuções do indexador que podem substituir os valores existentes no índice. Se um segundo indexador-fonte de dados tiver como alvo os mesmos documentos e campos, todos os valores da primeira execução serão substituídos. Os valores de campo são substituídos por completo; um indexador não pode mesclar valores de várias execuções no mesmo campo.

Indexar Big Data no Spark

Se você tiver uma arquitetura de Big Data e seus dados estiverem em um cluster do Spark, recomendamos o SynapseML para carregar e indexar dados. O tutorial inclui etapas para chamar os serviços de IA do Azure para enriquecimento de IA, mas você também pode usar a API AzureSearchWriter para indexação de texto.