메뉴 건너뛰기

Bigdata, Semantic IoT, Hadoop, NoSQL

Bigdata, Hadoop ecosystem, Semantic IoT등의 프로젝트를 진행중에 습득한 내용을 정리하는 곳입니다.
필요한 분을 위해서 공개하고 있습니다. 문의사항은 gooper@gooper.com로 메일을 보내주세요.


Drools 슬라이딩 윈도우 예제

총관리자 2016.07.28 15:03 조회 수 : 67

---결과 값 -------------

 init session.getFactCount() = 0

speed: 602.92267

speed: 601.1532

speed: 607.839

speed: 600.9022

speed: 609.21796

speed: 602.91187

speed: 604.02515

speed: 608.272

speed: 607.80176

speed: 606.90405

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

 matched count of Fact = 10


-------sliding_rules.drl--------------

package com.gooper.drool_test;


import com.gooper.drool_test.model.FlightStatus

import com.gooper.drool_test.model.FlightControl

import com.gooper.drool_test.model.EmergencySignal


declare FlightStatus

    @role(event)

end


declare EmergencySignal

    @role(event)

end


rule "First contact"

salience 100

when

    $currentFlight : FlightStatus() from entry-point "flight-control"

    not (exists (FlightStatus(this != $currentFlight, flight == $currentFlight.flight) from entry-point "flight-control"))

    $control : FlightControl()

then

    $control.addFlight($currentFlight);

    System.out.println("First contact with Flight " + $currentFlight.getFlight());

end


rule "flight arrival"

when

    $flight : FlightStatus() from entry-point "flight-arrival"

    $control : FlightControl()

    // Obtain resources to prepare the flight landing

then

    System.out.println("Flight " + $flight.getFlight() + " arriving to " + $control.getAirport() + ". Sending instructions");

    // Send instructions to arriving flight

end


rule "flight average speed"

when

    $flight : FlightStatus() from entry-point "flight-control"

    $averageSpeed : Number(floatValue > 0) from accumulate(FlightStatus(flight==$flight.flight, $speed:speed) over window:length(5) 

                                                          from entry-point "flight-control",

                                                          average($speed))

then

    System.out.println($flight.getFlight() + " average speed: " + $averageSpeed);

end



-------------------SlidingWindow.java-----------------------

package com.gooper.drool_test;


import java.util.concurrent.TimeUnit;


import org.drools.core.time.SessionPseudoClock;

import org.kie.api.KieBase;

import org.kie.api.KieBaseConfiguration;

import org.kie.api.conf.EventProcessingOption;

import org.kie.api.io.ResourceType;

import org.kie.api.runtime.KieSession;

import org.kie.api.runtime.KieSessionConfiguration;

import org.kie.api.runtime.conf.ClockTypeOption;

import org.kie.api.runtime.rule.EntryPoint;

import org.kie.internal.KnowledgeBaseFactory;

import org.kie.internal.builder.KnowledgeBuilder;

import org.kie.internal.builder.KnowledgeBuilderFactory;

import org.kie.internal.io.ResourceFactory;


import com.gooper.drool_test.custom.CustomAgendaEventListener;

import com.gooper.drool_test.custom.CustomWorkingMemoryEventListener;

import com.gooper.drool_test.helper.FlightSimulation;

import com.gooper.drool_test.model.FlightStatus;


import org.kie.internal.builder.KnowledgeBuilderError;


/* 

 * Sliding-window test

 */

