파이프라인 집계
파이프라인 집계 (Pipeline aggregations)
파이프라인 집계는 한 집계의 출력을 다른 집계의 입력으로 사용해 여러 집계를 서로 연결해요. 도함수(derivative), 이동 평균(moving average), 누적 합계(cumulative sum) 같은 복잡한 통계적·수학적 측도를 계산해요. 일부 파이프라인 집계는 메트릭 및 버킷 집계의 기능을 복제하지만, 많은 경우 사용하기에 더 직관적이에요.
파이프라인 집계는 다른 모든 형제 집계가 실행된 후에 실행돼요. 이는 성능에 영향을 줘요. 예를 들어 bucket_selector 파이프라인 집계를 사용해 버킷 목록을 좁혀도 생략된 버킷에 대해 수행되는 계산 수가 줄어들지 않아요.
파이프라인 집계는 하위 집계(sub-aggregation)될 수 없지만 다른 파이프라인 집계에 연결될 수는 있어요. 예를 들어 두 개의 연속적인 derivative 집계를 연결해 2차 도함수를 계산할 수 있어요. 파이프라인 집계는 기존 출력에 추가된다는 점을 명심하세요. 예를 들어 derivative 집계를 연결해 2차 도함수를 계산하면 1차 및 2차 도함수가 모두 출력돼요.
출처: 문서
본문
파이프라인 집계 유형
파이프라인 집계에는 형제(sibling)와 부모(parent)의 두 가지 유형이 있어요.
형제 집계 (Sibling aggregations)
형제 파이프라인 집계는 중첩 집계의 출력을 가져와 중첩 버킷과 동일한 수준에서 새 버킷 또는 새 집계를 생성해요.
형제 집계는 다중 버킷(multi-bucket) 집계(특정 필드에 대해 여러 그룹화된 값을 가짐)여야 하고, 메트릭은 숫자 값이어야 해요.
부모 집계 (Parent aggregations)
부모 집계는 외부 집계의 출력을 가져와 기존 버킷과 동일한 수준에서 새 버킷 또는 새 집계를 생성해요. 모든 버킷에 걸쳐 연산해 단일 출력을 생성하는 형제 파이프라인 집계와 달리, 부모 파이프라인 집계는 각 버킷을 개별적으로 처리하고 결과를 각 버킷에 다시 기록해요.
부모 집계에 대해 지정된 메트릭은 숫자 값이어야 해요.
부모 집계에는 min_doc_count를 0으로 설정하는 것을(히스토그램 집계의 기본값) 강력히 권장해요. min_doc_count가 0보다 크면 집계가 버킷을 생략하므로 잘못된 결과가 발생할 수 있어요.
지원되는 파이프라인 집계
OpenSearch는 다음과 같은 파이프라인 집계를 지원해요.
| 이름 | 유형 | 설명 |
|---|---|---|
avg_bucket |
Sibling | 이전 집계의 각 버킷에서 메트릭의 평균을 계산해요. |
bucket_script |
Parent | 버킷 집합에 걸쳐 버킷별 숫자 계산을 수행하기 위해 스크립트를 실행해요. |
bucket_selector |
Parent | 히스토그램(또는 date_histogram) 집계가 반환한 버킷이 최종 결과에 포함되어야 하는지 판단하기 위해 스크립트를 평가해요. |
bucket_sort |
Parent | 부모 다중 버킷 집계가 생성한 버킷을 정렬하거나 자릅니다. |
cumulative_sum |
Parent | 이전 집계의 버킷들에 걸쳐 누적 합계를 계산해요. |
derivative |
Parent | 집계의 각 버킷에 대한 1차 및 2차 도함수를 계산해요. |
extended_stats |
Sibling | 추가 메트릭을 제공하는 stats_bucket 집계의 더 포괄적인 버전이에요. |
max_bucket |
Sibling | 이전 집계의 각 버킷에서 메트릭의 최댓값을 계산해요. |
min_bucket |
Sibling | 이전 집계의 각 버킷에서 메트릭의 최솟값을 계산해요. |
moving_avg (Deprecated) |
Parent | 정렬된 데이터셋의 창(인접 부분 집합)에 포함된 메트릭의 평균 수열을 계산해요. |
moving_fn |
Parent | 슬라이딩 윈도우에 걸쳐 스크립트를 실행해요. |
percentiles_bucket |
Sibling | 버킷화된 메트릭의 백분위 위치를 계산해요. |
serial_diff |
Parent | 현재 버킷과 이전 버킷의 메트릭 값 사이의 차이를 계산해요. 결과를 현재 버킷에 저장해요. |
stats_bucket |
Sibling | 이전 집계의 버킷에 대한 다양한 통계(count, min, max, avg, sum)를 반환해요. |
sum_bucket |
Sibling | 이전 집계의 각 버킷에서 메트릭의 합계를 계산해요. |
버킷 경로 (Buckets path)
파이프라인 집계는 buckets_path 파라미터를 사용해 다른 집계의 출력을 참조해요. buckets_path 파라미터의 구문은 다음과 같아요:
buckets_path = [ > ... ][ . ]
이 구문은 다음 요소를 사용해요.
| 요소 | 설명 |
|---|---|
<agg_name> |
집계의 이름이에요. |
> |
한 집계(부모)에서 다른 중첩 집계(자식)로 이동하는 데 사용되는 자식 선택기예요. |
.<metric_name> |
다중 값 집계에서 가져올 메트릭을 지정해요. 대상 집계가 여러 메트릭을 생성하는 경우에만 필요해요. |
버킷 경로를 시각화하기 위해 다음 집계 구조가 있다고 가정해 봐요:
"aggs": {
"parent_agg": {
"terms": {
"field": "category"
},
"aggs": {
"child_agg": {
"stats": {
"field": "price"
}
}
}
}
}
parent_agg에 중첩된 child_agg의 평균 가격을 참조하려면 parent_agg>child_agg.avg를 사용해요.
예시:
my_sum.sum:my_sum집계의sum메트릭을 참조해요.popular_tags>my_sum.sum:popular_tags집계 아래에 중첩된my_sum집계의sum메트릭을 참조해요.
stats나 percentiles 같은 다중 값 메트릭 집계의 경우 경로에 메트릭 이름(예: .min)을 포함해야 해요. sum이나 avg 같은 단일 값 메트릭의 경우 모호하지 않으면 메트릭 이름은 선택 사항이에요.
버킷 경로 예제
다음 예제는 OpenSearch Dashboards 로그 샘플 데이터를 대상으로 동작해요. bytes 필드 값의 히스토그램을 생성하고, 각 히스토그램 버킷에서 phpmemory 필드를 합산하며, 마지막으로 sum_bucket 파이프라인 집계로 버킷들을 합산해요. buckets_path는 number_of_bytes 부모 집계에서 sum_total_memory 하위 집계로 이어지는 number_of_bytes>sum_total_memory 경로를 따라가요:
GET opensearch_dashboards_sample_data_logs/_search
{
"size": 0,
"aggs": {
"number_of_bytes": {
"histogram": {
"field": "bytes",
"interval": 10000
},
"aggs": {
"sum_total_memory": {
"sum": {
"field": "phpmemory"
}
}
}
},
"sum_copies": {
"sum_bucket": {
"buckets_path": "number_of_bytes>sum_total_memory"
}
}
}
}
buckets_path에 구성 요소 집계의 이름이 포함된다는 점에 주목하세요. 경로는 방향성이 있어 부모에서 자식으로 한 방향으로만 이어져요.
파이프라인 집계는 모든 버킷에서 합산된 총 메모리를 반환해요:
{
...
"aggregations": {
"number_of_bytes": {
"buckets": [
{
"key": 0,
"doc_count": 13372,
"sum_total_memory": {
"value": 91266400
}
},
{
"key": 10000,
"doc_count": 702,
"sum_total_memory": {
"value": 0
}
}
]
},
"sum_copies": {
"value": 91266400
}
}
}
개수 경로 (Count paths)
buckets_path가 값 대신 개수(count)를 입력으로 사용하도록 지정할 수 있어요. 이렇게 하려면 _count 버킷 경로 변수를 사용해요.
다음 예제는 OpenSearch Dashboards 로그 샘플 데이터의 bytes 개수 히스토그램에 대한 기본 통계를 계산해요. bytes 필드 값의 히스토그램을 생성한 다음 히스토그램 버킷의 개수에 대한 통계를 계산해요.
GET opensearch_dashboards_sample_data_logs/_search
{
"size": 0,
"aggs": {
"number_of_bytes": {
"histogram": {
"field": "bytes",
"interval": 10000
}
},
"count_stats": {
"stats_bucket": {
"buckets_path": "number_of_bytes>_count"
}
}
}
}
결과는 버킷의 문서 개수에 대한 통계를 보여줘요:
{
...
"aggregations": {
"number_of_bytes": {
"buckets": [
{
"key": 0,
"doc_count": 13372
},
{
"key": 10000,
"doc_count": 702
}
]
},
"count_stats": {
"count": 2,
"min": 702,
"max": 13372,
"avg": 7037,
"sum": 14074
}
}
}
데이터 공백 (Data gaps)
실제 데이터는 다음과 같은 다양한 이유로 중첩 집계에서 누락될 수 있어요:
- 문서의 누락 값
- 집계 연결 체인 어디든 빈 버킷
- 버킷 값을 계산하는 데 필요한 데이터 누락(예:
derivative같은 롤링 함수는 시작하려면 하나 이상의 이전 값이 필요해요)
gap_policy 속성을 사용해 누락 데이터를 처리할 정책을 지정할 수 있어요. 즉 누락 데이터를 건너뛰거나 누락 데이터를 0으로 대체할 수 있어요.
gap_policy 파라미터는 모든 파이프라인 집계에 유효해요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
gap_policy |
선택 | String | 누락 데이터에 적용할 정책이에요. 유효한 값은 skip과 insert_zeros예요. 기본값은 skip이에요. |
format |
선택 | String | DecimalFormat 형식 문자열이에요. 집계의 value_as_string 속성에 형식화된 출력을 반환해요. |