top of page

장기간의 통계 연산과 시각화를 위한 롤업(Rollup) 활용

최종 수정일: 6월 12일


들어가기

시계열 데이터베이스에서 기대하는 가장 큰 역할 중의 하나는 장기간에 걸쳐 수집된 빅데이터에 대해 다양한 형태의 통계 연산과 데이터 추출, 시각화일 것이다. 왜냐하면, 다른 종류의 데이터베이스에서 기대할 수 있는 데이터 처리 기술로는 원하는 성능에 도달하기가 매우 힘들기 때문이다(그렇지 않다면, 시계열 데이터베이스가 왜 필요하겠는가?). 그렇지만, 시계열 형태로 모여진 빅데이터에 대해 무한한 리소스를 통한 병렬 데이터 연산을 수행하지 않는 한, 데이터 규모에 따라 데이터 처리 성능은 어느 한계를 가질 수 밖에 없다.


예를 들어보자.


특정 목적으로 센서 데이터를 12개월간 수집하였고, 데이터 총량은 1000억건, 저장공간은 압축해서 700GB 정도라고 가정하자. 그리고, 센서(혹은 태그) 갯수가 50개라고 한다면, 센서당 최소한 20억건의 데이터를 직렬로 유지하고 있는 것이다.


사용자가 임의 태그에 대해 6개월 범위에 대해 임의의 통계 연산, 예를 들어 평균을 수행한다고 해 보자. 이러한 종류의 요구 사항은 꼼짝없이 해당 태그의 1월부터 12월까지 모두 방문하여, 총합에 대해 갯수를 나누는 연산을 수행해야 한다. 조건을 바꾸어서 최대 값은 어떻게 될까? 최소 값은? 특정 값을 찾는 연산이 아니라, 전체 범위 혹은 큰 범우에 대한 통계 연산은 매우 비용이 많이 드는 연산이다.


그러나, 실제로 현업에서는 아래와 같은 요구 사항을 실제로 해결해야 한다.


  • 이 장비에서 지난 3개월간 온도의 평균 트렌드는 어떻게 되나?

  • 이 장비에서 지난 1년간 최고 압력은 얼마였나?

  • 이 장비에서 지난 6개월간 최소 전류량은 얼마였고, 그게 언제였나?

  • 이 장비에서 지난 12시간 데이터에 대해 매초간 온도 평균 그래프를 그려서 보고해라...아니, 내일 부터는 초단위가 아니라, 15초 단위로 다시 그려줘.

  • 실시간으로 지난 1시간동안의 압력 평균을 초단위로 그리고, 업데이트 해줘.

  • 만일 지난 6시간동안 15분 평균 온도 값이 33도 이하인 경우가 발생하면, 알람을 알려줘.

  • 지난 1년 데이터 중에서 1시간 평균 온도값이 98도가 넘는 경우가 언제 발생했는지 그 시간을 확인하고, 그 시간 주위 15분 총 30분의 RAW 데이터를 CSV로 만들어서 메일로 보내줘.


위와 같이 모든 데이터가 데이터베이스에 모두 입력되어 있다고 하더라도, 위의 요구 사항을 빠르게 응답을 덕기가 매우 어렵다.


현존하는 방법


그렇기 때문에 관련 업계에서는 데이터베이스 전체를 방문하지 않아도 통계 데이터를 얻을 수 있도록 미리 정의된 시간 단위의 "통계 테이블"을 만든다. 그래서, 위의 요구 사항이 들어오는 경우에 미리 만들어 놓은 사용자 "통계 테이블"을 통해 데이터를 빠르게 추출, 목표를 달성하도록 하는 것이다.


그러나, 이 방식의 경우 아래와 같은 몇가지 한계를 가진다.


  1. 데이터 시작 시간이 바뀌는 경우 "통계 테이블"을 활용할 수 없다.

    1. 통계 테이블을 매시간 0분 0초가 기준인데, 이것을 2분 30초로 바꿀 수 없다.

  2. 통계 시간 단위가 바뀌어도 "통계 테이블"을 활용할 수 없다.

    1. 예를 들어 1분 단위로 "통계 데이터"를 만들었는데, 30초 단위의 데이터를 얻는 것은 불가능하다.

  3. "통계 테이블"의 관리가 매우 힘들다.

    1. 요구 사항에 따라 만들어진 통계 테이블의 각종 태그와 지원되는 통계 함수, 그리고, 시간 단위 등에 따라 매우 많이 만들고, 일일이 화일을 관리해야 한다.

  4. "통계 테이블"의 삭제 및 연속적인 데이터 추가 등이 어렵다.


