Cómo crear una caché con Apache Ignite para Spark

Última actualización: 04/10/2020

Una de las ventajas que ofrece Apache Ignite es la posibilidad de usar la memoria de un clúster para almacenar una caché de datos con una alta disponibilidad y de forma distribuida para Big Data.

Caché Apache Ignite

También proporciona una API para Apache Spark, con la que es posible compartir los mismos datos en memoria entre los workers de Spark, con el ahorro de RAM que puede suponer el no tener que emplear, por ejemplo, el mecanismo de broadcast de variables.

El acceso a los datos almacenados en Ignite se puede realizar mediante consultas por clave o bien mediante SQL, generando un conjunto de datos de tipo IgniteRDD. En este artículo nos vamos a centrar en las consultas por clave.

Propiedades de la caché en Apache Ignite para Spark

Es necesario definir en un fichero XML las propiedades que va a tener cada caché en Ignite. Un ejemplo de caché sencilla es la siguiente:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util
                           http://www.springframework.org/schema/util/spring-util.xsd">
    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="gridName" value="testGrid"/>
        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="9000"/>
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <value>10.0.0.2:8000</value>
                                <value>10.0.0.3:8000</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>

        <property name="communicationSpi">
            <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                <property name="localPort" value="8001"/>
                <property name="localPortRange" value="1"/>
            </bean>
        </property>

        <property name="cacheConfiguration">
            <list>
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="cache1"/>
                    <property name="cacheMode" value="PARTITIONED"/>
                    <property name="readThrough" value="false"/>
                    <property name="writeThrough" value="false"/>
                    <property name="memoryMode" value="OFFHEAP_TIERED"/>

                    <property name="queryEntities">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryEntity">
                                <property name="keyType" value="java.lang.String"/>
                                <property name="valueType" value="java.lang.String"/>

                                <property name="fields">
                                    <map>
                                        <entry key="value" value="byte[]"/>
                                    </map>
                                </property>
                            </bean>
                        </list>
                    </property>
                </bean>

            </list>
        </property>
    </bean>
</beans>

En esta configuración se ha definido un clúster de Ignite llamado “testGrid” formado por dos nodos y una caché llamada “cache1”.

La estructura de datos en memoria de la caché se compone de una clave para realizar las búsquedas de tipo String y un valor asociado del mismo tipo. Es una estructura de tipo hashmap distribuído y con complejidad de lectura constante O(1).

Además de los tipos de datos se han especificado las siguientes propiedades para la caché:

Modo Particionado: Este modo de funcionamiento de la caché permite dividir los datos en particiones y repartir la carga entre los nodos de Ignite, por lo tanto, aprovecha toda la memoria combinada disponible en los nodos.

Modo de memoria OFFHEAP_TIERED: Permite almacenar las entradas de la caché fuera del heap asignado a la JVM, y por tanto ahorrar tiempos de ejecución del Garbage Collector (GC).

esquema ignite spark

Se han deshabilitado las opciones read-through y write-through al no necesitar ni tener activada la persistencia de datos de Ignite.

En el futuro continuaré esta guía con las siguientes secciones:


¡Echa un ojo a mi lista de reproducción de Big Data en Youtube!

Si te ayuda el contenido del blog, por favor considera unirte a la lista de correo para reconocer el trabajo!

Deja una respuesta