FAQ #11

Gostaria de usar o Spark Structured Stream rodando em um cluster EMR para consumir dados do Kinesis Data Stream. Contudo, vi que o Kinesis não aparece como um input-source válido na biblioteca do Spark. Existe alguma outra opção?

O Spark Structured Stream (veja mais na documentação oficial: https://spark.apache.org/docs/2.4.6/structured-streaming-programming-guide.html) é uma forma de stream do Spark que estrutura os dados lidos em um dataframe (similar a uma tabela) que podemos consultar com SQL. Mas, atualmente, essa forma de stream não dá suporte ao Kinesis Data Streams como entrada (veja a seção input-sources da documentação).

Uma alternativa é usarmos uma biblioteca de um terceiro. Podemos usar biblioteca da QuBole que nos permite conectar com o Kinesis (https://github.com/qubole/kinesis-sql) e alimentar nosso stream no Spark diretamente dela. O JAR da biblioteca pode ser gerado a partir do código indicado, mas já deixamos uma versão compilada neste link https://drive.google.com/drive/folders/1mpmUK8T7mL5CpW7-5NmtwpJyojtuqb6u?usp=sharing. Você precisa colocá-la no S3 e indicar o caminho para ela no momento do envio do job para o seu cluster EMR.

No link do Google Drive acima, você também encontra um exemplo de código que lê o Kinesis Data Stream e faz um foreach nas linhas do dataframe. Para cada linha do dataframe, a função process() envia a linha toda para o Amazon SQS. Lembre-se de fazer seu processamento antes do envio.

Note que o envio para o SQS não é feito no master, mas nos workers. Isso significa que você tem que instalar a biblioteca boto3 em cada um dos workers (e também no master). Você pode acessá-las via SSH usando a chave que gerou para o cluster e instalar a biblioteca via pip.