즉, "통계 테이블"을 활용하는 방식은 고객의 요구 사항에 대해 매우 좁은 영역에서 활용 가능한 기술이다.


롤업(Rollup) 이란?


이 문서에서 롤업이란 용어는 마크베이스의 태그 테이블을 원시 데이터 소스로 활용해서 자동으로 위의 "통계 테이블"을 생성하는 것을 말한다. 이 과정을 롤업이라고 하고, 최종 결과물을 가진 테이블을 롤업 테이블이라고 부르는 것이다. 그렇다면, 위에서 잠깐 언급한 "통계 테이블"과 "롤업 테이블"은 무엇이 다른 것일까?


이것은 기존의 "통계 테이블"이 가진 단점을 보완하고, 사용자가 보다 쉽고, 편하게 사용할 수 있도록 만들어진 것인데, 세부적인 차이점은 아래의 표로 나타내었다.

비교 내용

롤업(Rollup) 테이블

통계 테이블

통계 시작 시점 변경

자유롭게 시작 시점 변경 가능

변경 불가능

롤업 종류 지정

초,분,시로 지정가능

고정된 종류로 유지

통계 단위 시간 변경

자유롭게 변경 가능

변경 불가

생성 및 관리 방법

SQL을 통해 생성, 추가, 삭제

수동으로 생성

롤업 데이터 생성 방법

자동으로 내부에서 생성

외부 응용 수행 및 관리 필요

지원 통계 종류

최소, 최대, 레코드 갯수, 총합, 평균,제곱합 확장옵션(최초값, 최초시간,마지막값,마지막시간)

요구사항에 따라 달라짐

정리를 하면, 내가 태그 테이블에 수천개의 서로 다른 센서의 1년간의 데이터를 수천억건 수집하였고, 이 테이블에 대해 롤업을 생성해 놓기만 하면, 임의의 시간 범위 (수년까지)에 대해 임의의 센서에 대해서 임의의 통계 단위 시간 (15초, 3초, 100분, 12시간, 3주)에 대해 주어진 통계값 즉, 최소, 최대, 레코드 갯수, 합계, 평균값, 제곱합을 즉시 얻을 수 있다는 의미이다.

롤업의 한계


이 세상에 모든 측면에서 좋은 것은 없다. 이는 롤업도 마찬가지인데, 활용하기에 앞서 아래와 같은 근본적인 한계를 고려하면 훨씬 더 도움이 될 것이다.

  • 새로운 통계 함수 필요시

    • 위에서 언급했던 10가지 통계외에 다른 것이 필요한 경우에는 롤업이 무용지물이다. 물론, 대부분의 산업계에서 필요한 것들을 모아 놓았지만, 세상은 넓고, 필요한 요구 사항은 무한하니 말이다.

  • 오염된 원시 데이터 존재시

    • 시계열 데이터베이스의 특성상 잘못된 데이터를 입력한 경우 그 값이 당연히 롤업 테이블에도 반영된다.

    • 따라서, 불필요한 노이즈를 입력하지 않도록 하자.

  • 과도한 원시 데이터 입력으로 인한 리소스 부족시

    • 당연하지만, 롤업 과정은 태그 테이블의 데이터를 읽고, 연산후 이를 롤업 테이블에 다시 입력하는 과정을 반복한다.

    • 따라서, 롤업 데이블은 몇 미리초에서 몇십초까지 데이터의 반영이 느릴 수 밖에 없다.

    • 특히, 데이터의 입력량이 매우 많아 시스템의 리소스를 롤업에 자유롭게 활용할 수 없는 경우에는 원시 데이터의 마지막 시간과 롤업 테이블의 마지막 시간의 간격이 점점 더 벌어질 수 있다.

    • 이러한 간격은 마크베이스 네오의 SHELL에서 "show rollupgap" 명령으로 확인할 수 있으며, "GAP" 컬럼의 값이 0에 가까울수록 실시간에 가깝게 데이터 생성된다고 이해하면 된다.

    • 이러한 GAP이 지속적으로 증가한다면, 롤업을 위한 CPU 및 메모리, 디스크 성능 향상을 여유 리소스를 확보하도록 하자.


Rollup 기반 장기 통계 데이터 활용 방법

1. 네오 설치 및 neo-apps 소스코드 받기

이 설치관련 내용은 이전의 블로그 내용과 완전히 동일하다. 실제 설치 방법은 이전 블로그의 링크에서 1번(네오 설치)과 2번(neo-apps 다운로드)만을 참조하고, 여기로 다시 돌아오면 된다. (2번부터는 아래의 내용을 다시 따라하면 된다)

