이전에 드루이드를 로컬에 설치해보았고, 이를 사용해보려고 한다.
처음에 가면 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
}
}
}
- type: Ingestion 작업의 유형을 정의합니다. **index_parallel**은 병렬 처리를 지원하는 인덱싱 작업을 의미합니다.
- 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: 데이터 소스의 유형을 정의합니다. 여기서는 로컬 파일 시스템을 나타냅니다.
- baseDir 및 filter: 데이터 파일의 위치와 파일 이름(또는 패턴)을 지정합니다.
- inputFormat: 입력 데이터 형식을 정의합니다. 여기서는 JSON 형식을 사용합니다.
- appendToExisting: 기존 데이터에 추가할지 여부를 결정합니다.
- inputSource: 데이터 소스에 대한 설정입니다.
- tuningConfig: Ingestion 작업의 성능 조정에 관한 설정입니다.
- maxRowsPerSegment: 각 세그먼트 당 최대 행 수를 정의합니다.
- maxRowsInMemory: 메모리에 유지할 수 있는 최대 행 수를 지정합니다.
- dataSchema: 데이터 스키마에 대한 설정입니다.
위에 있는 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 들을 작성할 수 있는 요령이 드루이드를 효율적으로 쓰는 방향일 것이라는 생각이 든다.
'오픈소스' 카테고리의 다른 글
| [Airflow] Driud에 적재하는 task 작성하기 (0) | 2024.01.06 |
|---|---|
| [Spark] DockerCompose Airflow, PySpark DAG 실행하기 (0) | 2023.12.25 |
| M1으로 docker 로 설치하다 실패해 local로 설치하는 과정 (0) | 2023.12.15 |
| Eventsim으로 생성한 로그데이터로 SuperSet으로 시각화하기(4) (0) | 2023.12.07 |
| Eventsim으로 생성한 로그데이터로 SuperSet으로 시각화하기(3) (0) | 2023.12.03 |