주요글: 도커 시작하기
반응형

관련 글


컨텍스트


주식 종목 별로 최근 10분 동안의 평균 가격을 구하려면 다음과 같이 group by 사용햇다.


select code, avg(cost) as avg from StockTick.win:time(10 min) group by code


컨텍스트를 만들면 group by를 사용하지 않고 이벤트를 분류해서 분류된 파티션 별로 결과를 만들어 낼 수 있다. 컨텍스트는 이벤트를 컨텍스트 파티션으로 분류해 주며, EPL에 컨텍스트를 적용하면, 한 개의 EPL을 컨텍스트 파티션 별로 적용할 수 있다. 따라서, 주식 코드 별로 컨텍스트 파티션을 생성하고, 이 컨텍스트를 이용해서 EPL을 실행하면 group by 등의 쿼리를 사용하지 않아도 종목 별로 평균이나 추이 등을 분석할 수 있다.


컨텍스트 만들고 사용하기


컨텍스트는 다음과 같은 문장을 이용해서 생성한다.


epService.getEPAdministrator().createEPL(

       "create context CodeSegment partition by code from StockTick");


위 코드는 StockTick 이벤트를 code 값으로 분류하는 CodeSegment라는 컨텍스트를 생성한다. 값으로 파티션을 생성하는 방식과 해시값으로 파티션을 생성하는 방식 등 몇 가지 종류의 컨텍스트를 제공하는데, 이에 대한 내용은 뒤에서 다시 정리해 본다.


파티션을 생성했다면, EPL에서 다음과 같이 context 절을 이용해서 컨텍스트를 적용할 수 있다.


EPStatement eps = epService.getEPAdministrator().createEPL(

        "context CodeSegment " +

        "select code, avg(cost) as avg from StockTick.win:time(3 sec) ");


위 코드는 CodeSegment 컨텍스트를 사용하는데, 이 경우 각 EPL은 code 값으로 분류된 파티션 별로 적용된다. 따라서, 위 EPL의 select는 각 code 별로 최근 3초 시간 윈도우의 평균 값을 생성한다.


컨텍스트 종류

  • 키 기반 컨텍스트
  • 해시 키반 컨텍스트
  • 카테고리 컨텍스트
  • 논오버래핑 컨텍스트
  • 오버래핑 컨텍스트


컨텍스트 종류: 키 기반 컨텍스트


키 기반 컨텍스트는 이벤트의 특정 프로퍼티를 이용해서 이벤트를 파티션으로 분류한다. partition by 를 이용해서 파티션 키를 지정한다.


create context CodeSegment partition by code from StockTick


두 개 이상의 키를 사용할 수도 있다.


create context AccessLogSegment partition by domain and sesessionId from AccessLog


여러 이벤트를 이용해서 컨텍스트를 생성할 수도 있다.


create context CodeSegment2 partition by 

compCode from Announcement, code from StockTick


위 컨텍스트는 StockTick 이벤트와 Announcement 이벤트를 이용해서 컨텍스트를 생성한다. 각 이벤트에서 지정한 프로퍼티 개수와 타입은 동일해야 한다. 위 컨텍스트 내에서 실행되는 EPL은 코드는 같은 회사 코드를 갖는 주가와 공시 이벤트를 묶어서 처리할 수 있게 된다. 예를 들어, 아래 EPL에서 StockTick 이벤트와 Announcement 이벤트는 이미 동일한 회사 코드를 갖고 있으므로, code와 compCode가 같은지 여부를 비교할 필요가 없다.


context CodeSegment

select s from Announcement.win:time(10 min) a, StockTick t

where t.rate > 10


컨텍스트 종류: 해시 기반 컨텍스트


해시 기반 컨텍스트는 지정한 프로퍼티의 해시 값을 이용해서 이벤트를 분류한다. 해시 기반 컨텍스트를 사용하려면 다음과 같이 coalesce by와 해시 함수를 함께 사용하면 된다.


create context CodeSegment coalesce by

consistent_hash_crc32(code) from StockTick granularity 32

preallocate


consistent_hash_crc32는 CRC 32 알고리즘을 이용해서 해시 코드를 생성한다. hash_code를 사용하면 자바의 해시 코드를 이용한다. granularity는 파티션의 최대 개수를 지정하며, preallocate를 사용하면 미리 파티션을 생성해 놓는다. 키 기반 컨텍스트와 마찬가지로 여러 이벤트를 이용해서 정의할 수 있다.


위 코드를 이용해서 생성한 해시 기반 컨텍스트는 하나의 파티션에 한 개 이상의 code가 존재하게 됨에 유의하자.


컨텍스트 종류: 카테고리 컨텍스트


카테고리 컨텍스트는 프로퍼티를 이용해서 카테고리를 생성하고 이를 기준으로 분류한다. 다음은 카테고리 컨텍스트의 생성 예를 보여주고 있다. "group 표현식 as 카테고리이름"을 이용해서 카테고리를 정의한다.


create context AccessLogCategory

