Hi Mark,

I recently did a Proof-of-Concept with Ignite and Cassandra. There are a number 
of challenges you need to look out for:

1) In order to do SQL queries, you need to have all the data in Ignite. It is 
not practical to include other persistence layers in the query process.
The exception is Ignite Native Persistence.

2) You need to deploy the POJO for the objects (and keys if they are not basic 
types) in Ignite. This may become unnecessary in a near-future release.

3) Preloading data is not particularly efficient. Each Ignite node sends the 
preload query. Each Ignite node ignores the data it is not primary or backup 
for. It may be possible to optimize this for the case where the partitioning is 
the same in Ignite and Cassandra.
We wanted to dynamically load data from Cassandra, and thus were sensitive to 
this point.

4) Things get a bit trickier when the primary keys (partitioning) are not the 
same in Ignite and Cassandra. Only one key POJO can be deployed in Ignite, and 
it needs to handle the Ignite and Cassandra use cases.

Data Source is configured at the top level:

    <!-- Cassandra Data Source -->
    <bean id="cassandraDataSource" 
class="org.apache.ignite.cache.store.cassandra.datasource.DataSource">
        <property name="user" value="cassandra"></property>
        <property name="password" value="cassandra"></property>
        <property name="contactPoints" 
value="10.24.51.190,10.24.51.187,10.24.51.150,10.24.51.240"/>
        <property name="port" value="9042"/>
    </bean>

Persistence settings for each cache are also at the top level. Here is an 
example that has a composite primary key and some field name mappings. Note the 
CDATA section.

    <!-- Persistence settings for PortStats cache -->
    <bean id="PortStatsCachePersistenceSettings" 
class="org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings">
        <constructor-arg type="java.lang.String">
            <value><![CDATA[
                <persistence keyspace="test_11" table="port_stats">
                    <keyPersistence 
class="com.abc.poc.icpoc.model.PortStatsKey" strategy="POJO">
                        <partitionKey>
                            <field name="day"/>
                            <field name="group"/>  <!-- hash of switch-id -->
                        </partitionKey>
                        <clusterKey>
                            <field name="dateTime" column="date_time"/>
                            <field name="portId" column="port_id"/>
                        </clusterKey>
                    </keyPersistence>
                    <valuePersistence class="com.abc.poc.icpoc.model.PortStats" 
strategy="POJO">
                        <field name="portId" column="port_id"/>
                        <field name="dateTime" column="date_time"/>
                        <field name="portType" column="port_type"/>
                        <field name="switchId" column="switch_id"/>
                        <field name="rxUtil" column="rx_util"/>
                        <field name="txUtil" column="tx_util"/>
                    </valuePersistence>
                </persistence>
            ]]></value>
        </constructor-arg>
    </bean>

Lastly, in the cache config, you need to reference the persistence settings. We 
did not use write-through or write-behind.

                <bean 
class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="PortStatsCache"/>
                    <property name="cacheMode" value="PARTITIONED"/>
                    <property name="backups" value="1"/>

                    <!-- for Cassandra backing store -->
                    <property name="readThrough" value="true"/>
                    <property name="cacheStoreFactory">
                        <bean 
class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory">
                            <property name="dataSourceBean" 
value="cassandraDataSource"/>
                            <property name="persistenceSettingsBean" 
value="PortStatsCachePersistenceSettings"/>
                        </bean>
                    </property>

Hope this helps.

Roger

From: Ilya Kasnacheev [mailto:[email protected]]
Sent: Thursday, August 31, 2017 8:56 AM
To: [email protected]
Subject: Re: Ignite as Cache and Query layer for Cassandra.

Hello Mark,

I have found some documentation on how to do what the article describes:

"Apache Ignite can be inserted between Apache Cassandra and an existing 
application layer with no changes to the Cassandra data and only minimal 
changes to the application"

https://apacheignite-mix.readme.io/docs/ignite-with-apache-cassandra<https://urldefense.proofpoint.com/v2/url?u=https-3A__apacheignite-2Dmix.readme.io_docs_ignite-2Dwith-2Dapache-2Dcassandra&d=DwMFaQ&c=IL_XqQWOjubgfqINi2jTzg&r=1esZO0r0bYS90lcsaLA6N4AFxuNo6lzauhETGwdJQoQ&m=V1yhk9HVShi4pdJWzPqkw3L6T-IdasiuF8bYdpMPp7w&s=JEswLCWrb1oQBPKMEjakE1kWv0rr5KARYVMUphxYciI&e=>
On the left you can see there are config examples, tests, AWS configuration, 
etc.
Hope it's good enough.


--
Ilya Kasnacheev

2017-08-31 16:15 GMT+03:00 Mark Farnan 
<[email protected]<mailto:[email protected]>>:
Howdy,

I'm currently evaluating Ignite for a project, and am looking for some guidance 
and project sample for using Ignite over Cassandra as a cache and query layer.
Note: The Cassandra database and schema already exists and is mature.

In a Recent Infoworld post,   
(https://www.infoworld.com/article/3191895/application-development/light-a-fire-under-cassandra-with-apache-ignite.html<https://urldefense.proofpoint.com/v2/url?u=https-3A__www.infoworld.com_article_3191895_application-2Ddevelopment_light-2Da-2Dfire-2Dunder-2Dcassandra-2Dwith-2Dapache-2Dignite.html&d=DwMFaQ&c=IL_XqQWOjubgfqINi2jTzg&r=1esZO0r0bYS90lcsaLA6N4AFxuNo6lzauhETGwdJQoQ&m=V1yhk9HVShi4pdJWzPqkw3L6T-IdasiuF8bYdpMPp7w&s=9B2fqNQEKRiN4vS_MCJyh1K_6SCV1xVaPiLVEoqUqUQ&e=>)
 it stated

"No remodeling of Cassandra data
Apache Ignite reads from Apache Cassandra and other NoSQL databases, so moving 
Cassandra data into Ignite requires no data modification. The data schema can 
also be migrated directly into Ignite as is. "

However, I can't find in any documentation,  or online articles,  guidance on 
just how to do this and there are no links in the article.
  - The Ignite docs /cassandra section appear to only cover using Cassandra as 
a persistence layer,  not for going over and caching / querying an existing 
schema.   (unless I'm missing something obvious !)
  - The Youtube video cuts out to blank at the end, so no links are shown.    
The  links on the slideshare document appear to be broken.
  -  Can't find any git hub for examples on how to do this (especially not for 
the couple you tube vids)

Can anyone please point me to some working sample code and/or documentation on 
how to do this ?

I'm especially interested in not having to migrate any schema's,  nor having to 
pre-load the data into the cache.  (lazy load), which the articles imply.
Also some of the data would be too large to load it all into Ram anyway.


Any assistance greatly appreciated.


Regards

Mark.

Reply via email to