Rollup으로 데이터 집계하기

Rollup으로 데이터 집계하기 (Aggregate data with rollup)

Apache Druid®는 "롤업(rollup)"이라는 과정을 통해 수집 시점에 원시 데이터를 요약할 수 있어요. Rollup은 선택한 컬럼 집합에 대한 1차 집계 작업으로, 저장되는 데이터의 크기를 줄여 줘요. 이 튜토리얼에서는 수집 중 rollup을 적용하는 방법을 보여 주고, 쿼리 실행 중에 나타나는 효과를 함께 살펴봐요.

출처: 문서

본문

이 튜토리얼의 예제는 멀티-스테이지 쿼리(MSQ) 태스크 엔진을 사용해 SQL 문을 실행해요.

사전 준비 (Prerequisites)

진행하기 전에 Quickstart (local)에 설명된 대로 Druid를 다운로드하고 로컬 머신에서 실행 중이어야 해요. Druid 클러스터에 데이터를 로드할 필요는 없어요.

Druid에서 데이터를 쿼리하는 방법에 익숙해야 해요. 아직 안 하셨다면 먼저 Query data 튜토리얼을 진행해 주세요.

예제 데이터 로드하기 (Load the example data)

이 튜토리얼에서는 IP 트래픽을 나타내는 작은 네트워크 흐름(network flow) 이벤트 데이터 샘플을 사용해요. 데이터에는 소스 IP 주소에서 대상 IP 주소로의 패킷 수와 바이트 수가 들어 있어요.

{"timestamp":"2018-01-01T01:01:35Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":20,"bytes":9024}
{"timestamp":"2018-01-01T01:01:51Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":255,"bytes":21133}
{"timestamp":"2018-01-01T01:01:59Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":11,"bytes":5780}
{"timestamp":"2018-01-01T01:02:14Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":38,"bytes":6289}
{"timestamp":"2018-01-01T01:02:29Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":377,"bytes":359971}
{"timestamp":"2018-01-01T01:03:29Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":49,"bytes":10204}
{"timestamp":"2018-01-02T21:33:14Z","srcIP":"7.7.7.7", "dstIP":"8.8.8.8","packets":38,"bytes":6289}
{"timestamp":"2018-01-02T21:33:45Z","srcIP":"7.7.7.7", "dstIP":"8.8.8.8","packets":123,"bytes":93999}
{"timestamp":"2018-01-02T21:35:45Z","srcIP":"7.7.7.7", "dstIP":"8.8.8.8","packets":12,"bytes":2818}

INSERT INTO 문과 EXTERN 함수를 사용해 데이터를 인라인으로 수집하면서 샘플 데이터셋을 로드해 볼게요. Druid 웹 콘솔 (Druid web console)에서 Query 뷰로 이동해 다음 쿼리를 실행해 주세요:

INSERT INTO "rollup_tutorial"
WITH "inline_data" AS (
  SELECT *
  FROM TABLE(EXTERN('{
    "type":"inline",
    "data":"{\"timestamp\":\"2018-01-01T01:01:35Z\",\"srcIP\":\"1.1.1.1\",\"dstIP\":\"2.2.2.2\",\"packets\":20,\"bytes\":9024}\n{\"timestamp\":\"2018-01-01T01:02:14Z\",\"srcIP\":\"1.1.1.1\",\"dstIP\":\"2.2.2.2\",\"packets\":38,\"bytes\":6289}\n{\"timestamp\":\"2018-01-01T01:01:59Z\",\"srcIP\":\"1.1.1.1\",\"dstIP\":\"2.2.2.2\",\"packets\":11,\"bytes\":5780}\n{\"timestamp\":\"2018-01-01T01:01:51Z\",\"srcIP\":\"1.1.1.1\",\"dstIP\":\"2.2.2.2\",\"packets\":255,\"bytes\":21133}\n{\"timestamp\":\"2018-01-01T01:02:29Z\",\"srcIP\":\"1.1.1.1\",\"dstIP\":\"2.2.2.2\",\"packets\":377,\"bytes\":359971}\n{\"timestamp\":\"2018-01-01T01:03:29Z\",\"srcIP\":\"1.1.1.1\",\"dstIP\":\"2.2.2.2\",\"packets\":49,\"bytes\":10204}\n{\"timestamp\":\"2018-01-02T21:33:14Z\",\"srcIP\":\"7.7.7.7\",\"dstIP\":\"8.8.8.8\",\"packets\":38,\"bytes\":6289}\n{\"timestamp\":\"2018-01-02T21:33:45Z\",\"srcIP\":\"7.7.7.7\",\"dstIP\":\"8.8.8.8\",\"packets\":123,\"bytes\":93999}\n{\"timestamp\":\"2018-01-02T21:35:45Z\",\"srcIP\":\"7.7.7.7\",\"dstIP\":\"8.8.8.8\",\"packets\":12,\"bytes\":2818}"}',
     '{"type":"json"}'))
     EXTEND ("timestamp" VARCHAR, "srcIP" VARCHAR, "dstIP" VARCHAR, "packets" BIGINT, "bytes" BIGINT))
