Data Partitioning

Particionar dados simplesmente divide um conjunto de dados em vários subconjuntos de acordo com uma regra que é aplicada em uma linha de dados.  Esta regra pode ser qualquer coisa que você possa separar.  No entanto, se nenhuma regra for aplicada, simplesmente chamamos de distribuição de linha.  Você pode criar suas próprias regras na forma de um plugin de método de particionamento.

O motivo do compartilhamento de dados está invariavelmente ligado ao processamento paralelo, pois permite executar determinadas tarefas em paralelo, caso contrário não será possível.
O exemplo usado nessas seções pode ser encontrado em samples/transformations/General – parallel reading and aggregation.ktr.

Particionamento para facilitar processamento paralelo

Suponha que você deseja agregar dados por estado, você pode fazer uma agregação na memória como esta:

partitioning-usercase-simple.PNG

 

Ler os dados do arquivo CSV é algo que podemos fazer em paralelo.  No entanto, se você agregasse em paralelo, veria resultados incorretos:

partitioning-usercase-parallel-error.PNG

Isto é obviamente porque as linhas são divididas arbitrariamente (sem uma regra específica) sobre as 2 cópias da etapa de agregação “contagem por estado”.
O que precisamos é uma maneira simples de direcionar as linhas do mesmo estado para a mesma cópia passo. Essa direção baseada em regras é o que chamamos de “particionamento”.
No exemplo abaixo, criamos um novo esquema de particionamento chamado “Estado” que é aplicado à etapa “contagem por estado”. Nós selecionamos a regra de particionamento “Resto de divisão” aplicada ao campo “estado”. Observe que no caso de o módulo (restante da divisão) ser calculado em um valor não inteiro, o PDI realmente calcula o módulo em uma soma de verificação criada a partir do valor String, Date, Number em questão.  Enquanto as linhas com o mesmo valor de estado forem enviadas para a mesma cópia da step, a separação ocorrerá corretamente.

partitioning-usercase-partitioned.PNG

 

Re-particionamento lógico

Na próxima imagem, mostramos como os dados são distribuídos nas steps:

partitioning-usrecase-distribution.PNG

 

Como você pode ver, a step “CSV file input” divide bem a tarefa entre as cópias das duas steps e cada cópia lê 50 linhas de dados.  No entanto, essas cópias das 2 steps também precisam direcionar as linhas na cópia correta da “contagem por estado”, onde eles chegam em uma divisão 43/57.  Devido a isso, é uma regra geral que o passo que executa a re-partição dos dados possui buffers internos de cada cópia da step de origem para cada cópia da step de destino como mostrado na seguinte imagem:

partitioning-distribution-2.PNG

 

Se você tivesse cópias de 3 steps, lendo nosso arquivo e 4 partições, o PDI alocará internamente os buffers (conjuntos de linhas), conforme mostrado na seguinte imagem:

partitioning-distribution-3.PNG

Swim-lanes

Quando um step particionado passa os dados para um outro passo particionado e o esquema de particionamento é o mesmo, o PDI irá manter os dados nas chamadas swin lanes.

Veja o seguinte exemplo:

partitioning-swim-lanes.PNG

 

Isso será executado internamente da seguinte maneira:

partitioning-swimlanes-explained.PNG

Como você pode ver, nenhum re-particionamento precisa ser feito, então nenhum buffer adicional é alocado entre as cópias das steps “count by state” e “Replace in string”.  As cópias de etapa são, como tal, totalmente isoladas uma da outra.  As linhas de dados estão, portanto, localizadas em um dos chamados dados “swin lanes” e continuarão na mesma faixa, desde que as etapas a seguir sejam particionadas com o mesmo esquema de particionamento.  Nenhum trabalho extra precisa ser feito para manter os dados particionados para que você possa encadear o máximo de etapas particionadas que necessitar.

 

As Regras

Com base nos exemplos acima, podemos formular as seguintes regras:

  • Um step particionado faz com que sua cópia seja executada por partição no esquema de partição;
  • Quando uma step precisa re-particionar os dados, ele cria buffers (conjuntos de linhas) de cada cópia de origem para cada cópia da step de destino (partição).

Note que, embora tenha muitos buffers, é uma necessidade que pode causar problemas de uso da memória se todos os buffers forem preenchidos.

Sobre o tema de quando os dados são re-particionado, também temos algumas regras:

  • Quando as linhas de dados passam de uma etapa não particionada para uma particionada, os dados são re-particionados e os buffers extras são alocados;
  • Quando as linhas de dados passam de uma step particionada para outra step particionada, particionada com o mesmo esquema de partição, os dados não são repartidos novamente;
  • Quando as linhas de dados passam de uma step particionada para outra, particionada com outro esquema de partição, os dados são re-particionados;

 

Clusterizando e Particionando

Quando uma etapa é atribuída para executar em um mestre (não agrupada em uma transformação em cluster), as mesmas regras se aplicam como mostrado acima.

No caso de uma etapa em cluster ser particionada, as partições são distribuídas sobre o número de servidores escravos.  Por causa disso, existe uma regra geral de que o número de partições precisa ser igual ou superior ao número de servidores escravos no esquema de cluster.

Por causa desta regra geral, é mais fácil fazer com que o PDI, crie o esquema de partição dinamicamente em um ambiente em cluster.

partitioning-clustered-dynamic.PNG

Certifique-se de limitar o re-particionamento em um cluster ao mínimo, pois isso incorre em uma rede de sobrecarga da CPU. Isso é causado pela passagem maciça de dados de um servidor para outro através de sockets TCP/IP.  Tente manter os dados nas pistas de natação como mostrado acima, durante o maior tempo possível, para obter o melhor desempenho em um cluster.

fonte: pentaho.com

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *