由于数据不在同一位置,Apache Ignite连接查询返回错误结果

时间:2019-05-19 07:19:43

标签: ignite gridgain

我是Ignite的新手,并且跟随各种博客来了解所需的配置。

首先,我使用了“电影镜头”数据(电影和分级),并使用了Ignite Web控制台生成所需的配置。

请在下面找到有关我的代码的必需详细信息:

1)MySQL表结构

  

创建表电影(movie_id INTEGER,       movie_name VARCHAR(250),流派VARCHAR(250),       约束pk_movie主键(movie_id));

     

创建表格评分(       user_id INTEGER,movie_id INTEGER,评分FLOAT,时间戳记TIMESTAMP,       约束pk_rating主键(user_id,movie_id));

2)Spring Boot项目中的Ignite配置文件(由Ignite Web控制台自动生成)

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

<!-- This file was generated by Ignite Web Console (05/15/2019, 18:37) -->

<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">
    <!-- Load external properties file. -->
    <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:secret.properties"/>
    </bean>

    <!-- Data source beans will be initialized from external properties file. -->
    <bean id="dsGeneric_Movielens" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${dsGeneric_Movielens.jdbc.url}"/>
        <property name="user" value="${dsGeneric_Movielens.jdbc.username}"/>
        <property name="password" value="${dsGeneric_Movielens.jdbc.password}"/>
    </bean>

    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="igniteInstanceName" value="ImportedCluster"/>

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
                        <property name="addresses">
                            <list>
                                <value>127.0.0.1:47500..47510</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>

        <property name="cacheConfiguration">
            <list>
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="MoviesCache"/>
                    <property name="cacheMode" value="REPLICATED"/>
                    <property name="atomicityMode" value="ATOMIC"/>

                    <property name="cacheStoreFactory">
                        <bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory">
                            <property name="dataSourceBean" value="dsGeneric_Movielens"/>
                            <property name="dialect">
                                <bean class="org.apache.ignite.cache.store.jdbc.dialect.BasicJdbcDialect">
                                </bean>
                            </property>

                            <property name="types">
                                <list>
                                    <bean class="org.apache.ignite.cache.store.jdbc.JdbcType">
                                        <property name="cacheName" value="MoviesCache"/>
                                        <property name="keyType" value="java.lang.Integer"/>
                                        <property name="valueType" value="com.learnwithmanoj.ignite.model.Movies"/>
                                        <property name="databaseSchema" value="movielens"/>
                                        <property name="databaseTable" value="movies"/>

                                        <property name="keyFields">
                                            <list>
                                                <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                    <constructor-arg>
                                                        <util:constant static-field="java.sql.Types.INTEGER"/>
                                                    </constructor-arg>
                                                    <constructor-arg value="movie_id"/>
                                                    <constructor-arg value="int"/>
                                                    <constructor-arg value="movieId"/>
                                                </bean>
                                            </list>
                                        </property>

                                        <property name="valueFields">
                                            <list>
                                                <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                    <constructor-arg>
                                                        <util:constant static-field="java.sql.Types.VARCHAR"/>
                                                    </constructor-arg>
                                                    <constructor-arg value="movie_name"/>
                                                    <constructor-arg value="java.lang.String"/>
                                                    <constructor-arg value="movieName"/>
                                                </bean>

                                                <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                    <constructor-arg>
                                                        <util:constant static-field="java.sql.Types.VARCHAR"/>
                                                    </constructor-arg>
                                                    <constructor-arg value="genre"/>
                                                    <constructor-arg value="java.lang.String"/>
                                                    <constructor-arg value="genre"/>
                                                </bean>
                                            </list>
                                        </property>
                                    </bean>
                                </list>
                            </property>
                        </bean>
                    </property>

                    <property name="readThrough" value="true"/>
                    <property name="writeThrough" value="true"/>

                    <property name="queryEntities">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryEntity">
                                <property name="keyType" value="java.lang.Integer"/>
                                <property name="valueType" value="com.learnwithmanoj.ignite.model.Movies"/>
                                <property name="keyFieldName" value="movieId"/>

                                <property name="keyFields">
                                    <list>
                                        <value>movieId</value>
                                    </list>
                                </property>

                                <property name="fields">
                                    <map>
                                        <entry key="movieName" value="java.lang.String"/>
                                        <entry key="genre" value="java.lang.String"/>
                                        <entry key="movieId" value="java.lang.Integer"/>
                                    </map>
                                </property>

                                <property name="aliases">
                                    <map>
                                        <entry key="movieId" value="movie_id"/>
                                        <entry key="movieName" value="movie_name"/>
                                    </map>
                                </property>
                            </bean>
                        </list>
                    </property>
                </bean>

                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="RatingsCache"/>
                    <property name="cacheMode" value="REPLICATED"/>
                    <property name="atomicityMode" value="ATOMIC"/>

                    <property name="cacheStoreFactory">
                        <bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory">
                            <property name="dataSourceBean" value="dsGeneric_Movielens"/>
                            <property name="dialect">
                                <bean class="org.apache.ignite.cache.store.jdbc.dialect.BasicJdbcDialect">
                                </bean>
                            </property>

                            <property name="types">
                                <list>
                                    <bean class="org.apache.ignite.cache.store.jdbc.JdbcType">
                                        <property name="cacheName" value="RatingsCache"/>
                                        <property name="keyType" value="com.learnwithmanoj.ignite.model.RatingsKey"/>
                                        <property name="valueType" value="com.learnwithmanoj.ignite.model.Ratings"/>
                                        <property name="databaseSchema" value="movielens"/>
                                        <property name="databaseTable" value="ratings"/>

                                        <property name="keyFields">
                                            <list>
                                                <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                    <constructor-arg>
                                                        <util:constant static-field="java.sql.Types.INTEGER"/>
                                                    </constructor-arg>
                                                    <constructor-arg value="user_id"/>
                                                    <constructor-arg value="int"/>
                                                    <constructor-arg value="userId"/>
                                                </bean>

                                                <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                    <constructor-arg>
                                                        <util:constant static-field="java.sql.Types.INTEGER"/>
                                                    </constructor-arg>
                                                    <constructor-arg value="movie_id"/>
                                                    <constructor-arg value="int"/>
                                                    <constructor-arg value="movieId"/>
                                                </bean>
                                            </list>
                                        </property>

                                        <property name="valueFields">
                                            <list>
                                                <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                    <constructor-arg>
                                                        <util:constant static-field="java.sql.Types.REAL"/>
                                                    </constructor-arg>
                                                    <constructor-arg value="rating"/>
                                                    <constructor-arg value="java.lang.Double"/>
                                                    <constructor-arg value="rating"/>
                                                </bean>

                                                <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                    <constructor-arg>
                                                        <util:constant static-field="java.sql.Types.TIMESTAMP"/>
                                                    </constructor-arg>
                                                    <constructor-arg value="timestamp"/>
                                                    <constructor-arg value="java.sql.Timestamp"/>
                                                    <constructor-arg value="timestamp"/>
                                                </bean>
                                            </list>
                                        </property>
                                    </bean>
                                </list>
                            </property>
                        </bean>
                    </property>

                    <property name="readThrough" value="true"/>
                    <property name="writeThrough" value="true"/>

                    <property name="queryEntities">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryEntity">
                                <property name="keyType" value="com.learnwithmanoj.ignite.model.RatingsKey"/>
                                <property name="valueType" value="com.learnwithmanoj.ignite.model.Ratings"/>

                                <property name="keyFields">
                                    <list>
                                        <value>userId</value>
                                        <value>movieId</value>
                                    </list>
                                </property>

                                <property name="fields">
                                    <map>
                                        <entry key="userId" value="java.lang.Integer"/>
                                        <entry key="movieId" value="java.lang.Integer"/>
                                        <entry key="rating" value="java.lang.Double"/>
                                        <entry key="timestamp" value="java.sql.Timestamp"/>
                                    </map>
                                </property>

                                <property name="aliases">
                                    <map>
                                        <entry key="userId" value="user_id"/>
                                        <entry key="movieId" value="movie_id"/>
                                    </map>
                                </property>

                                <property name="indexes">
                                    <list>
                                        <bean class="org.apache.ignite.cache.QueryIndex">
                                            <property name="name" value="fk_movie_id"/>
                                            <property name="indexType" value="SORTED"/>

                                            <property name="fields">
                                                <map>
                                                    <entry key="movieId" value="false"/>
                                                </map>
                                            </property>
                                        </bean>
                                    </list>
                                </property>
                            </bean>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>
