Translate
domingo, 26 de mayo de 2019
Clases que componen Apache Cassandra Parte 2
Y llego la continuación del post "Clases que componen Apache Cassandra"
El Protocolo nativo CQL es el protocolo binario utilizado por los clientes para comunicarse con Cassandra. El paquete org.apache.cassandra.transport contiene las clases que implementan este protocolo, incluido el Servidor. Este servidor de transporte nativo administra las conexiones de clientes y enruta las solicitudes entrantes, delegando el trabajo de realizar consultas al StorageProxy.
Hay varias otras clases que manejan las características clave de Cassandra. Aquí hay algunos para investigar si estás interesado:
Clases que componen Apache Cassandra
Hay un conjunto de clases que forman los mecanismos básicos de control interno de Cassandra. Ya nos hemos encontrado con algunos de ellos en post anteriores, incluidos Hinted HandOffManager, CompactionManager y StageManager. Aquí presentamos una breve descripción de algunas otras clases para que pueda familiarizarse con algunas de las más importantes. Muchos de ellos exponen los MBeans a través de Java Management Extension (JMX) para informar el estado y las métricas y, en algunos casos, permitir la configuración y el control de sus actividades.
La interfaz org.apache.cassandra.service.CassandraDaemon representa el ciclo de vida del servicio Cassandra ejecutándose en un solo nodo. Incluye las operaciones típicas de ciclo de vida que se podrían esperar: iniciar, detener, activar, desactivar y destruir.
También puede crear una instancia de Cassandra en memoria mediante programación utilizando la clase org.apache.cassandra.service.EmbeddedCassandraService. Crear una instancia embebida puede ser útil para los programas de prueba unitaria que usan Cassandra.
La funcionalidad de almacenamiento de datos principal de Cassandra se conoce comúnmente como el motor de almacenamiento, que consiste principalmente en clases en el paquete org.apache.cassandra.db. El punto de entrada principal es la clase ColumnFamilyStore, que administra todos los aspectos del almacenamiento de tablas, incluidos los registros de confirmación, memtables, SSTables e índices.
Cassandra encasula el motor de almacenamiento en servicio representado por la
clase org.apache.cassandra.service.StorageService. El servicio de almacenamiento contiene el token del nodo, que es un marcador que indica el rango de datos de los que es responsable el nodo.
El servidor se inicia con una llamada al método initServer de esta clase, en el que el servidor registra los controladores SEDA, realiza algunas determinaciones sobre su estado (por ejemplo, si fue un programa de arranque o no, y cuál es su particionador), y registra un MBean con el servidor JMX.
El propósito de org.apache.cassandra.net.MessagingService es crear listeners de socket para el intercambio de mensajes; los mensajes entrantes y salientes de este nodo llegan a través de este servicio. El método MessagingService.listen crea un hilo. Cada conexión entrante luego se sumerge en el grupo de subprocesos ExecutorService usando org.apache.cassandra.net.IncomingTcpConnection (una clase que extiende Thread) para deserializar el mensaje. El mensaje se valida y luego se enruta al controlador apropiado.
Debido a que MessagingService también hace un uso intensivo de las etapas y el grupo que mantiene está envuelto con un MBean, puede descubrir mucho sobre cómo está funcionando este servicio (si las lecturas se están respaldando y demás) a través de JMX.
La transmisión por secuencias es la forma optimizada de Cassandra de enviar secciones de archivos SSTable de un nodo a otro a través de una conexión TCP persistente; todas las demás comunicaciones entre nodos se producen a través de mensajes serializados. org.apache.cassandra.streaming.StreamManager maneja estos mensajes de transmisión, incluida la administración de la conexión, la compresión de mensajes, el seguimiento de progreso y las estadísticas.
Nos quedan unas cuantas clases que seguiremos viendo en una parte 2.
viernes, 24 de mayo de 2019
Usando .NET y Docker
NET Core es cada día más amigable con docker y todas las mejoras se centraron en .NET Core 3.0. El cambio más importante fue la reducción de la memoria que utiliza en tiempo de ejecución de .NET Core (CoreCLR) de forma predeterminada. El CoreCLR gestiona la ejecución de todos los programas .NET Core; la memoria que utiliza de forma predeterminada es la cantidad de memoria asignada inicialmente cuando se ejecuta un programa .NET. Reducir el uso de memoria CoreCLR predeterminado significa aumentar la eficiencia de uso de memoria del contenedor sin cambiar la configuración predeterminada de .NET Core.
Con las modificaciones recientes, .NET Core 3.0 ahora también admite límites de recursos de Docker (memoria y CPU). Los límites de recursos permiten controlar cuánta memoria o CPU puede usar un contenedor. Estos límites se describen en términos de cantidad tanto para la memoria como para la CPU (es decir, 128 MB de memoria o dos CPU). Cuando se establecen los límites de memoria, .NET Core 3.0 cambia su comportamiento en consecuencia: el tamaño del montón del recolector de basura está limitado a 20 MB o 75% del límite de memoria. En el caso de los límites de la CPU, el valor establecido en Docker se redondea al siguiente valor entero. Este valor es el número máximo efectivo de núcleos de CPU utilizados por CoreCLR.
Las mejoras también afectaron la capacidad de uso de .NET en los contenedores de Docker a un nivel superior. De acuerdo con la solicitud de la comunidad, Microsoft agregó PowerShell Core como una aplicación independiente a las imágenes de contenedor de .NET Core SDK Docker disponibles. Además, las imágenes de contenedor de .NET Core ahora están disponibles a través de Microsoft Container Registry (MCR). Esto permite utilizar Microsoft Azure como la fuente oficial de imágenes de contenedor provistas por Microsoft, y como una red de distribución de contenido global (CDN) para entregar imágenes de contenedor de acuerdo con la ubicación geográfica del usuario.
Si bien .NET Core es compatible con múltiples distribuciones y versiones de plataforma, la lista de distribuciones compatibles para Docker es mucho más pequeña. Por el momento, solo se admiten versiones específicas de las distribuciones Alpine, Debian y Ubuntu, junto con todas las versiones de Windows Nano Server. El equipo de .NET Core está en proceso de agregar soporte para ARM64 en Linux.
Richard Lander, gerente de programas del equipo de .NET, dijo en la publicación del blog sobre las mejoras: "Estamos comprometidos en hacer de .NET un runtime de contenedores. En versiones anteriores, pensamos en .NET Core como un contenedor amigable. Ahora estamos fortaleciendo el tiempo de ejecución para que sea consciente de los contenedores y funcione de manera eficiente en entornos de poca memoria ".
La comunidad .NET recibió bien las mejoras en el rendimiento del marco. Además de la publicación del blog, los oradores de Microsoft y Docker presentaron varias sesiones en DockerCon 2019 relacionadas con el desarrollo de .NET mediante contenedores. Una de estas sesiones se centró en la contención de aplicaciones .NET heredadas, que es un tema de especial interés para las empresas con una larga historia de desarrollo utilizando .NET. Esta sesión fue organizada por un representante de Docker, e ilustra los esfuerzos recientes de la compañía de estimular el uso de contenedores por parte de la industria y apoyar a la comunidad de desarrolladores.
Los esfuerzos de Microsoft parecen alinearse con las intenciones de Docker, así como con otras iniciativas de diferentes comunidades de desarrollo. Otras áreas de productos de Microsoft están siguiendo la misma tendencia: a principios de este mes, Microsoft lanzó una nueva extensión de desarrollo remoto para VS Code, que permite el desarrollo continuo utilizando contenedores remotos junto con una instancia local de VS Code.
Dejo link: https://devblogs.microsoft.com/dotnet/using-net-and-docker-together-dockercon-2019-update/
domingo, 19 de mayo de 2019
Arquitectura dirigida por eventos (SEDA) en Apache Cassandra
El diseño de Cassandra fue influenciado por Staged Event-Driven Architecture (SEDA). SEDA es una arquitectura general para servicios de Internet altamente concurrentes, propuesta originalmente en un documento de 2001 llamado "SEDA: An Architecture for Well-Conditioned, Scalable
Internet Services" de Matt Welsh, David Culler y Eric Brewer. Puede leer el documento original de SEDA en http://www.eecs.harvard.edu/~mdw/proj/seda.
En una aplicación típica, una sola unidad de trabajo se realiza a menudo dentro de los límites de un solo hilo. Una operación de escritura, por ejemplo, comenzará y terminará dentro del mismo hilo. Cassandra, sin embargo, es diferente: su modelo de concurrencia se basa en SEDA, por lo que una sola operación puede comenzar con un hilo, que luego pasa el trabajo a otro hilo, que puede pasarlo a otros hilos. Pero no corresponde al hilo actual entregar el trabajo a otro hilo. En su lugar, el trabajo se subdivide en lo que se denomina etapas, y el grupo de subprocesos (en realidad, un servicio java.util.concurrent.Executor) asociado con la etapa determina la ejecución.
Una etapa es una unidad básica de trabajo, y una sola operación puede realizar una transición interna de estado de una etapa a la siguiente. Debido a que cada etapa puede ser manejada por un grupo de subprocesos diferente, Cassandra experimenta una mejora masiva del rendimiento. Este diseño también significa que Cassandra puede administrar mejor sus propios recursos internamente porque diferentes operaciones pueden requerir Entrada y Salida de disco, o pueden estar vinculadas al CPU, o pueden ser operaciones de red, y así sucesivamente, para que los grupos puedan administrar su trabajo de acuerdo a la disponibilidad de estos recursos.
Una etapa consiste en una cola de eventos entrantes, un controlador de eventos y un grupo de subprocesos asociado. Las etapas son administradas por un controlador que determina la programación y la asignación de subprocesos; Cassandra implementa este tipo de modelo de concurrencia utilizando el grupo de subprocesos java.util.concurrent.ExecutorService. Para ver específicamente cómo funciona esto, echa un vistazo a la clase org.apache.cassandra.concurrent.StageManager. Las siguientes operaciones se representan como etapas en Cassandra, incluidos muchos de los conceptos que hemos analizado en post anteriores :
- Read (local reads)
- Mutation (local writes)
- Gossip
- Request/response (interactions with other nodes)
- Anti-entropy ( nodetool repair)
- Read repair
- Migration (making schema changes)
- Hinted handoff
Algunas operaciones adicionales también se implementan como etapas, como las operaciones en memtables que incluyen el vaciado de datos a SSTables y la liberación de memoria. Las etapas implementan la interfaz IVerbHandler para admitir la funcionalidad de un verbo dado. Debido a que la idea de mutación se representa como una etapa, puede desempeñar un papel en las operaciones de inserción y eliminación.
Dejo link : https://en.wikipedia.org/wiki/Staged_event-driven_architecture
sábado, 18 de mayo de 2019
Libros de Java Code Geeks
jueves, 16 de mayo de 2019
Borrar redologs viejos en Oracle
Si utilizamos las base de datos Oracle estaremos familiarizados con el modo ArchiveLog. En este modo la base de datos archiva redologs viejos, lo que nos permite realizar muchas acciones de recuperación de datos, pero nos llena el disco. Por esa razon es conveniente periodicamente remoder redologs muy antiguos.
Para hacerlo debemos utilizar la herramienta RMAN. Para esto nos logeamos en el servidor y tipiamos rman:
% rman
RMAN>
Las conexiones RMAN a una base de datos se especifican y autentican de la misma manera que las conexiones SQL * Plus a una base de datos. La única diferencia es que las conexiones RMAN a una base de datos de destino o auxiliar requieren el privilegio SYSDBA. Las palabras clave AS SYSDBA están implícitas y no se pueden especificar explícitamente.
Puede conectarse a una base de datos con opciones de línea de comandos o mediante el comando CONNECT TARGET. El siguiente ejemplo inicia RMAN y luego se conecta a una base de datos de destino a través de Oracle Net (tenga en cuenta que AS SYSDBA no se especifica porque está implícito). RMAN solicita una contraseña.
RMAN> CONNECT TARGET SYS@SERVER
Primero listamos los logs :
RMAN> list archivelog all;
Luego removemos los que tienen más de 10 días
RMAN> delete archivelog until time 'SYSDATE-10';
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=55 device type=DISK
List of Archived Log Copies for database with db_unique_name SERVER
=====================================================================
Key Thrd Seq S Low Time
------- ---- ------- - ---------
504 1 635 A 26-MAR-19
Name: /1_635_966300309.dbf
505 1 636 A 27-MAR-19
Name: /1_636_966300309.dbf
...
Do you really want to delete the above objects (enter YES or NO)? YES
deleted archived log
archived log file name=/1_635_966300309.dbf RECID=504 STAMP=1003998698
deleted archived log
...
Y Listo!
También podemos eliminar los logs y de las siguientes maneras :
RMAN>delete archivelog all;
RMAN>delete archivelog until time ‘SYSDATE-10’;
RMAN>delete archivelog from time ‘SYSDATE-10’
RMAN>delete archivelog from time ‘SYSDATE-10’ until time ‘SYSDATE-2’;
RMAN>delete archivelog from sequence 1000;
RMAN>delete archivelog until sequence 1500;
RMAN>delete archivelog from sequence 1000 until sequence 1500;
Para hacerlo debemos utilizar la herramienta RMAN. Para esto nos logeamos en el servidor y tipiamos rman:
% rman
RMAN>
Las conexiones RMAN a una base de datos se especifican y autentican de la misma manera que las conexiones SQL * Plus a una base de datos. La única diferencia es que las conexiones RMAN a una base de datos de destino o auxiliar requieren el privilegio SYSDBA. Las palabras clave AS SYSDBA están implícitas y no se pueden especificar explícitamente.
Puede conectarse a una base de datos con opciones de línea de comandos o mediante el comando CONNECT TARGET. El siguiente ejemplo inicia RMAN y luego se conecta a una base de datos de destino a través de Oracle Net (tenga en cuenta que AS SYSDBA no se especifica porque está implícito). RMAN solicita una contraseña.
RMAN> CONNECT TARGET SYS@SERVER
Primero listamos los logs :
RMAN> list archivelog all;
Luego removemos los que tienen más de 10 días
RMAN> delete archivelog until time 'SYSDATE-10';
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=55 device type=DISK
List of Archived Log Copies for database with db_unique_name SERVER
=====================================================================
Key Thrd Seq S Low Time
------- ---- ------- - ---------
504 1 635 A 26-MAR-19
Name: /1_635_966300309.dbf
505 1 636 A 27-MAR-19
Name: /1_636_966300309.dbf
...
Do you really want to delete the above objects (enter YES or NO)? YES
deleted archived log
archived log file name=/1_635_966300309.dbf RECID=504 STAMP=1003998698
deleted archived log
...
Y Listo!
También podemos eliminar los logs y de las siguientes maneras :
RMAN>delete archivelog all;
RMAN>delete archivelog until time ‘SYSDATE-10’;
RMAN>delete archivelog from time ‘SYSDATE-10’
RMAN>delete archivelog from time ‘SYSDATE-10’ until time ‘SYSDATE-2’;
RMAN>delete archivelog from sequence 1000;
RMAN>delete archivelog until sequence 1500;
RMAN>delete archivelog from sequence 1000 until sequence 1500;
domingo, 12 de mayo de 2019
Anti-Entropia, Reparación y Arboles de Merkle en Cassandra
Cassandra utiliza un protocolo anti-entropico, que es un tipo de protocolo gossip para reparación de replicas de datos. Los protocolos anti-entropicos funcionan por medio de comparación de las diferentes replicas de datos y conciliando las diferencias entre las replicas. Los protocolos anti-entropicos son usados por muchas bases de datos noSql como Amazon’s Dynamo.
La sincronización de réplicas se admite a través de dos modos diferentes conocidos como reparación de lectura y reparación anti-entropía. La reparación de lectura se refiere a la sincronización de las réplicas a medida que se leen los datos. Cassandra lee los datos de varias réplicas para alcanzar el nivel de consistencia solicitado y detecta si alguna réplica tiene valores desactualizados. Si un número insuficiente de nodos tiene el último valor, se realiza una reparación de lectura inmediatamente para actualizar las réplicas desactualizadas. De lo contrario, las reparaciones se pueden realizar en segundo plano después de las devoluciones de lectura. Esta funcionalidad no es solo de Cassandra, también es utilizada en bases noSql clave/valor como Voldemort y Riak.
La reparación anti-entropica (a veces llamada reparación manual) es una operación iniciada manualmente en nodos como parte de un proceso de mantenimiento regular. Este tipo de reparación se ejecuta mediante una herramienta llamada nodetool. La ejecución de la reparación de nodetool hace que Cassandra ejecute una compactación principal. Durante una compactación principal, el servidor inicia una conversación TreeRequest / TreeReponse para intercambiar árboles Merkle con nodos vecinos. El árbol Merkle es un hash que representa los datos en esa tabla. Si los árboles de los diferentes nodos no coinciden, deben ser reconciliados (o "reparados") para determinar los valores de datos más recientes en los que se deben configurar. Esta validación de comparación de árbol es responsabilidad de la clase org.apache.cassandra.service.AbstractReadExecutor.
Los arboles de Merkle son utilizados por Cassandra y Dynamo para conciliar los datos de diferentes nodos, su nombre se debe a su inventor Ralph Merkle y se lo conoce tambien como “hash tree.” En cassandra esto se implementa con la clase org.apache.cassandra.utils.MerkleTree.
Tanto Cassandra y Dynamo utilizan arboles hash como un protocolo anti-entropico pero su implementación es un tanto diferente. En Cassandra cada tabla tiene su propio arbol, y esto es construido como un snapshot o fotografía en el momento de una compactación principal y se mantiene solo el tiempo necesario para enviarlo a los nodos vecinos en el anillo. La ventaja de esta implementación es que reduce la entrada/salida de la red.
miércoles, 8 de mayo de 2019
Apache NetBeans fue promovido a Top-Level Apache Project
NetBeans, un entorno de desarrollo integrado (IDE), fue promovido recientemente a un proyecto Top-Level Apache Project, aproximadamente dos años y medio después de que Oracle donó su código fuente a la Fundación de software Apache.
Los equipos de desarrollo que buscan probar las funciones completas de NetBeans pueden descargar directamente NetBeans 11 desde Apache y ver una lista completa de las nuevas funciones en esta versión. Los desarrolladores pueden probar el IDE en cualquier fase de sus proyectos, incluso si actualmente se usan otros IDE.
Dejo link: https://www.globenewswire.com/news-release/2019/04/24/1808620/0/en/The-Apache-Software-Foundation-Announces-Apache-NetBeans-as-a-Top-Level-Project.html
Libros de Java Code Geeks
Download IT Guides!
|
|
|
|
Compactaciones en Apache Cassandra
La compactación es
el proceso que libera espacio en le disco mergeando los archivos de
datos que se fueron acumulando. Esto es aproximadamente análogo a la
reconstrucción de una tabla en el mundo relacional. Pero la
principal diferencia en Cassandra es que está pensada como una
operación transparente que se realiza a lo largo de la vida del
servidor.
En la compactación,
los datos combinados se ordenan, se crea un nuevo índice sobre los
datos ordenados, y los datos recién fusionados, ordenados e
indexados se escriben en un único SSTable nuevo (cada SSTable consta
de varios archivos, incluidos: Datos, Índice y Filtros).
Este proceso es
administrado por la clase
org.apache.cassandra.db.compaction.CompactionManager.
Otra función
importante de la compactación es mejorar el rendimiento al reducir
el número de búsquedas requeridas. Hay un número limitado de
SSTables para inspeccionar y encontrar los datos de la columna para
una clave dada. Si una clave se muta frecuentemente, es muy probable
que todas las mutaciones terminen en SSTables vacios. Compactarlos
evita que la base de datos tenga que realizar una búsqueda para
extraer los datos de cada SSTable a fin de ubicar el valor actual de
cada columna solicitada en una lectura.
Cuando se realiza la
compactación, hay un pico temporal en la I/O del disco y el tamaño
de los datos en el disco mientras se leen los SSTables antiguos y se
están escribiendo nuevos SSTables.
Cassandra soporta
diferentes algoritmos de compactaciones y cada estrategía de
compactación esta relacionada con un algoritmo, es decir utiliza el
patron Strategy para implementar diferentes modos de compactar. La
clase padre de las estrategías es AbstractCompactionStrategy. Y se
tienen las siguientes estrategias disponibles:
- SizeTieredCompactionStrategy (STCS) es la estrategia de compactación predeterminada y se recomienda para tablas de escritura intensiva
- LeveledCompactionStrategy (LCS) se recomienda para tablas de lectura intensiva
- DateTieredCompactionStrategy (DTCS), que está destinado a series de tiempo o datos basados en la fecha.
Una característica
interesante de la compactación se relaciona con su intersección con
la reparación incremental. Una característica llamada
anticompactación se añadió en la versión 2.1. Como su nombre lo
indica, la anti-compactación es en cierto modo una operación
opuesta a la compactación regular, ya que el resultado es la
división de un SSTable en dos SSTables, uno que contiene datos
reparados y el otro que contiene datos sin reparar. La compensación
es que se introduce una mayor complejidad en las estrategias de
compactación, que deben manejar los SSTables reparados y no
reparados por separado para que no se fusionen entre sí.
sábado, 4 de mayo de 2019
Filtros Bloom en Apache Cassandra
Los filtros Bloom se utilizan para mejorar el rendimiento de las lecturas. Su nombre es por su inventor, Burton Bloom. Los filtros Bloom son algoritmos muy rápidos y no deterministas para comprobar si un elemento es miembro de un conjunto. No son deterministas porque es posible obtener una lectura de falsos positivos de un filtro Bloom, pero no un falso negativo.
Los filtros Bloom funcionan al mapear los valores de un conjunto de datos en una matriz de bits y condensar un conjunto de datos más grande en una cadena de resumen mediante una función hash. El compendio, por definición, utiliza una cantidad de memoria mucho menor que la de los datos originales. Los filtros se almacenan en la memoria y se utilizan para mejorar el rendimiento al reducir la necesidad de acceso al disco en las búsquedas de claves. El acceso al disco suele ser mucho más lento que el acceso a la memoria. Entonces, en cierto modo, un filtro Bloom es un tipo especial de caché. Cuando se realiza una consulta, el filtro Bloom comprueba primero antes de acceder al disco.
Debido a que los falsos negativos no son posibles, si el filtro indica que el elemento no existe en el conjunto, ciertamente no lo hace; pero si el filtro piensa que el elemento está en el conjunto, se accede al disco para asegurarse.
Los filtros Bloom son implementados por la clase org.apache.cassandra.utils.BloomFilter. Cassandra proporciona la capacidad de aumentar la precisión del filtro Bloom (reduciendo el número de falsos positivos) al aumentar el tamaño del filtro, a costa de más memoria. Esta posibilidad positiva falsa es ajustable por tabla.
Los filtros Bloom se utilizan en otras bases de datos distribuidas y tecnologías de almacenamiento en caché, como Apache Hadoop, Google Bigtable y Squid Proxy Cache.
Los filtros Bloom funcionan al mapear los valores de un conjunto de datos en una matriz de bits y condensar un conjunto de datos más grande en una cadena de resumen mediante una función hash. El compendio, por definición, utiliza una cantidad de memoria mucho menor que la de los datos originales. Los filtros se almacenan en la memoria y se utilizan para mejorar el rendimiento al reducir la necesidad de acceso al disco en las búsquedas de claves. El acceso al disco suele ser mucho más lento que el acceso a la memoria. Entonces, en cierto modo, un filtro Bloom es un tipo especial de caché. Cuando se realiza una consulta, el filtro Bloom comprueba primero antes de acceder al disco.
Debido a que los falsos negativos no son posibles, si el filtro indica que el elemento no existe en el conjunto, ciertamente no lo hace; pero si el filtro piensa que el elemento está en el conjunto, se accede al disco para asegurarse.
Los filtros Bloom son implementados por la clase org.apache.cassandra.utils.BloomFilter. Cassandra proporciona la capacidad de aumentar la precisión del filtro Bloom (reduciendo el número de falsos positivos) al aumentar el tamaño del filtro, a costa de más memoria. Esta posibilidad positiva falsa es ajustable por tabla.
Los filtros Bloom se utilizan en otras bases de datos distribuidas y tecnologías de almacenamiento en caché, como Apache Hadoop, Google Bigtable y Squid Proxy Cache.
miércoles, 1 de mayo de 2019
C# y F# para Apache Spark
Microsoft anunció el lanzamiento de .NET para Apache Spark.
Microsoft anunció la versión preliminar de .NET para Apache Spark. Apache Spark está escrito en Scala, por lo que siempre ha tenido soporte nativo para este lenguaje. También ha tenido durante mucho tiempo enlaces API para Java, así como los populares lenguajes de ciencia de datos Python y R. Los nuevos enlaces de lenguaje para C# y F# están escritos en una nueva capa de interoperabilidad Spark. En las pruebas en el punto de referencia TPC-H, el rendimiento de .NET fue comparable a otros lenguajes, y en algunos casos fue "2 veces más rápido que Python".
Los desarrolladores pueden reutilizar el código y las librerías compatibles con .NET estándar y "pueden acceder a todos los aspectos de Apache Spark, incluidos Spark SQL, DataFrames, Streaming, MLLib". Los desarrolladores de la nube pueden implementar .NET para Apache Spark en Azure de Microsoft usando Azure HDInsight y Azure Databricks, o en Amazon Web Services usando Amazon EMR Spark y AWS Databricks.
La ejecución de aplicaciones .NET en Spark requiere la instalación de los binarios de Microsoft.Spark.Worker, así como un JDK y los binarios estándar de Apache Spark. El desarrollo de una aplicación requiere la instalación del paquete nuget Microsoft.Spark. Los desarrolladores de Microsoft han enviado Propuestas de mejora de proyectos Spark (SPIP) para incluir la extensión de lenguaje C# y una capa de interoperabilidad genérica en Spark. Sin embargo, Sean Owen, un comentarista de Apache Spark, comentó que sería "altamente improbable" que el trabajo se fusionara con Spark.
La hoja de ruta de .NET para Apache Spark enumera varias mejoras al proyecto que ya está en marcha, incluida la compatibilidad con Apache Spark 3.0, la compatibilidad con la vectorización de .NET Core 3.0 y la compatibilidad con VS Code. .NET para el código fuente de Apache Spark está disponible en Github.
Libros gratis de Java Geeks.
|
Tombstones en Cassandra
En el mundo relacional, podría estar acostumbrado a la idea de una "eliminación suave o eliminación logica". En lugar de ejecutar realmente una instrucción de eliminación de SQL, la aplicación emitirá una instrucción de actualización que cambia un valor en una columna llamada "eliminado", a veces se hace esto por auditoría o mantener registros historico.
Este es un concepto similar en Cassandra llamado Tombstones (que no se como traducirlo). Así es como funcionan todas las eliminaciones. Cuando ejecuta una operación de eliminación, los datos no se eliminan inmediatamente. En su lugar, se trata como una operación de actualización que coloca una marca de eliminado.Tombstones es un marcador de eliminación que se requiere para suprimir datos antiguos en SSTables hasta que se pueda ejecutar la compactación.
Hay una configuración relacionada llamada Garbage Collection Grace Seconds. Esta es la cantidad de tiempo que el servidor esperará para recolectar un registro marcado como eliminado. De forma predeterminada, se establece en 864,000 segundos, el equivalente a 10 días. Cassandra hace un seguimiento del tiempo de marcado, y una vez que esta es más antigua que GCGraceSeconds, será recogida por el recolector de basura. El propósito de este retraso es dar a un nodo que no esté disponible el tiempo de recuperación; Si un nodo está inactivo por más tiempo que este valor, entonces se trata como fallido y reemplazado.
domingo, 28 de abril de 2019
Transacciones Ligeras y Paxos en Cassandra
Cassandra proporciona una consistencia ajustable, que incluye la capacidad de lograr una consistencia fuerte al especificar niveles de consistencia suficientemente altos.
Sin embargo, una consistencia sólida no es suficiente para evitar las condiciones de competencia en los casos en que los clientes necesitan leer y luego escribir datos.
Vamos explicar esto con un ejemplo, supongamos que tenemos una tabla Cliente. Imagine que estamos creando un cliente y que desea administrar los registros de usuarios como parte de una aplicación de administración de cuentas. Al crear una nueva cuenta de usuario, nos gustaría
asegúrarnos de que el registro de usuario no exista, para no sobrescribir involuntariamente los datos de usuario existentes. Así que hacemos una lectura para ver si el registro existe primero, y luego solo realizamos la creación si el registro no existe. El comportamiento que buscamos se denomina consistencia linealizable, lo que significa que nos gustaría garantizar que ningún otro cliente pueda interponerse entre nuestras consultas de lectura y escritura con su propia modificación. Desde la versión 2.0, Cassandra admite un mecanismo de transacción ligero (o "LWT") que proporciona una consistencia linealizable.
La implementación de LWT de Cassandra se basa en Paxos. Paxos es un algoritmo de consenso que permite que los nodos pares distribuidos se pongan de acuerdo sobre una propuesta, sin necesidad de un maestro para coordinar una transacción. Paxos y otros algoritmos de consenso surgieron como alternativas a los enfoques tradicionales basados en el compromiso de dos fases para las transacciones distribuidas.
El algoritmo básico de Paxos consta de dos etapas: preparar / prometer y proponer / aceptar. Para modificar los datos, un nodo coordinador puede proponer un nuevo valor a los nodos de réplica, asumiendo el rol de líder. Otros nodos pueden actuar como líderes simultáneamente para otras modificaciones. Cada nodo de réplica verifica la propuesta, y si la propuesta es la última que ha visto, promete no aceptar las propuestas asociadas con las propuestas anteriores. Cada nodo de réplica también devuelve la última propuesta que recibió que aún está en progreso. Si la propuesta es aprobada por la mayoría de las réplicas, el líder confirma la propuesta, pero con la advertencia de que primero debe cometer cualquier propuesta en curso que haya precedido a su propia propuesta.
La implementación de Cassandra amplía el algoritmo básico de Paxos para admitir la semántica de lectura antes de escritura deseada (también conocida como "comprobar y establecer"), y permitir que el estado se reinicie entre transacciones. Lo hace insertando dos fases adicionales en el algoritmo, para que funcione de la siguiente manera:
- Preparar / prometer
- Leer / Resultados
- Proponer / Aceptar
- Cometer / Ack
Por lo tanto, una transacción exitosa requiere cuatro viajes de ida y vuelta entre el nodo coordinador y las réplicas. Esto es más costoso que una escritura regular, por lo que debe pensar detenidamente sobre su caso de uso antes de usar LWT.
Las transacciones ligeras de Cassandra están limitadas a una sola partición. Internamente, Cassandra almacena un estado Paxos para cada partición. Esto asegura que las transacciones en diferentes particiones no puedan interferir entre sí.
Puede encontrar la implementación de Cassandra del algoritmo Paxos en el paquete org.apache.cassandra.service.paxos.
Suscribirse a:
Entradas (Atom)