마크베이스 네오 설치는 가능하면 8.0.19 이후의 버전을 사용하도록 하자. (week, month 및 문법 개선)


2. fast-rollup 디렉토리 확인


neo-apps를 받으면, fast-rollup 디렉토리를 발견할 수 있다. 번호가 매겨진 순서대로 테스트를 진행할 것이다.























3. 스키마 생성 및 데이터 입력 확인

fast-rollup 데모에서는 0-Schema and Data Population.wrk을 오픈한 이후 순서대로 스키마를 생성하고, 데이터를 입력해 보자. 데이터 입력은 TQL을 통해 미리 넣을 수 있도록 준비되었다.

롤업은 아래와 같이 크게 두가지 방식을 활용할 수 있다.

  1. CREATE ROLLUP 구문을 통해 원하는 것을 독자적으로 생성 (매뉴얼 링크)

    1. 이는 원하는 ROLLUP을 선택적으로 SEC, MIN, HOUR 생성한다.

    2. 각각의 ROLLUP에 대해 START/STOP을 조절해야 하는 번거로움이 있다.

    3. 대신, 불필요한 것을 없애 디스크와 리소스를 절약할 수 있다.

  2. CREATE tag table 시 기본적인 default ROLLUP을 생성 (매뉴얼 링크)

    1. 내부적으로 자동으로 SEC, MIN, HOUR를 생성 및 구동한다.

    2. 가장 편하고 쉬운 방식이다.


아래는 DEFAULT 형태의 롤업을 생성하는 방식(WITH ROLLUP)을 통해 예제를 구성하였다.

위와 같이 1번 버튼을 눌러 스키마를 생성하면 된다.

그리고, 2번의 경우 1개의 태그에 대해 1초에 1건씩 1년간의 데이터를 대량으로 입력하는 경우라서 약 2~3분의 시간이 걸리니 인내심을 갖고 기다리면 좋을 것이다. 왜냐하면, rollup 의 특성상 장기간의 데이터를 통해 그 결과를 확인하는 것이니 만큼, 1년의 기간을 선정했기 때문이다.


4. Rolllup Gap의 확인 및 해소

모든 입력이 마치게 되면, SHELL을 통해 'show rollupgap' 명령을 통해 현재 rollup의 진행 현황을 볼 수 있다. 아래의 그림에서 바로 입력후 확인한 GAP의 값으로서 대량으로 순식간에 데이터를 입력하였기에 GAP이 발생한 것을 알 수 있다. 그리고, 약 2~3초 간격으로 수행하여 약 10초 후에는 최종적으로 HOUR의 rollup에 대해 GAP을 확인할 수 있다. (이는 HOUR 규모의 rollup은 수행 주기가 1시간이기에 현재 rollup 쓰레드가 sleeping 하고 있기 때문이다)


참고로 아래의 GAP 이 생성되는 현상은 정상적인 상황에서는 발생하지 않고, 이 데모처럼 대규모의 입력을 모든 리소스를 활용하여 수행할 때만 발생되는 예외적인 현상이다. 일반적으로 리소스가 충분한 경우 GAP이 1초내로 모두 0로 수렴하여, 실시간성이 보장된다.

따라서, HOUR를 담당하는 쓰레드를 아래의 명령으로 강제로 깨워 ROLLUP을 생성하면, 아래와 같이 모든 GAP이 0으로 줄어든 것을 알 수 있다.

이제 ROLLUP 테스트를 할 수 있는 모든 준비 과정을 마쳤다.


왼측의 그림과 같이 1개 센서에 대한 1Hz의 1년치 데이터는 총 31,536,000건이 입력된 것을 확인할 수 있다.








5. 롤업 데이터 추출 관련 질의

마크베이스 네오에서는 이 롤업 데이터를 얻기 위해 아래와 같이 매우 쉬운 형태의 문법을 가진 SQL을 제공한다. 그리고, 이 문법은 8.0.19부터 새로 제공되고, 이전의 구문은 deprecated 되었으니 이 매뉴얼 링크를 참조하자.


아래는 8.0.19부터 지원하는 대표적인 ROLLUP 질의의 예이다.

select ROLLUP('sec', 15, time) as time, AVG(value) 
      FROM mybigdata 
      WHERE name = 'pressure' and 
      time BETWEEN TO_DATE('2023-05-15') AND TO_DATE('2023-05-16') 
      GROUP BY time 
      ORDER BY time;

위의 질의는 해당 시간 범위에 대해 pressure 센서에 대한 15초 평균 값을 얻는 것이다.

첫번째 인자는 'sec', 'min', 'hour', 'day', 'week', 'month', 'year' 로 지정할 수 있고, 두번째 인자인 숫자는 해당 단위의 최소에서 최대값 중에 하나를 지정하면 된다. 세번째 인자는 basetime으로 지정된 time 컬럼명을 지정한다. 그리고, 네번째 인자는 ROLLUP의 시작시간을 지정하는 옵션으로 존재하며, 뒤에 예제를 통해 설명한다.


6. 초, 분, 시, 일 ROLLUP 수행해 보기

준비된 화일 1-Rollup-min-day.wrk를 살펴보자. (to_char() 함수는 TQL 내에서 string으로 변환하기 위한 목적이고, 수행시에는 없어도 된다)


한시간에 대해 15초 평균값 얻기

select to_char(rollup('sec', 15, time, '2023-01-01')) as time, avg(value), max(value) from mybigdata where name = 'pressure' and time between TO_DATE('2023-05-15 0:0:0') AND TO_DATE('2023-05-15 23:59:59') group by time order by time;

하루에 대해 30분 최소값 얻기

select to_char(rollup('min', 30, time, '2023-01-01')) as time, min(value), sumsq(value) from mybigdata where name = 'pressure' and time between TO_DATE('2023-09-11') AND TO_DATE('2023-09-11 23:59:59') group by time order by time;

반년에 대해 하루 평균값 얻기

select to_char(rollup('day', 1, time, '2023-01-01')) as time, avg(value) from mybigdata where name = 'pressure' and time between TO_DATE('2023-01-1') AND TO_DATE('2023-12-31 23:59:59') group by time order by time;

위의 결과를 시각화한 대시모드인 2-DASHBOARD-MIN-HOUR.dsh는 다음과 같다.

위의 세번째 차트인 6개월간의 12시간 평균 통계치의 경우에도 매우 빠르게 데이터를 추출, 시각화하는 놀라운 성능을 확인할 수 있다.


7. 주, 월 단위 ROLLUP 수행해 보기

준비된 화일 3-Rollup-week-month.wrk를 살펴보자.

주 뿐만 아니라 월의 경우 매월의 길이가 달라지고, 윤달이 존재하여, 일반화시키기 어려운 미션이기도 하다. 마크베이스 네오에서는 이러한 까다로운 부분을 모두 흡수하여, 사용자는 단지 'week' 혹은 'month' 지정만으로 원하는 결과를 얻을 수 있도록 지원한다. 단, 'week'의 경우 시작 요일을 지정하여야 정확한 통계 값이 나오기 때문에 ROLLUP의 네번째 인자인 시작 시간을 활용한다.


6개월에 대해 매주 평균값 얻기

2023년 1월 2일이 월요일이므로, 월요일부터 일요일까지의 통계를 위해 2일로 지정하였다.

select to_char(rollup('week', 1, time, '2023-01-02'), 'YYYY-MM-DD') as time, avg(value) from mybigdata where name = 'pressure' and time between TO_DATE('2023-01-2 0:0:0') AND TO_DATE('2023-06-30 23:59:59') group by time order by time;

6개월에 대해 2주간의 평균값 얻기

아래 7월 3일이 역시 월요일이다.

select to_char(rollup('week', 2, time, '2023-07-03'), 'YYYY-MM-DD') as time, avg(value) from mybigdata where name = 'pressure' and time between TO_DATE('2023-07-03 0:0:0') AND TO_DATE('2023-12-31 23:59:59') group by time order by time;

1년 전체 범위에 대해 월평균값 얻기

select to_char(rollup('month', 1, time, '2023-01-01'), 'YYYY-MM') as time, avg(value) from mybigdata where name = 'pressure' and time between TO_DATE('2023-01-01') AND TO_DATE('2023-12-31 23:59:59') group by time order by time;

위의 결과를 시각화한 대시모드인 4-DASHBOARD-WEEK-MONTH.dsh는 다음과 같다.


마치면서

지금 소개한 ROLLUP의 기능은 장기간의 데이터에 대한 빠른 통계 계산과 시각화를 위한 최고의 방법이다. 물론, 전체 데이터를 방문하여 데이터를 연산할 수 밖에 없는 예외 상황도 존재하지만, 일반적인 비지니스 영역에서 필요로 하는 의사 결정을 지원하기 위한 기본적인 데이터 처리 기술로는 손색이 없을 것으로 믿는다.


이 글에서 언급하지 않았지만, ROLLUP 데이터의 삭제와 EXTENSION 모드를 통한 더 많은 통계 방법도 참고하기 바란다.





조회수 82회댓글 0개

최근 게시물

전체 보기
bottom of page