SELECT
  FLOOR(TIME_PARSE("timestamp") TO MINUTE) AS __time,
  "srcIP",
  "dstIP",
  SUM("bytes") AS "bytes",
  SUM("packets") AS "packets",
  COUNT(*) AS "count"
FROM "inline_data"
GROUP BY 1, 2, 3
PARTITIONED BY DAY

수집 문의 다음 측면에 주목해 주세요:

  • FLOOR 함수로 타임스탬프 필드를 분 단위로 내림해 변환해요.
  • timestamp, srcIP, dstIP dimension으로 그룹핑해요.
  • 각각 해당 입력 필드에서 합산되는 bytes 와 packets metric을 만들어요.
  • 데이터소스의 각 행에 대해 롤업되는 행 수를 기록하는 count metric도 만들어요.

rollup을 사용하면 Druid는 타임스탬프 자름(truncation) 이후 동일한 타임스탬프와 dimension 값을 가진 행들을 결합해요. Druid는 지정된 집계 함수를 사용해 각 롤업 행 집합에 대해 metric 값을 계산·저장해요.

수집이 완료된 뒤 데이터를 쿼리할 수 있어요.

예제 데이터 쿼리하기 (Query the example data)

웹 콘솔의 Query 뷰에서 새 탭을 열어 주세요. 다음 쿼리를 실행해 수집된 데이터를 확인해 주세요:

SELECT * FROM "rollup_tutorial"

다음과 같은 결과가 반환돼요:

__time srcIP dstIP bytes count packets
2018-01-01T01:01:00.000Z 1.1.1.1 2.2.2.2 35,937 3 286
2018-01-01T01:02:00.000Z 1.1.1.1 2.2.2.2 366,260 2 415
2018-01-01T01:03:00.000Z 1.1.1.1 2.2.2.2 10,204 1 49
2018-01-02T21:33:00.000Z 7.7.7.7 8.8.8.8 100,288 2 161
2018-01-02T21:35:00.000Z 7.7.7.7 8.8.8.8 2,818 1 12

예제 데이터의 아홉 행 대신 행이 다섯 개뿐이라는 점에 주목해 주세요. 다음 섹션에서는 롤업된 행의 구성 요소를 살펴볼게요.

Rollup 동작 살펴보기 (View rollup in action)

분 2018-01-01T01:01 동안 발생한 원본 입력 데이터의 세 이벤트를 생각해 볼게요:

{"timestamp":"2018-01-01T01:01:35Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":20,"bytes":9024}
{"timestamp":"2018-01-01T01:01:51Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":255,"bytes":21133}
{"timestamp":"2018-01-01T01:01:59Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":11,"bytes":5780}

Druid는 rollup 동안 세 행을 하나로 결합해요:

__time srcIP dstIP bytes count packets
2018-01-01T01:01:00.000Z 1.1.1.1 2.2.2.2 35,937 3 286

Grouping이 일어나기 전에 FLOOR(TIME_PARSE("timestamp") TO MINUTE) 표현식이 원본 입력의 타임스탬프 컬럼을 분 단위로 버킷(내림)해요.

입력 행들은 dimension 컬럼 {timestamp, srcIP, dstIP} 의 값이 같기 때문에 grouping돼요. metric 컬럼은 packets 와 bytes 에 대해 grouping된 행들의 sum 집계를 계산해요. count metric은 원본 입력 데이터의 몇 개 행이 최종 롤업 행에 기여했는지를 보여 줘요.

이제 분 2018-01-01T01:02 동안 발생한 원본 입력 데이터의 두 이벤트를 생각해 볼게요:

{"timestamp":"2018-01-01T01:02:14Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":38,"bytes":6289}
{"timestamp":"2018-01-01T01:02:29Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":377,"bytes":359971}

행들은 rollup 중에 다음과 같이 grouping돼요:

__time srcIP dstIP bytes count packets
2018-01-01T01:02:00.000Z 1.1.1.1 2.2.2.2 366,260 2 415

원본 입력 데이터에서 분 2018-01-01T01:03 동안에는 이벤트가 하나만 발생해요:

{"timestamp":"2018-01-01T01:03:29Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":49,"bytes":10204}

따라서 rollup이 일어나지 않아요:

__time srcIP dstIP bytes count packets
2018-01-01T01:03:00.000Z 1.1.1.1 2.2.2.2 10,204 1 49

더 알아보기 (Learn more)

자세한 내용은 다음 주제를 참고해 주세요: