将Apache Cassandra与Apache Ignite集成 [英] Integrating Apache Cassandra with Apache Ignite
问题描述
我想将Apache Ignite与Apache Cassandra(3.11.2)集成在一起,因为我想使用Ignite来缓存我已经存在的Cassandra数据库中存在的数据。
I'm trying to integrate Apache Ignite with Apache Cassandra(3.11.2) as I want to use Ignite to cache the data present in my already existing Cassandra database.
通过在线资源,到目前为止,我已经完成了以下操作:
After going through the online resources, I've done the following till now:
- 已下载 Apache Ignite 。
- 复制 libs / optional /目录中的所有文件夹到 libs /(我不知道Cassandra需要哪些)。
- 在config文件夹中创建了3个xml,即 cassandra-config.xml, connection-settings.xml;和 persistance-settings.xml。目前,我对Cassandra和Ignite使用相同的节点(172.16.129.68)。
cassandra-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Cassandra connection settings -->
<import resource="connection-settings.xml" />
<!-- Persistence settings for 'cache1' -->
<bean id="cache1_persistence_settings" class="org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings">
<constructor-arg type="org.springframework.core.io.Resource" value="file:/home/cass/apache_ignite/apache-ignite-fabric-2.4.0-bin/config/persistance-settings.xml" />
</bean>
<!-- Ignite configuration -->
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<list>
<!-- Configuring persistence for "cache1" cache -->
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="cache1"/>
<property name="readThrough" value="true"/>
<property name="writeThrough" value="true"/>
<property name="writeBehindEnabled" value="true"/>
<property name="cacheStoreFactory">
<bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory">
<property name="dataSourceBean" value="cassandraAdminDataSource"/>
<property name="persistenceSettingsBean" value="cache1_persistence_settings"/>
</bean>
</property>
</bean>
</list>
</property>
<!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. -->
<property name="discoverySpi">
<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
<property name="ipFinder">
<!--
Ignite provides several options for automatic discovery that can be used
instead os static IP based discovery. For information on all options refer
to our documentation: http://apacheignite.readme.io/docs/cluster-config
-->
<!-- Uncomment static IP finder to enable static-based discovery of initial nodes. -->
<!--<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">-->
<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
<property name="addresses">
<list>
<!-- In distributed environment, replace with actual host IP address. -->
<value>172.16.129.68:47500..47509</value>
</list>
</property>
</bean>
</property>
</bean>
</property>
</bean>
connection-settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="loadBalancingPolicy" class="com.datastax.driver.core.policies.TokenAwarePolicy">
<constructor-arg type="com.datastax.driver.core.policies.LoadBalancingPolicy">
<bean class="com.datastax.driver.core.policies.RoundRobinPolicy"/>
</constructor-arg>
</bean>
<bean id="cassandraAdminDataSource" class="org.apache.ignite.cache.store.cassandra.datasource.DataSource">
<property name="port" value="9042"/>
<property name="contactPoints" value="172.16.129.68"/>
<property name="readConsistency" value="ONE"/>
<property name="writeConsistency" value="ONE"/>
<property name="loadBalancingPolicy" ref="loadBalancingPolicy"/>
</bean>
persistance-settings.xml
<persistence keyspace="test" table="epc_table">
<keyPersistence class="java.lang.String" strategy="PRIMITIVE" column="imsi"/>
<valuePersistence strategy="BLOB"/>
</persistence>
-
我运行以下命令从bin启动Ignite文件夹。
I run the following command to start Ignite from bin folder.
ignite.sh ../ config / cassandra-config.xml
ignite.sh ../config/cassandra-config.xml
现在,我想通过sqlline查看cassandra表。我已经尝试以下操作:
Now, I want to take a look at the cassandra table via sqlline. I've tried the following:
./ sqlline.sh -u jdbc:cassandra://172.16.129.68:9042 / test //(test is密钥空间的名称)
./sqlline.sh -u jdbc:cassandra://172.16.129.68:9042/test //(test is the name of the keyspace)
我得到以下输出:
No known driver to handle "jdbc:cassandra://172.16.129.68:9042/test". Searching for known drivers...
java.lang.NullPointerException
sqlline version 1.3.0
0: jdbc:cassandra://172.16.129.68:9042/test>
我也尝试过:
./sqlline.sh -u jdbc:ignite:thin://172.16.129.68
但是当我使用 !tables,我看不到任何表格。
but when I use "!tables", I'm not able to see any table.
到底缺少了什么?如何使用sqlline访问/修改Cassandra中存在的表?
What exactly has been missing? How to access/modify the tables present in Cassandra using sqlline?
操作系统:RHEL 6.5
Operating System: RHEL 6.5
推荐答案
Apache Ignite是一个键值数据库,默认情况下,没有可使用JDBC连接器查看的表。 CacheStore
是将Ignite与外部数据库或任何其他存储进行集成的一种方式,它将数据作为键值对加载。
Apache Ignite is a key-value database and there are no tables created by default that you are able to view with JDBC connector. CacheStore
is a way to integrate Ignite with external DB or any other storage, and it loads data as a key-value pair.
在您的配置中,您说过Ignite想要在Cassandra中存储和加载条目,但Ignite仍然不知道条目的结构(BTW Ignite确实不知道
In your config you said Ignite that you want to store and load entries in/from Cassandra, but still Ignite doesn't know entries structure (BTW Ignite really doesn't care what objects were putted into it).
要能够列出表并对其进行查询,您需要创建表。为此,您需要在/ lib目录中具有引燃索引,并设置 QueryEntity 或索引类型如果您已注释POJO。这是这种配置的示例:
To be able to list tables and do queries on it, you need to create tables. For that you need to have ignite-indexing in /lib directory and set QueryEntity or indexed types if you have annotated POJOs. Here is example of such configuration:
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="mycache"/>
<!-- Configure query entities -->
<property name="queryEntities">
<list>
<bean class="org.apache.ignite.cache.QueryEntity">
<property name="keyType" value="java.lang.Long"/>
<property name="valueType" value="org.apache.ignite.examples.Person"/>
<property name="fields">
<map>
<entry key="id" value="java.lang.Long"/>
<entry key="orgId" value="java.lang.Long"/>
<entry key="firstName" value="java.lang.String"/>
<entry key="lastName" value="java.lang.String"/>
<entry key="resume" value="java.lang.String"/>
<entry key="salary" value="java.lang.Double"/>
</map>
</property>
<property name="indexes">
<list>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="id"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="orgId"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="salary"/>
</bean>
</list>
</property>
</bean>
</list>
</property>
如果配置了将能够通过 SQLine
征募和查询该表。 (请注意,您无法查询未加载到Ignite中的数据。要加载它们,可以使用 IgniteCache.get()
并启用 readThrough
选项或 IgniteCache.loadCache()
来加载Cassandra表中的所有内容)。
If you configure that, you'll get an ability to enlist and query that tables over SQLine
. (Please note, that you cannot query data that are not loaded into Ignite. To load them, you may use IgniteCache.get()
with enabled readThrough
option or IgniteCache.loadCache()
to load everything from Cassandra table).
要使用JDBC查询Cassandra,您需要一个JDBC驱动程序,例如,尝试 DBSchema 。
To query Cassandra with JDBC, you need a JDBC driver for it, try, for example DBSchema.
这篇关于将Apache Cassandra与Apache Ignite集成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!