drools 7.x集成SparkStream 2.x

版权声明:本文为博主九师兄(QQ群:spark源代码 198279782 欢迎来探讨技术)原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21383435/article/details/82938787

1.maven镜像

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lcc</groupId>
    <artifactId>drools_test</artifactId>
    <version>1.0-SNAPSHOT</version>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <drools.version>7.11.0.Final</drools.version>
        <lombok.version>1.18.0</lombok.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>${drools.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.drools/drools-core -->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools.version}</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>2.2.0</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.kie</groupId>
                <artifactId>kie-maven-plugin</artifactId>
                <version>${drools.version}</version>
                <extensions>true</extensions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

        </plugins>
    </build>
</project>

2. 实体类:

package entity;

import lombok.Data;

/**
 * Created by lcc on 2018/9/28.
 */
@Data
public class Person {
    private int id;
    private String name ;
    private int count;

    public Person() {
    }

    public Person(String name, int count) {
        this.name = name;
        this.count = count;
    }

    public Person(int id, String name, int count) {
        this.id = id;
        this.name = name;
        this.count = count;
    }
}

3.测试类

package com.spark;

import entity.Apple;
import entity.Person;
import org.apache.log4j.Logger;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.impl.KnowledgeBaseFactory;
import org.kie.api.definition.KiePackage;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.StatelessKieSession;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;

import java.io.File;
import java.net.URLDecoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;

/**
 * 同卡号单日最大交易金额测试
 * @author ll-t150
 *
 */
public class SparkDroolsTest {

    public static Logger logger = Logger.getLogger(SparkDroolsTest.class);
    public static final DateFormat df = new SimpleDateFormat("yyyyMMdd");

    public static void main(String[] args) throws Exception {

        SparkConf conf = new SparkConf().setMaster("local[4]").setAppName("NetworkWordCount").set("spark.testing.memory",
                "2147480000");
        JavaStreamingContext jssc =  new JavaStreamingContext(conf, Durations.seconds(5));
        System.out.println(jssc);

        // Create a DStream that will connect to hostname:port, like
        // localhost:9999
        JavaReceiverInputDStream<String> lines = jssc.socketTextStream("lcc", 9999);

        JavaDStream<Person> mapRDD = lines.map(new Function<String, Person>() {
            @Override
            public Person call(String s) throws Exception {
                String[] danci = s.split(" ");
                if( danci.length == 2 ){
                    Person apple = new Person();
                    apple.setName(danci[0]);
                    apple.setCount(Integer.parseInt(danci[1]));
                    return apple;
                }
                return null;
            }
        });



        mapRDD.foreachRDD(new VoidFunction<JavaRDD<Person>>() {
            @Override
            public void call(JavaRDD<Person> appleJavaRDD) throws Exception {
                appleJavaRDD.foreach(new VoidFunction<Person>() {
                    @Override
                    public void call(Person apple) throws Exception {
                        if( apple != null ){
                            System.out.println("id: " + apple.getName());
                            System.out.println("proice: " + apple.getCount());

                            KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
                            String filePath = SparkDroolsTest.class.getClassLoader().getResource("com.rules/Matches.drl").getPath();
                            File file = new File(URLDecoder.decode(filePath,"utf-8"));
                            kbuilder.add(ResourceFactory.newFileResource(file), ResourceType.DRL);
                            InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
                            Collection<KiePackage> ss = kbuilder.getKnowledgePackages();
                            kbase.addPackages(ss);
                            StatelessKieSession ksession = kbase.newStatelessKieSession();
                            Person person=new Person(apple.getName(),apple.getCount());
                            ksession.execute(person);

                        }
                    }
                });
            }
        });

        jssc.start();
        //System.out.println(wordCounts.count());// Start the computation
        jssc.awaitTermination();   // Wait for the computation to terminate

    }

}

4.规则

/Users/lcc/IdeaProjects/drools_test/src/main/resources/com.rules/Matches.drl
package com.rules

import entity.School
import entity.Person

rule test002
    when
        $p:Person(name matches "张.*");
    then
        System.out.println("恭喜你,包含张 成功的使用了 matches");
end

5.测试

在命令行窗口里执行

lcc@lcc ~$ nc -lk 9999
张三 20
李四 30
张飞 50
王五 10

打印结果如下

id: 张三
proice: 20
18/10/04 17:01:35 INFO Executor: Running task 1.0 in stage 7.0 (TID 13)
18/10/04 17:01:35 INFO BlockManager: Found block input-0-1538643691000 locally
id: 王五
proice: 10
18/10/04 17:01:35 INFO BlockManagerInfo: Removed broadcast_6_piece0 on 192.168.0.17:52908 in memory (size: 1458.0 B, free: 1048.8 MB)
18/10/04 17:01:35 INFO Executor: Finished task 1.0 in stage 7.0 (TID 13). 751 bytes result sent to driver
18/10/04 17:01:35 INFO TaskSetManager: Finished task 1.0 in stage 7.0 (TID 13) in 230 ms on localhost (executor driver) (1/2)
恭喜你,包含张 成功的使用了 matches
id: 李四
proice: 30
id: 张飞
proice: 50
恭喜你,包含张 成功的使用了 matches

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/82938787