Política de particionamento

Aplica-se a: ✅Microsoft FabricAzure Data Explorer

A política de particionamento define se e como as extensões (fragmentos de dados) devem ser particionadas para uma tabela específica ou uma exibição materializada.

A política dispara um processo adicional em segundo plano que ocorre após a criação de extensões, após a ingestão de dados. Esse processo inclui a redefinição de dados das extensões de origem e a produção de extensões homogêneas , nas quais todos os valores da coluna designada como a chave de partição residem em uma única partição.

O objetivo principal da política de particionamento é melhorar o desempenho da consulta em cenários específicos com suporte.

Observação

Por padrão, quando uma política de particionamento de dados não é definida (é null), as extensões são particionadas por hora de criação (ingestão). Na maioria dos casos, não há necessidade de definir uma política de particionamento de dados.

Cenários com suporte

Veja a seguir os únicos cenários em que a configuração de uma política de particionamento de dados é recomendada. Em todos os outros cenários, não é recomendável definir a política.

  • Filtros frequentes em uma cardinalidade string ou coluna média ou guid alta:
    • Por exemplo: soluções multilocatários ou uma tabela de métricas em que a maioria ou todas as consultas são filtradas em uma coluna do tipo string ou , como o ou o MetricIdTenantId .guid
    • A cardinalidade média é de pelo menos 10.000 valores distintos.
    • Defina a chave de partição de hash como a string coluna ou guid e defina aPartitionAssignmentMode propriedade como uniform.
  • Agregações ou junções frequentes em uma alta cardinalidade string ou guid coluna:
    • Por exemplo, informações de IoT de muitos sensores diferentes ou registros acadêmicos de muitos alunos diferentes.
    • A alta cardinalidade é de pelo menos 1.000.000 de valores distintos, em que a distribuição de valores na coluna é aproximadamente uniforme.
    • Nesse caso, defina a chave de partição de hash como a coluna frequentemente agrupada por ou associada e defina a PartitionAssignmentMode propriedade como ByPartition.
  • Ingestão de dados fora de ordem:
    • Os dados ingeridos em uma tabela podem não ser ordenados e particionados em extensões (fragmentos) de acordo com uma coluna específica datetime que representa o tempo de criação de dados e é comumente usada para filtrar dados. Isso pode ser devido a um preenchimento de arquivos de origem heterogêneos que incluem valores de data e hora em um grande período de tempo.
    • Nesse caso, defina a chave de partição datetime de intervalo uniforme como a datetime coluna.
    • Se você precisar que as políticas de retenção e armazenamento em cache se alinhem com os valores de data e hora na coluna, em vez de se alinhar com a hora da ingestão, defina a OverrideCreationTime propriedade como true.

Cuidado

  • Não há limites embutidos em código definidos para o número de tabelas com a política de particionamento definida. No entanto, cada tabela adicional adiciona sobrecarga ao processo de particionamento de dados em segundo plano. Definir uma política em mais tabelas resultará em mais recursos sendo usados e em custos mais altos devido a transações de armazenamento subjacentes. Para obter mais informações, consulte capacidade.
  • Não é recomendável definir uma política de particionamento se o tamanho compactado dos dados por partição for menor que 1 GB.
  • O processo de particionamento resulta em artefatos de armazenamento residuais para todas as extensões substituídas durante o processo de particionamento e durante o processo de mesclagem. Espera-se que a maioria dos artefatos de armazenamento residual seja excluída durante o processo de limpeza automática. Aumentar o valor da MaxPartitionCount propriedade aumenta o número de artefatos de armazenamento residuais e pode reduzir o desempenho da limpeza.
  • Antes de aplicar uma política de particionamento em uma exibição materializada, examine as recomendações para a política de particionamento de exibições materializadas.

Chaves de partição

Os seguintes tipos de chaves de partição são suportados.

Kind Tipo de coluna Propriedades da partição Valor da partição
Hash string ou guid Function, MaxPartitionCount, Seed, PartitionAssignmentMode Function(ColumnName, MaxPartitionCount, Seed)
Gama uniforme datetime RangeSize, Reference, OverrideCreationTime bin_at(ColumnName, RangeSize, Reference)

Chave de partição de hash

Se a política incluir uma chave de partição de hash, todas as extensões homogêneas que pertencem à mesma partição serão atribuídas ao mesmo nó de dados.

Observação

A operação de particionamento de dados adiciona uma carga de processamento significativa. Recomendamos aplicar uma chave de partição de hash em uma tabela somente nas seguintes condições:

  • Se a maioria das consultas usar filtros de igualdade (==, in()).
  • A maioria das consultas agrega/une em uma coluna específica do tipo string ou guid que é de grande dimensão (cardinalidade de 10M ou superior), como um device_ID, ou user_ID.
  • O padrão de uso das tabelas particionadas está em alta carga de consulta de simultaneidade, como em aplicativos de monitoramento ou painéis.
  • Uma função de módulo de hash é usada para particionar os dados.
  • Os dados em extensões homogêneas (particionadas) são ordenados pela chave de partição hash.
    • Você não precisa incluir a chave de partição de hash na política de ordem de linha, se uma estiver definida na tabela.
  • Espera-se que as consultas que usam a estratégia de embaralhamento e nas quais o shuffle key usado em join, summarize ou make-series é a chave de partição de hash da tabela, tenham um desempenho melhor porque a quantidade de dados necessária para se mover entre nós é reduzida.

Propriedades da partição

Propriedade Descrição Valor(es) suportado(s) Valor recomendado
Function O nome de uma função de módulo de hash a ser usada. XxHash64
MaxPartitionCount O número máximo de partições a serem criadas (o argumento modulo para a função hash-modulo) por período de tempo. Na gama (1,2048]. Valores mais altos levam a uma maior sobrecarga do processo de particionamento de dados e a um número maior de extensões para cada período de tempo. O valor recomendado é 128. Valores mais altos aumentarão significativamente a sobrecarga de particionamento dos dados após a ingestão e o tamanho dos metadados e, portanto, não são recomendados.
Seed Use para randomizar o valor de hash. Um número inteiro positivo. 1, que também é o valor padrão.
PartitionAssignmentMode O modo usado para atribuir partições a nós. ByPartition: Todas as extensões homogêneas (particionadas) que pertencem à mesma partição são atribuídas ao mesmo nó.
Uniform: Os valores de partição de uma extensão são desconsiderados. As extensões são atribuídas uniformemente aos nós.
Se as consultas não se unirem ou agregarem na chave de partição de hash, use Uniform. Caso contrário, use ByPartition.

Exemplo de chave de partição de hash

Uma chave de partição de hash sobre uma stringcoluna tenant_idde tipo . Ele usa a XxHash64 função hash, com MaxPartitionCount definido como o valor 128recomendado e o padrão Seed de 1.

{
  "ColumnName": "tenant_id",
  "Kind": "Hash",
  "Properties": {
    "Function": "XxHash64",
    "MaxPartitionCount": 128,
    "Seed": 1,
    "PartitionAssignmentMode": "Uniform"
  }
}

Chave de partição de data e hora de intervalo uniforme

Observação

Aplique apenas uma chave de partição datetime de intervalo uniforme em uma datetimecoluna do tipo em uma tabela quando for improvável que os dados ingeridos na tabela sejam ordenados de acordo com essa coluna.

Nesses casos, você pode reorganizar os dados entre as extensões para que cada extensão inclua registros de um intervalo de tempo limitado. Esse processo faz com que os filtros na coluna sejam mais eficazes no momento da datetime consulta.

A função de partição usada é bin_at() e não é personalizável.

Propriedades da partição