public class SlidingWindow {


public static final void main(String[] args) {

               try {


              // 지식 빌더 생성

                    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

                    

                    // 지식 빌더에 룰정의파일 설정

                    kbuilder.add(ResourceFactory. newClassPathResource("sliding_rules.drl"), ResourceType. DRL );


if (kbuilder.hasErrors()) {

if(kbuilder.getErrors().size() > 0) {

for(KnowledgeBuilderError kerror : kbuilder.getErrors()) {

System.out.println("error :" + kerror);

}

}

}

// 설정정보를 변경하기위한 config접근 정보를 얻음

KieBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();

config.setOption(EventProcessingOption.STREAM);

KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();

conf.setOption(ClockTypeOption.get("pseudo"));

// 새로운 지식 베이스 생성

                    KieBase kiebase = kbuilder.newKnowledgeBase();

                    

                    // 새로운 지식 베이스 세션 생성

                    KieSession session = kiebase.newKieSession(conf,null);

                    

                    // logger등록(팩트에 의해 생성된 엑티베이션(Activation)관련 이벤트만 로깅)

                    //session.addEventListener(new CustomAgendaEventListener());

                    

                    // logger등록(팩트의 추가/수정/제거 이벤트에 대한 정보)

                    //session.addEventListener(new CustomWorkingMemoryEventListener());

                    

                    System.out.println(" init session.getFactCount() = " + session.getFactCount());

                    

                    // SessionClock의 레퍼런스를 얻는다

                    SessionPseudoClock clock = session.getSessionClock();

                    

                    FlightSimulation flightAA001 = new FlightSimulation("AA001", "San Francisco", "Los Angeles", 270);

                    

                    for(int i = 0; i < 10; i++) {

                    FlightStatus flightStatus = flightAA001.update();

                    EntryPoint flightArrivalEntryPoint = session.getEntryPoint("flight-control");

                    flightArrivalEntryPoint.insert(flightStatus);

                    clock.advanceTime(5,  TimeUnit.MINUTES);

                    Thread.sleep(100);

                    }

                    

                    int matchedCnt = session.fireAllRules();

                    System.out.println(" matched count of Fact = " + matchedCnt);

                    

                    session.dispose();


              } catch (Throwable t) {

                     t.printStackTrace();

              }

       }

}


----------------------FlightSimulation.java------------------------

package com.gooper.drool_test.helper;


import java.util.Random;

import com.gooper.drool_test.model.FlightStatus;



/**

 * 

 * @author Lucas Amador

 * 

 */

public class FlightSimulation {


    private static final int AIRPORT_AIR_SPACE = 50;

    private Random rnd = new Random();


    private final String flight;

    private final String origin;

    private final String destination;

    private long distance;

    private boolean landed;


    public FlightSimulation(String flight, String origin, String destination, long distance) {

        this.flight = flight;

        this.origin = origin;

        this.destination = destination;

        this.distance = distance;

    }


    public FlightStatus update() {

        FlightStatus flightStatus = new FlightStatus();

        flightStatus.setFlight(flight);

        flightStatus.setDestination(destination);

        flightStatus.setOrigin(origin);

        flightStatus.setDestination(destination);

        this.distance = calculateDistance();

        flightStatus.setDistance(this.distance);

        flightStatus.setSpeed(currentSpeed());

        System.out.println("speed: " + flightStatus.getSpeed());

        return flightStatus;

    }


    private long calculateDistance() {

        if ((distance - AIRPORT_AIR_SPACE) <= AIRPORT_AIR_SPACE) {

            landed = true;

            return 0;

        }

        return distance - AIRPORT_AIR_SPACE;

    }


    private float currentSpeed() {

        return (rnd.nextFloat() * 10) + 600;

    }


    public boolean isLanded() {

        return landed;

    }


}





--------------------------FlightStatus.java--------------------
package com.gooper.drool_test.model;

import java.util.Date;

/**
 * 
 * @author Lucas Amador
 * 
 */
public class FlightStatus {

    private String flight;
    private Date timestamp;
    private String origin;
    private String destination;
    private long distance;
    private float speed;
    private boolean processed;

    public String getFlight() {
        return flight;
    }

    public void setFlight(String flight) {
        this.flight = flight;
    }