group responseTime <= 1000 as normal,

group responseTime > 1000 and responseTime <= 2000 as slow,

group responseTime > 2000 as tooslow

from AccessLog


카테고리 기반 컨텍스트는 이벤트를 몇 개의 카테고리로 나눈다. 위 코드는 3개의 파티션을 생성하는데, 이벤트는 응답 시간에 따라 normal 파티션, slow 파티션, tooslow 파티션에 속하게 된다.


이 컨텍스트를 사용하는 EPL은 다음과 같이 context.label을 이용해서 카테고리 이름을 구할 수 있다.


context AccessLogCategory

select context.label from AccessLog


컨텍스트 종류: 논오버래핑 컨텍스트


논오버래핑 컨텍스트는 시작과 끝 조건에 따라 컨텍스트가 시작되거나 끝나는 컨텍스트이다. 컨텍스트가 시작되면 끝 조건 전까지 컨텍스트 파티션은 1개만 존재한다. 끝 조건을 충족해서 컨텍스트가 끝나면 파티션은 0개가 된다.


논오버래핑 컨텍스트는 start와 end를 이용해서 시작 조건과 끝 조건을 지정한다. 시작 조건과 끝 조건에는 이벤트, 패턴, 그론탭, 시간 간격 등이 올 수 있다. 다음은 레퍼런스 문서에 있는 몇 가지 예이다.

  • create context NineToFive start (0, 9, *, *, *) end (0, 17, *, *, *)
    크론탭 표현식을 이용한 시작/종료 시점을 지정한다. 9시에 컨텍스트를 시작하고 17시에 끝낸다.
  • create context PowerOutage start PowerOutageEvent end pattern [PowerOnEvent -> timer:interval(5 sec)]
    PowerOutageEvent가 발생하면 컨텍스트를 시작하고, PowerOnEvent 발생 후 5 초가 지나면 끝낸다.
  • create context Every15minutes start @now end after 15 min
    @now는 지금을 의미하는 어노테이션으로, 컨텍스트는 지금 시작해서 15분 후에 끝낸다. 컨텍스트가 종료되면 @now에 의해 다시 컨텍스트가 바로 시작.
시작 조건은 @now 또는 크론탭이나 이벤트 필터 등의 표현식이 온다.

EPL에서는 context.startTime과 context.endTime을 이용해서 컨텍스트의 시작 시작과 끝 시간을 구할 수 있다.

컨텍스트 종류: 오버래핑 컨텍스트


오버래핑 컨텍스트는 시작과 종료 조건을 지정하는 건 논오버래핑 컨텍스트와 같다. 차이점이 있다면, 오버래핑 컨텍스트는 시작 조건을 충족할 때 마다 새로운 컨텍스트 파티션을 생성한다는 점이다. initiated와 terminated를 이용해서 컨텍스트 시작과 종료 조건을 지정한다. 다음은 레퍼런스 문서에 있는 몇 가지 예이다.

  • create context CtxTrainEnter initiated TrainEventEnter as te terminated after 5 min
    TrainEventEnter 이벤트가 들어올 때 마다 새로운 컨텍스트를 시작하고, 5분이 지나면 해당 컨텍스트를 종료한다.
  • create context CtxEachMinute initiated @now and pattern [every timer:interval(1 min)] terminated after 1 min
    "@now and"는 컨텍스트를 즉각 시작하고, 시작 조건이 충족되면 새로운 컨텍스트를 시작한다. 위 EPL은 컨텍스트를 즉각 시작하고, (1분이 지나면 조건을 충족하므로) 매 1분이 지날 때 마다 컨텍스트를 시작한다. 각 컨텍스트는 1분 이후에 종료된다.
  • create context OrderContext initiated distinct(orderId) NewOrderEvent as newOrder terminated CloseOrderEvent(closeOrderid = newOrder.orderId)
    NewOrderEvent가 들어오면 컨텍스트를 시작한다. 단, orderId를 기준으로 컨텍스트가 이미 존재하면 새로운 컨텍스트는 시작되지 않는다.

컨텍스트 종료시 결과 생성하기


output을 사용하면 컨텍스트가 종료될 때 결과를 생성할 수 있다. 다음처럼 output - when terminated 구문을 사용하면 된다.


context CtxEachMinute select avg(temp) from sensorEvent output snapshot when terminiated



컨텍스트를 사용할 때의 장점


레퍼런스 문서에 따르면 컨텍스트 사용시 다음과 같은 장점이 있다고 한다.

  • 하나의 컨텍스트를 여러 EPL에 적용할 수 있으므로, 그룹핑하기 위한 중복 부분을 제거할 수 있다.
  • EPL을 더 읽기 쉽게 만들어준다.
  • 두 개 이상의 컨텍스트를 조합(중첩)할 수 있다.
  • 파티션이 시간 상 겹칠 수 있다.
  • 엔진이 컨텍스트 단위로 락을 관리하기 때문에 동시성을 높일 수 있다.


+ Recent posts