</beans>

3)点燃安装文件夹中的点燃配置文件

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

<!-- This file was generated by Ignite Web Console (05/15/2019, 08:52) -->

<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">
    <!-- Load external properties file. -->
    <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:secret.properties"/>
    </bean>

    <!-- Data source beans will be initialized from external properties file. -->
    <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${datasource.jdbc.url}"/>
        <property name="user" value="${datasource.jdbc.username}"/>
        <property name="password" value="${datasource.jdbc.password}"/>
    </bean>

    <bean class="org.apache.ignite.configuration.IgniteConfiguration">

        <property name="igniteInstanceName" value="MovieRatingsCluster"/>

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
                        <property name="addresses">
                            <list>
                                <value>127.0.0.1:47500..47510</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>

    </bean>
</beans>

问题陈述:

当我以独立的Ignite节点启动Spring Boot应用程序时,MySQL数据库中的所有数据都将按预期同步到Ignite节点中。另外,如果我尝试在“评级和电影”表之间进行联接,则表明联接正确且给出了正确的结果。

使用的联接查询:

  

从中选择r.movi​​e_id,m.movi​​e_name,count(r.rating)作为计数   “ RatingsCache” .ratings r内部联接“ MoviesCache” .movi​​es m其中   r.movi​​e_id = m.movi​​e_id按r.movi​​e_id分组,按计数降序限制   5;

现在要解决这个问题。如果我使用多个节点进行相同的测试,则由于数据不在同一位置,所以Join开始给出错误的结果。

任何人都可以为我提供正确的配置集,以解决分区模式下的Join问题吗?

我什至尝试添加以下配置。

<property name="cacheKeyConfiguration">
    <list>
        <bean class="org.apache.ignite.cache.CacheKeyConfiguration">
            <property name="typeName" value="com.learnwithmanoj.ignite.model.RatingsKey" />
            <property name="affinityKeyFieldName" value="movie_id" />
        </bean>
    </list>
</property>

但是出现以下错误。

  

由以下原因引起:org.apache.ignite.binary.BinaryObjectException:二进制类型   具有不同的相似性关键字段   [typeName = com.learnwithmanoj.ignite.model.RatingsKey,   affKeyFieldName1 = null,affKeyFieldName2 = movie_id]

1 个答案:

答案 0 :(得分:1)

您的解决方案应该起作用。首先,您需要清理所有节点上Ignite主目录下的marshaller/目录,然后重新启动这些节点。

您可能还需要在大写字母中指定键字段名称:MOVIE_ID