FAQ #7

Minha função AWS alimenta um stream no Kinesis Data Streams com registros que serão consumidos pelo AWS EMR. Gostaria de saber se preciso dividir os dados em registros diferentes ou se devo enviar tudo como um único registro?

Esta é uma importante decisão de projeto e para tomar esta decisão você precisa levar em consideração dois aspectos: os limites do Kinesis Data Streams e a complexidade do processamento no EMR.

O tamanho máximo de um registro no Kinesis, considerando apenas a carga útil de dados e não os demais dados inseridos pelo próprio Kinesis, é de 1 Megabyte (MB). Assim, caso queira usar um único registro você precisaria garantir que seu tamanho não ultrapasse este limite. Por outro lado, usando vários registros pequenos você vai precisar alocar corretamente a quantidade de shards (fragmento/estilhaço) no stream do Kinesis, já que cada stream pode comportar até 1000 registros de escrita por segundo.

Sobre a parte da complexidade de processamento, como seu projeto tem duas etapas de processamento (Lambda e EMR) é importante pensar qual parte da computação você quer fazer em cada etapa.

Suponha que sua função Lambda envia uma série de leituras de um sensor acompanhadas de um timestamp e que o EMR deve fazer uma média móvel destes dados. Faz sentido que estes dados já cheguem em registros separados, dado que o processo de separação é relativamente simples. Agora imagine que seus dados são fluxos de comentários em um site e que seu processamento no EMR é descobrir as hashtags mais usadas. Estes dados podem chegar agregados no EMR, já que o processo de separar as hashtags em cada comentário pode ser custoso para a função Lambda.