오픈소스

드루이드(druid) 튜토리얼 및 스크립트 분석

JMDev 2023. 12. 15. 23:24

이전에 드루이드를 로컬에 설치해보았고, 이를 사용해보려고 한다.

처음에 가면 Quickstart Document에 어떻게 실행하는지 대략적으로 알려준다.

https://druid.apache.org/docs/latest/tutorials/

[Quickstart (local) | Apache® Druid

<!--

druid.apache.org](https://druid.apache.org/docs/latest/tutorials/)

위와 같이 동일하게 실행하게 되면,

튜토리얼 테이블이 하나 만들어지게 된다.

Quickstart 방식에서는 특정 폴더에 파일을 불러오면

해당 파일포멧팅에 맞게 테이블을 만들어 줄 수 있는 쿼리를 만들어준다.

해당 쿼리를 실행하면 드루이드 테이블을 만들어준다.

위 방법으로도 쉽게 만들 수 있는 것 같다.

하지만 위 방법으로 작성하게 되면 Rollup 옵션이라던지, 필요한 디테일한 명령어들을 실행할 수 없는 것 같다.

https://druid.apache.org/docs/latest/tutorials/tutorial-rollup

[Aggregate data with rollup | Apache® Druid

<!--

druid.apache.org](https://druid.apache.org/docs/latest/tutorials/tutorial-rollup)

위 튜토리얼 페이지를 잘 읽어보면 드루이드의 테이블을 Ingestion 하는 스크립트를 작성하는 부분을 볼 수 있다.

{
  "type" : "index_parallel",
  "spec" : {
    "dataSchema" : {
      "dataSource" : "rollup-tutorial",
      "dimensionsSpec" : {
        "dimensions" : [
          "srcIP",
          "dstIP"
        ]
      },
      "timestampSpec": {
        "column": "timestamp",
        "format": "iso"
      },
      "metricsSpec" : [
        { "type" : "count", "name" : "count" },
        { "type" : "longSum", "name" : "packets", "fieldName" : "packets" },
        { "type" : "longSum", "name" : "bytes", "fieldName" : "bytes" }
      ],
      "granularitySpec" : {
        "type" : "uniform",
        "segmentGranularity" : "week",
        "queryGranularity" : "minute",
        "intervals" : ["2018-01-01/2018-01-03"],
        "rollup" : true
      }
    },
    "ioConfig" : {
      "type" : "index_parallel",
      "inputSource" : {
        "type" : "local",
        "baseDir" : "quickstart/tutorial",
        "filter" : "rollup-data.json"
      },
      "inputFormat" : {
        "type" : "json"
      },
      "appendToExisting" : false
    },
    "tuningConfig" : {
      "type" : "index_parallel",
      "partitionsSpec": {
        "type": "dynamic"
      },
      "maxRowsInMemory" : 25000
    }
  }
}
  1. type: Ingestion 작업의 유형을 정의합니다. **index_parallel**은 병렬 처리를 지원하는 인덱싱 작업을 의미합니다.
  2. spec: Ingestion 작업의 구체적인 사양을 정의하는 부분입니다.
    • dataSchema: 데이터 스키마에 대한 설정입니다.
      • dataSource: 적재할 데이터의 대상 데이터 소스(테이블)의 이름입니다.
      • timestampSpec: 타임스탬프 데이터를 처리하는 방법을 정의합니다.
        • column: 타임스탬프 값이 있는 컬럼의 이름입니다.
        • format: 타임스탬프 데이터의 형식입니다. 여기서는 ISO 표준 형식을 사용합니다.
      • dimensionsSpec: 차원(디멘션)에 대한 설정입니다.
        • dimensions: 차원으로 사용할 컬럼의 목록입니다. 예시에는 **srcIP**와 **dstIP**가 있습니다.
      • metricsSpec: 메트릭(측정 가능한 데이터)에 대한 설정입니다.
        • 각 메트릭 설정은 메트릭의 유형(type), 이름(name), 그리고 필드 이름(fieldName)을 정의합니다.
      • granularitySpec: 데이터의 세분성 및 롤업에 대한 설정입니다.
        • segmentGranularity: 데이터 세그먼트의 시간적 범위를 정의합니다.
        • queryGranularity: 쿼리 시 데이터를 얼마나 세분화하여 처리할지 정의합니다.
        • intervals: 처리할 시간 범위를 지정합니다.
        • rollup: 데이터 롤업(요약)을 활성화할지 여부를 결정합니다.
    • ioConfig: 입력 데이터 및 Ingestion 작업 유형에 관한 설정입니다.
      • inputSource: 데이터 소스에 대한 설정입니다.
        • type: 데이터 소스의 유형을 정의합니다. 여기서는 로컬 파일 시스템을 나타냅니다.
        • baseDirfilter: 데이터 파일의 위치와 파일 이름(또는 패턴)을 지정합니다.
      • inputFormat: 입력 데이터 형식을 정의합니다. 여기서는 JSON 형식을 사용합니다.
      • appendToExisting: 기존 데이터에 추가할지 여부를 결정합니다.
    • tuningConfig: Ingestion 작업의 성능 조정에 관한 설정입니다.
      • maxRowsPerSegment: 각 세그먼트 당 최대 행 수를 정의합니다.
      • maxRowsInMemory: 메모리에 유지할 수 있는 최대 행 수를 지정합니다.

위에 있는 Ingestion 스크립트에 대한 자세한 설명을 첨언했다.( GPT 참고 )

위 스크립트 기준으로 다양한 파일포멧들을 ingestion 스크립트를 작성해서 실행하면 적재할 수 있다.

또한 위 스크립트를 잘 작성하는 것이 드루이드 테이블의 크기를 줄일 수 있고, 효과적인 쿼리실행 결과를 보장해줄 수 있다.

그리고 Rollup 이라는 키워드로 공식문서에서 개념을 설명해주는데,

간략하게 말하면, 저장하는 테이블에 카운트를 해줄 수 있는 매트릭을 만들어주고, 특정 중복되는 데이터들을 집계해주는 역활을 해준다

 

 

예시로 rollup를 false를 하고 저장할 경우,

 

Time/stamp/Page/VisitorID

2023-03-01 12:00:00 Home 123
2023-03-01 12:00:00 About 124
2023-03-01 12:00:00 Home 123
2023-03-01 12:01:00 Home 125
2023-03-01 12:01:00 Home 123

 

 

위와 같이 저장이 된다면, rollup를 true로 인자값을 넣으면 아래와 같이 집계가 될 수 있다.

  • Time/ stamp / Page / Count
    2023-03-01 12:00:00 Home 2
    2023-03-01 12:00:00 About 1
    2023-03-01 12:01:00 Home 2

 

결론은 Rollup이라는 옵션과 디멘션, 그리고 그외 그렌티 Spec 들을 작성할 수 있는 요령이 드루이드를 효율적으로 쓰는 방향일 것이라는 생각이 든다.