Propriedade Descrição Valor recomendado
RangeSize Uma timespan constante escalar que indica o tamanho de cada partição datetime. Comece com o valor 1.00:00:00 (um dia). Não defina um valor mais curto, pois isso pode resultar na tabela com um grande número de pequenas extensões que não podem ser mescladas.
Reference Uma datetime constante escalar que indica um ponto fixo no tempo, de acordo com o qual as partições de data e hora estão alinhadas. Inicie com 1970-01-01 00:00:00. Se houver registros nos quais a chave de partição datetime tenha null valores, o valor da partição será definido como o valor de Reference.
OverrideCreationTime A bool indicando se os tempos de criação mínimo e máximo da extensão de resultado devem ou não ser substituídos pelo intervalo dos valores na chave de partição. Assume o padrão de false. Defina como true se os dados não forem ingeridos na ordem de hora de chegada. Por exemplo, um único arquivo de origem pode incluir valores de data e hora distantes e/ou você pode querer impor a retenção ou o armazenamento em cache com base nos valores de data e hora em vez da hora da ingestão.

Quando OverrideCreationTime é definido como true, as extensões podem ser perdidas no processo de mesclagem. As extensões serão perdidas se o tempo de criação for mais antigo que o Lookback período da política de mesclagem de extensões da tabela. Para garantir que as extensões sejam detectáveis, defina a Lookback propriedade como HotCache.

Exemplo de partição de data e hora de intervalo uniforme

O snippet mostra uma chave de partição de intervalo de data e hora uniforme em uma datetime coluna digitada chamada timestamp. Ele usa datetime(2021-01-01) como ponto de referência, com um tamanho de para cada partição, e não substitui os tempos de criação das 7d extensões.

{
  "ColumnName": "timestamp",
  "Kind": "UniformRange",
  "Properties": {
    "Reference": "2021-01-01T00:00:00",
    "RangeSize": "7.00:00:00",
    "OverrideCreationTime": false
  }
}

O objeto de política

Por padrão, a política de particionamento de dados de uma tabela é null, caso em que os dados na tabela não serão reparticionados após serem ingeridos.

A política de particionamento de dados tem as seguintes propriedades principais:

  • PartitionKeys:

    • Uma coleção de chaves de partição que definem como particionar os dados na tabela.
    • Uma tabela pode ter até 2 chaves de partição, com uma das seguintes opções:
      • Uma chave de partição de hash.
      • Uma chave de partição datetime de intervalo uniforme.
      • Uma chave de partição de hash e uma chave de partição datetime de intervalo uniforme.
    • Cada chave de partição tem as seguintes propriedades:
      • ColumnName: string - O nome da coluna de acordo com a qual os dados serão particionados.
      • Kind: string - O tipo de particionamento de dados a ser aplicado (Hash ou UniformRange).
      • Properties: property bag - Define os parâmetros de acordo com os quais o particionamento é feito.
  • EffectiveDateTime:

    • A data e hora UTC a partir da qual a política é efetiva.
    • Essa propriedade é opcional. Se não for especificado, a política entrará em vigor para os dados ingeridos depois que a política for aplicada.

Cuidado

  • Você pode definir um valor de data e hora no passado e particionar dados já ingeridos. No entanto, essa prática pode aumentar significativamente os recursos usados no processo de particionamento.
  • Na maioria dos casos, é recomendável ter apenas dados recém-assimilados particionados e evitar o particionamento de grandes quantidades de dados históricos.
  • Se você optar por particionar dados históricos, considere fazer isso gradualmente, definindo o EffectiveDateTime como um anterior datetime em etapas de até alguns dias cada vez que você alterar a política.

Exemplo de particionamento de dados

Objeto de política de particionamento de dados com duas chaves de partição.

  1. Uma chave de partição de hash sobre uma stringcoluna tenant_idde tipo .
    • Ele usa a XxHash64 função hash, com MaxPartitionCount definido como o valor 128recomendado e o padrão Seed de 1.
  2. Uma chave de partição de intervalo de data e hora uniforme sobre uma datetime coluna de tipo chamada timestamp.
    • Ele usa datetime(2021-01-01) como ponto de referência, com um tamanho de 7d para cada partição.
{
  "PartitionKeys": [
    {
      "ColumnName": "tenant_id",
      "Kind": "Hash",
      "Properties": {
        "Function": "XxHash64",
        "MaxPartitionCount": 128,
        "Seed": 1,
        "PartitionAssignmentMode": "Uniform"
      }
    },
    {
      "ColumnName": "timestamp",
      "Kind": "UniformRange",
      "Properties": {
        "Reference": "2021-01-01T00:00:00",
        "RangeSize": "7.00:00:00",
        "OverrideCreationTime": false
      }
    }
  ]
}

