Em nome da equipe do SDK, tenho o prazer de anunciar o lançamento da segunda versão principal do Couchbase Spark Connector, que, acima de tudo, traz compatibilidade com a série Apache Spark 2.0.x.
Um agradecimento especial aos colaboradores da comunidade Luca Rosellini e Shivansh Srivastava que contribuíram para o conector e ajudaram a deixá-lo em forma para esta versão.
Obtendo
Como antes, os artefatos são publicados no Maven Central sob as seguintes coordenadas:
- groupId:com.couchbase.client
- artifactId: spark-connector_2.10 ou spark-connector_2.11
- versão: 2.0.0
Se estiver usando o sbt, basta usar "com.couchbase.client" %% "spark-connector" % "2.0.0".
Observe que eles também são publicados por meio de spark-packages.org e também pode ser baixado como um arquivo (aqui para Scala 2.10 bem como Scala 2.11).
Destaques
Além de trazer compatibilidade com o Spark 2.0.x e várias correções de bugs, essa versão apresenta suporte aprimorado ao Spark Streaming, bem como suporte inicial para Streaming estruturado.
Fluxos do Spark
O Connector apresentava anteriormente suporte experimental para DStreams construído em uma implementação DCP (o protocolo de alteração do Couchbase) que faz parte do Java SDK. Por vários motivos, estávamos enfrentando problemas com isso e, como resultado, estamos investindo um esforço significativo para criar um Cliente DCP que tenha pouca sobrecarga, seja estável e esteja pronto para a produção.
O Spark Connector 2.0.0 foi desenvolvido com base em um pré-lançamento desse novo cliente e, no futuro, estabilizará sua implementação juntamente com a dependência. Como resultado, a implementação atual permite agora, pela primeira vez, dimensionar dinamicamente o cluster durante as alterações de streaming, além de oferecer suporte ao controle automático de fluxo e ao tratamento simples e transparente de reversão em caso de falhas de nó.
Do ponto de vista da API, todas essas alterações são transparentes, pois os mesmos métodos são usados para iniciar o fluxo e consumir as mensagens. Aqui está um exemplo que cria um DStream e imprime cada mutação e exclusão que chega do servidor. É possível iniciar o fluxo desde o início ou "agora", em que "agora" é o estado atual do sistema, de modo que somente as mutações e exclusões futuras serão enviadas pelo fluxo.
Nas próximas versões, estamos planejando oferecer suporte à persistência de informações de instantâneos e à restauração do estado a partir deles para sobreviver melhor às falhas do nó do Spark e às reinicializações do aplicativo. Se você precisar dessas garantias agora, leia sobre o suporte a Structured Streaming, que hoje já oferece isso usando a funcionalidade do Spark.
Streaming estruturado
O suporte ao Structured Streaming também se baseia no novo cliente DCP, mas como o Spark trata as mutações como uma estrutura de tabela somente de acréscimos, no momento apenas as alterações de documentos são transmitidas e as exclusões são ignoradas. Assim que as exclusões puderem ser devidamente sinalizadas ao Spark, forneceremos suporte para isso também.
O conector oferece suporte para usá-lo como fonte e/ou como coletor.
O Spark mantém seu próprio WAL (Write Ahead Log) e instantâneos quando consome o fluxo, de modo que é possível (embora não seja tão eficiente quanto gostaríamos que fosse em versões futuras) retomar o estado de forma transparente a partir da última mutação consumida.
Como uma abstração de tabela requer algum tipo de esquema, é recomendável fornecer um esquema personalizado com base em seus documentos; caso contrário, será usado um esquema padrão que funciona, mas fornece apenas uma visão limitada do conteúdo de uma mutação. O esquema padrão tem a seguinte aparência:
O exemplo a seguir mostra como todas as mutações do bucket "travel-sample" são transmitidas e, em seguida, agrupadas no esquema fornecido. Como apenas imprimir todas as mutações não é muito empolgante, ele as agrupa pelo campo "type" e imprime o número de vezes que elas aparecem:
Como o Spark mantém uma contagem total, tente alterar um dos documentos na interface do usuário do servidor e você verá a contagem do seu tipo aumentar em um nos logs do Spark.
Além de funcionar como uma fonte de fluxo, você também pode usá-lo como um coletor para armazenar os resultados de volta no Couchbase. Um aspecto importante é especificar a coluna que deve ser usada como ID do documento, conforme ilustrado no exemplo a seguir:
Esse exemplo consome um fluxo de soquete, executa uma contagem de palavras nas linhas recebidas e, em seguida, armazena a contagem no Couchbase. Observe como o "idField" está definido como "value" para que a própria palavra seja usada como ID do documento.
Como observação final, lembre-se de que o Structured Streaming em si é marcado como experimental no Apache Spark, portanto, à medida que a implementação mudar e amadurecer, adaptaremos nossa implementação também. Como esse é um novo recurso, também estamos buscando ativamente feedback e relatórios de bugs.
Veja-o em ação
Se você quiser experimentar, mas não tiver um exemplo concreto para trabalhar, recomendo que dê uma olhada em nosso repositório de amostras que fornece vários exemplos com base em nosso balde de "amostra de viagem".
Se você estiver no Spark Summit Europe esta semana em Bruxelas, haverá uma palestra sobre o Connector chamada "Aumentando o banco de dados operacional com o Spark" onde você pode saber mais sobre a motivação e os aspectos internos também.
Por fim, se você estiver na área da baía e/ou vier para Conexão com o Couchbase haverá várias apresentações sobre o Spark e sua integração com o Couchbase Server e gostaríamos de vê-lo lá!