quinta-feira, 14 de outubro de 2010

Particionamento no PowerCenter - Pipeline Partitioning

Escrevo este post sobre um dos temas mais importantes sobre o PowerCenter atualmente, o Particionamento. Por ser um recurso precioso de otimização de carga e que a maioria das empresas possuem comprado, os desenvolvedores devem conhecer, no mínimo, os principais tipos de particionamento e onde pode ser aplicado no seu dia-a-dia. São estas informações que eu trago no texto abaixo.

Quando usar Particionamento?
Algumas vezes necessitamos de acelerar a entrega das informações de uma determinada carga e podemos utilizar nesses casos o plug-in de Particionamento do PowerCenter. Com este plug-in podemos criar até 64 threads (partições) para acelerarmos o tempo de execução de um processo demorado.

Como usar Particionamento?
A partir de um mapa construído, é preciso apenas na sessão ser definida a quantidade de partições (threads) que você quer utilizar e selecionar o tipo apropriado em cada transformation. Dessa forma, não é necessário construir um mapa “próprio” para ser particionado, como é o caso atualmente do DataStage Parallel.

Tipos de Particionamento:

Pass-Through
Este é o tipo de Particionamento mais comum. Os dados de cada partição não são reorganizados quando você usa este tipo. Os dados de cada partição continuam na mesma partição ao passar por uma transformation com este tipo de particionamento configurado.

Hash Auto-Keys
O próprio PowerCenter define por qual campo os dados irão ser organizados na partição por um valor hash interno. Normalmente utilizamos este tipo de particionamento em sorter, joiner e aggretator. Dessa forma, o PowerCenter agrupa os dados de acordo com o campo que é feita a ordenação, a condition ou o group by, respectivamente.

Hash User-Keys
O usuário define o campo que deseja q o PowerCenter organize os dados utilizando um campo interno de hash.

Round-Robin
O intuito deste tipo de Particionamento é fazer o balanceamento da quantidade dos dados nas partições criadas. Suponha que você tenha uma sessão com 4 partições: a primeira possui 1000 registros, a segunda 10, a terceira 90 e a quarta 100. Utilizando este tipo de Particionamento os dados serão reorganizados de forma que cada partição tenha 1200/4=300 registros. Isto é útil para a distribuição correta de CPU/memória para processamento dos dados e sincronização da finalização de carga de cada partição.

Key-Range
Para este tipo, o usuário pode definir o intervalo de dados de um determinado campo que deseja dividir por cada partição. Se você quiser dividir, por exemplo, pessoas do sexo masculino e feminino em duas partições e gravar em arquivos separadamente, basta usar este Particionamento.

Database Partitioning
Você pode utilizar este tipo de partição em sources e targets, definindo nos mesmos, a partição que está criada fisicamente no banco de dados.

Cuidados ao utilizar Particionamento
O maior cuidado em usar Particionamento é definir o tipo correto em cada transformation. Caso você não defina o tipo correto, quando você utilizar joiner e aggregator, por exemplo, os dados podem ser gerados inconsistentes.

Quando definimos partições na sessão, podemos definir o tipo de merge dos arquivos gerados. O padrão é o Seqüencial Merge. Neste tipo de merge os arquivos gerados das partições são gravados seqüencialmente num único arquivo. Usando o Cuncorrent Merge, não são gerados os arquivos outputs temporários. O arquivo de merge é gerado de acordo com que os dados são gravados em cada partição. Este segundo tipo de merge costuma ser mais rápido.

Pontos que poderiam melhorar
Para a extração de dados de um banco de dados usando particionamento precisamos definir manualmente o SQL ou o intervalo de registros que queremos que os dados sejam buscados. Poderia ser implementado no PowerCenter uma distribuição automática de uma tabela no banco pelas partições criadas, utilizando, por exemplo, o intervalo de rowid de cada partição. Essa característica está presente atualmente no Datastage Parallel.

Abraço a todos.
Marcos David M Caliman