    public Date getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }

    public String getOrigin() {
        return origin;
    }

    public void setOrigin(String origin) {
        this.origin = origin;
    }

    public String getDestination() {
        return destination;
    }

    public void setDestination(String destination) {
        this.destination = destination;
    }

    public long getDistance() {
        return distance;
    }

    public void setDistance(long distance) {
        this.distance = distance;
    }

    public float getSpeed() {
        return speed;
    }

    public void setSpeed(float speed) {
        this.speed = speed;
    }

    public void setProcessed(boolean processed) {
        this.processed = processed;
    }

    public boolean getProcessed() {
        return processed;
    }

@Override
public String toString() {
return "FlightStatus [flight=" + flight + ", timestamp=" + timestamp + ", origin=" + origin + ", destination="
+ destination + ", distance=" + distance + ", speed=" + speed + ", processed=" + processed
+ ", getFlight()=" + getFlight() + ", getTimestamp()=" + getTimestamp() + ", getOrigin()=" + getOrigin()
+ ", getDestination()=" + getDestination() + ", getDistance()=" + getDistance() + ", getSpeed()="
+ getSpeed() + ", getProcessed()=" + getProcessed() + ", getClass()=" + getClass() + ", hashCode()="
+ hashCode() + ", toString()=" + super.toString() + "]";
}
    
    

}

번호 제목 글쓴이 날짜 조회 수
160 bin/cassandra -f -R로 startup할때 NullPointerException오류가 나면 조치할 내용 총관리자 2016.04.14 70
159 kudu hms check 사용법(예시) 총관리자 2021.10.22 69
158 Scala를 이용한 Streaming예제 총관리자 2018.03.08 69
157 hadoop 어플리케이션을 사용하는 사용자 변경시 바꿔줘야 하는 부분 총관리자 2016.09.23 68
156 [Hive canary]Hive에 Metastore canary red alert및 hive log파일에 Duplicate entry '123456' for key 'NOTIFICATION_LOG_EVENT_ID'가 발생시 조치사항 gooper 2023.03.10 67
155 [impala]쿼리 수행중 발생하는 오류(due to memory pressure: the memory usage of this transaction, Failed to write to server) gooper 2022.10.05 67
» 슬라이딩 윈도우 예제 총관리자 2016.07.28 67
153 실시간 쿼리 변환 모니터링(팩트내 필드값의 변경사항을 실시간으로 추적함)하는 테스트 java 프로그램 file 총관리자 2016.07.21 67
152 Scala버젼 변경 혹은 상황에 맞게 Spark소스 컴파일하기 총관리자 2016.05.31 67
151 [Atlas Server]org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=atlas/node01.gooper.com@GOOPER.COM, scope=default:atlas_janus, params=[table=default:atlas_janus,], action-CREATE)] gooper 2023.05.15 66
150 전체 컨택스트 내용 file 총관리자 2017.12.19 66
149 halyard 1.3을 다른 서버로 이전하는 방법 총관리자 2017.07.05 66
148 halyard 1.3의 rdf4j-server.war와 rdf4j-workbench.war를 tomcat deploy후 조회시 java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/Cell발생시 조치사항 총관리자 2017.07.05 65
147 mysql sqoop작업을 위해서 mysql-connector-java.jar을 추가하는 경우 확실하게 인식시키는 방법 총관리자 2020.05.11 64
146 "You are running Cloudera Manager in non-production mode.." warning메세지가 나타나지 않게 조치하는 방법 총관리자 2018.05.23 64
145 데이타 분석및 머신러닝에 도움이 도움이 되는 사이트 총관리자 2016.11.04 64
144 권한회수 및 권한부여 명령 몇가지 총관리자 2017.11.16 63
143 Windows7 64bit 환경에서 ElasticSearch 5.6.3설치하기 총관리자 2017.10.13 63
142 Core with name 'xx_shard4_replica1' already exists. 발생시 조치사항 총관리자 2017.07.22 62
141 org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.hadoop.hbase.ClockOutOfSyncException 오류시 조치사항 총관리자 2016.07.14 62

A personal place to organize information learned during the development of such Hadoop, Hive, Hbase, Semantic IoT, etc.
We are open to the required minutes. Please send inquiries to gooper@gooper.com.

위로