En nombre del equipo del SDK me complace anunciar el lanzamiento de la segunda versión principal del Conector Spark de Couchbase que, lo más importante, aporta compatibilidad con la serie Apache Spark 2.0.x.
Un agradecimiento especial a los colaboradores de la comunidad Luca Rosellini y Shivansh Srivastava que contribuyeron al conector y ayudaron a ponerlo a punto para esta versión.
Conseguirlo
Como antes, los artefactos se publican en Maven Central bajo las siguientes coordenadas:
- groupId:com.couchbase.client
- artifactId: spark-connector_2.10 o spark-connector_2.11
- versión: 2.0.0
Si está utilizando sbt, sólo tiene que utilizar "com.couchbase.client" %% "spark-connector" % "2.0.0".
Tenga en cuenta que también se publican a través de spark-packages.org y también puede descargarse como archivo (aquí para Scala 2.10 así como Scala 2.11).
Destacados
Además de ofrecer compatibilidad con Spark 2.0.x y varias correcciones de errores, esta versión incluye compatibilidad mejorada con Spark Streaming, así como compatibilidad inicial con Streaming estructurado.
Spark Streams
Anteriormente, el Conector ofrecía soporte experimental para DStreams se basa en una implementación de DCP (el protocolo de cambio de Couchbase) que forma parte del SDK de Java. Por varias razones, hemos tenido problemas con eso y como resultado estamos invirtiendo un esfuerzo significativo para construir una aplicación independiente. DCP-cliente con pocos gastos, estable y listo para la producción.
El Spark Connector 2.0.0 se basa en una versión preliminar de este nuevo cliente y en el futuro estabilizará su implementación junto con la dependencia. Como resultado, la implementación actual permite por primera vez escalar dinámicamente el clúster mientras se transmiten los cambios, soporta el control de flujo automático, así como el manejo simple y transparente de la reversión en caso de fallos de nodo.
Desde el punto de vista de la API todos esos cambios son transparentes, se usan los mismos métodos para iniciar el stream así como para consumir los mensajes. Aquí hay un ejemplo que crea un DStream e imprime cada mutación y borrado que llega desde el servidor. Es posible iniciar el flujo desde el principio o "ahora", donde "ahora" es el estado actual del sistema por lo que sólo las futuras mutaciones y borrados serán enviados a través del flujo.
En las próximas versiones estamos planeando proporcionar soporte para la persistencia de la información de instantáneas y restaurar el estado de ellos para sobrevivir mejor a los fallos del nodo Spark y reinicios de la aplicación. Si necesitas esas garantías ahora mismo, sigue leyendo sobre el soporte de Structured Streaming, que hoy en día ya proporciona esto utilizando la funcionalidad de Spark.
Streaming estructurado
El soporte para Structured Streaming también se basa en el nuevo cliente DCP, pero como Spark trata las mutaciones como una estructura de tabla de sólo apéndice, en este momento sólo se transmiten los cambios en los documentos y se ignoran las eliminaciones. Una vez que las supresiones puedan ser señaladas correctamente a Spark, proporcionaremos soporte para ello también.
El conector permite utilizarlo como fuente o como sumidero.
Spark mantiene su propio WAL (Write Ahead Log) y snapshots cuando consunga stream por lo que es posible (aunque no tan eficiente como nos gustaría en futuras versiones) reanudar el estado de forma transparente desde la última mutación consumida.
Dado que una abstracción de tabla requiere algún tipo de esquema, se recomienda proporcionar uno personalizado basado en sus documentos, de lo contrario se utiliza un esquema por defecto que funciona pero sólo proporciona una visión limitada del contenido de una mutación. El esquema por defecto es el siguiente:
El siguiente ejemplo muestra cómo todas las mutaciones del cubo "muestra-viaje" se transmiten y luego se almacenan en el esquema proporcionado. Como imprimir todas las mutaciones no es muy interesante, las agrupa por el campo "tipo" e imprime el número de veces que aparecen:
Dado que Spark mantiene un recuento total, prueba a cambiar uno de los documentos en la interfaz de usuario del servidor y verás cómo el recuento de su tipo aumenta en uno en los registros de Spark.
Además de funcionar como una fuente de flujo, también puede utilizarlo como un sumidero para almacenar los resultados de nuevo en Couchbase. Un aspecto importante es especificar la columna que se utilizará como ID del documento, como se muestra en el siguiente ejemplo:
Este ejemplo consume un flujo socket, realiza un recuento de palabras en las líneas recibidas y luego almacena el recuento en Couchbase. Observe cómo el "idField" se establece en "value" para que la propia palabra se utilice como ID del documento.
Como nota final, recuerda que el Streaming Estructurado está marcado como experimental en Apache Spark, por lo que a medida que la implementación cambie y madure, adaptaremos también nuestra implementación. Dado que se trata de una nueva característica también estamos buscando activamente comentarios e informes de errores.
Véalo en acción
Si quieres probarlo pero no tienes un ejemplo concreto sobre el que trabajar, te recomiendo que eches un vistazo a nuestro repositorio de muestras que ofrece varios ejemplos basados en nuestro cubo "muestra-viaje".
Si estás en la Spark Summit Europe esta semana en Bruselas, hay una charla sobre el Conector llamada "Aumentar la base de datos operativa con Spark" donde también puede obtener más información sobre la motivación y el funcionamiento interno.
Por último, si se encuentra en la zona de la Bahía y/o viene a Couchbase Connect habrá varias presentaciones sobre Spark y su integración con Couchbase Server, ¡y nos encantaría verte allí!