Operações de leitura/gravação Pyspark com DocumentDB
1. Introdução
Neste artigo vou passar um pouco mais pela parte técnica do processo em que vou fazer operações simples como Leitura e Gravação no DocumentDB com Pyspark, configuração do ambiente, drivers e também disponibilizar um código base para facilitar o desenvolvimento dessa interação.
2. MongoDB
MongoDB é um banco de dados não relacional voltado a documento, diferente dos bancos de dados tradicionais que seguem o modelo relacional, com isso já temos uma primeira diferença entre os dois onde o banco relacional é representado atraves de duas dimensões (bidimensional): linha e coluna, já o banco voltado a documento lida com dados em estruturas de documento como o JSON.
Podemos saber mais sobre o que é um banco de dados voltado a documentos no site oficial do MongoDB.
3. DocumentDB
DocumentDB é um banco de dados NoSQL voltado a documentos e semelhante ao MongoDB, sendo assim, podemos utilizar sua estrutura de leitura e escrita para nos auxiliar.
O modelo de banco de dados voltado a documentos funciona bem com casos de uso como catálogos, perfis de usuários e sistemas de gerenciamento de conteúdo, onde cada documento é único e evolui com o passar do tempo.
Podemos saber mais sobre ele com a documentação da AWS.
4. Diferença entre o DocumentDB e o MongoDB
O DocumentDB, desenvolvido pela Amazon em 2019, é um serviço de banco de dados com armazenamento de documentos rápido, confiável, escalável e totalmente gerenciável e compatível com MongoDB. Ele implementa a API do MongoDB 3.6 e o Apache Server 2.0 emulando as respostas. O MongoDB, desenvolvido pela MongoDB Inc em 2009, é um banco de dados de documentos de código aberto que armazena os dados em documentos semelhantes a JSON. Permite o manuseio de grandes volumes de dados e oferece flexibilidade aos usuários em diversas formas, seja esquema, linguagens de programação, sistemas operacionais, etc. Utiliza uma excelente linguagem de consulta para filtrar os dados de acordo com o requisito, por mais aninhados que estejam.
Embora o DocumentDB ofereça suporte a alguns recursos do MongoDB, é importante observar que ele não é totalmente compatível.
- DocumentDB é um banco de dados comercial enquanto o MongoDB um banco de dados de código aberto.
- O dimensionamento automático de dados é suportado no DocumentDB, pois os usuários podem dimensionar de 10 GB a 64 TB sem nenhum esforço.
- O escalonamento de dados é um tanto difícil para os usuários que usam o banco de dados MongoDB.
- O Amazon DocumentDB fornece tolerância a falhas dividindo os volumes de armazenamento em segmentos de 10 GB que estão espalhados por vários discos. Ele usa a abordagem de dimensionamento para isso.
- O MongoDB também fornece uma melhor capacidade de tolerância a falhas por meio da replicação do MongoDB, que permite que o sistema continue funcionando corretamente. MongoDB suporta Sharding para distribuir a carga.
Tanto o MongoDB como a plataforma cloud AWS tem artigos falando sobre a comparação entre os dois.
5. Pyspark
Pyspark é uma interface python para o Apache Spark ele facilita e intermedia a o uso das funcionalidades do spark assim conseguimos usar recursos avançados de uma forma mais fácil, como enviar processos para serem distribuídos, trabalhos com grandes quantidades de dados.
6. Pyspark Configuração e Drivers
Aqui estou importando as bibliotecas necessárias, SparkSession para iniciar a sessão spark e SparkContext para adicionar os drivers.
from pyspark.sql import SparkSession
from pyspark import SparkContext
Depois de importar as bibliotecas podemos criar a Seção spark, dar um nome para o app e configurar os jars, assim conseguimos iniciar nosso processo.
spark = SparkSession.builder.appName('pr_documentdb') \
.enableHiveSupport() \
.master('local') \
.config('spark.jars.packages', 'org.mongodb.spark:mongo-spark-connector_2.12:3.0.1') \
.config('spark.mongodb.input.uri', 'mongodb://127.0.0.1/test.myCollection?readPreference=primaryPreferred"') \
.config('spark.mongodb.output.uri', 'mongodb://127.0.0.1/test.myCollection') \
.getOrCreate()
Para conseguirmos fazer a conexão com o banco vamos precisar adicionar alguns jars que seram nessesarios para que o conector do MongoDB funcione perfeitamente.
Caso seu ambiente não tenha alguns dos jars essenciais, é possivel fazer o download deles, pra isso podemos usar mvnrepository.
spark.sparkContext._conf.getAll()
spark.sparkContext.addPyFile("/opt/spark/jars/mssql-jdbc-10.2.0.jre8.jar")
spark.sparkContext.addPyFile("/opt/spark/jars/bson-4.3.1.jar")
spark.sparkContext.addPyFile("/opt/spark/jars/mongodb-driver-core-4.3.1.jar")
spark.sparkContext.addPyFile("/opt/spark/jars/zeppelin-mongodb-0.9.0.jar")
spark.sparkContext.addPyFile("/opt/spark/jars/mongo-java-driver-3.12.10.jar")
Agora é só fazer a leitura do documento, vamos passar o endereço do DocumentDB, database e coleção.
df = spark.read.format("mongo") \
.option("uri", "mongodb://user:endereco@ip:porta/database.collection") \
.load()
df.printSchema()
Podemos também com a mesma estrutura fazer a inserção de dados, vamos passar o endereço do banco, database e coleção, assim como do código acima
df.write.format("mongo").mode("append").save()
Como vemos acima estamos usando a conexão do Mongo para fazer a interação entre o Pyspark e o DocumentDB, pois ele implementa a API do MongoDB, assim podemos fazer a leitura e escrita no banco dessa forma.
7. Alguns dos possíveis erros
- Erro de versão entre mongo, Spark, em algumas versões será necessário usar o formato como “mongo”, “mongodb” ou também “com.mongodb.spark.sql.DefaultSource”
- Erro de algum driver faltante, os mais necessários coloquei acima se caso seu ambiente não tenha, pode ser baixado o jar pela web.
- Permissão de conexão ao banco.
Para solução de alguns erros podemos verificar na documentação do MongoDB.