Propriedades adicionais

As propriedades a seguir podem ser definidas como parte da política. Essas propriedades são opcionais e recomendamos não alterá-las.

Propriedade Descrição Valor recomendado Valor padrão
MinRowCountPerOperation Destino mínimo para a soma da contagem de linhas das extensões de origem de uma única operação de particionamento de dados. 0
MaxRowCountPerOperation Destino máximo para a soma da contagem de linhas das extensões de origem de uma única operação de particionamento de dados. Defina um valor inferior a 5M se você perceber que as operações de particionamento consomem uma grande quantidade de memória ou CPU por operação. 0, com uma meta padrão de 5.000.000 de registros.
MaxOriginalSizePerOperation Destino máximo para a soma do tamanho original (em bytes) das extensões de origem de uma única operação de particionamento de dados. Se as operações de particionamento consumirem uma grande quantidade de memória ou CPU por operação, defina um valor inferior a 5 GB. 0, com um destino padrão de 5.368.709.120 bytes (5 GB).

O processo de particionamento de dados

  • O particionamento de dados é executado como um processo em segundo plano pós-ingestão.
    • Espera-se que uma tabela ingerida continuamente sempre tenha uma "cauda" de dados que ainda não foi particionada (extensões não homogêneas).
  • O particionamento de dados é executado somente em extensões frequentes, independentemente do valor da EffectiveDateTime propriedade na política.
    • Se o particionamento de extensões frias for necessário, você precisará ajustar temporariamente a política de cache.

Você pode monitorar o status de particionamento de tabelas com políticas definidas em um banco de dados usando o comando .show database extents partitioning statistics e as métricas de particionamento.

Capacidade de particionamento

  • O processo de particionamento de dados resulta na criação de mais extensões. A capacidade de mesclagem de extensões pode aumentar gradualmente, para que o processo de mesclagem de extensões possa acompanhar.

  • Se houver uma taxa de transferência de ingestão alta ou um número grande o suficiente de tabelas que tenham uma política de particionamento definida, a capacidade de partição de Extensões poderá aumentar gradualmente, para que o processo de particionamento de extensões possa acompanhar.

::: intervalo de moniker = "azure-data-explorer"

  • Para evitar o consumo de muitos recursos, esses aumentos dinâmicos são limitados. Pode ser necessário aumentá-los gradual e linearmente além do limite, se eles forem totalmente usados.
    • Se o aumento das capacidades causar um aumento significativo no uso dos recursos do cluster, você poderá escalar/ verticalmente o cluster, manualmente ou habilitando o dimensionamento automático. ::: moniker-end

Limitações

  • As tentativas de particionar dados em um banco de dados que já tem mais de 5.000.000 de extensões serão limitadas.
    • Nesses casos, a EffectiveDateTime propriedade de particionamento de políticas de tabelas no banco de dados será automaticamente atrasada por várias horas, para que você possa reavaliar sua configuração e políticas.

Valores discrepantes em colunas particionadas

  • As seguintes situações podem contribuir para a distribuição desequilibrada de dados entre nós e degradar o desempenho da consulta:
    • Se uma chave de partição de hash incluir valores muito mais prevalentes do que outros, por exemplo, uma cadeia de caracteres vazia ou um valor genérico (como null ou N/A).
    • Os valores representam uma entidade (como tenant_id) que é mais prevalente no conjunto de dados.
  • Se uma chave de partição datetime de intervalo uniforme tiver uma porcentagem grande o suficiente de valores que estão "longe" da maioria dos valores na coluna, a sobrecarga do processo de particionamento de dados será aumentada e poderá levar a muitas pequenas extensões a serem controladas. Um exemplo dessa situação são os valores de data e hora do passado ou futuro distante.

Em ambos os casos, "corrija" os dados ou filtre todos os registros irrelevantes nos dados antes ou no momento da ingestão, para reduzir a sobrecarga do particionamento de dados. Por exemplo, use uma política de atualização.