Supervisor API

Supervisor API

Apache Druid에서 supervisor를 관리하고 모니터링하는 API 엔드포인트를 다룹니다. 파티션 안 레코드의 식별자를 지칭할 때 Apache Kafka 용어 offset을 사용해요. Amazon Kinesis를 쓴다면 동일한 개념이 sequence number입니다.

출처: 문서

본문

이 문서는 Apache Druid의 supervisor 관리 및 모니터링을 위한 API 엔드포인트를 설명합니다. 이 문서는 파티션 안 레코드의 식별자를 지칭할 때 Apache Kafka 용어 offset을 사용합니다. Amazon Kinesis를 사용한다면 이에 상응하는 개념은 sequence number입니다.

이 문서에서 http://ROUTER_IP:ROUTER_PORT는 여러분의 Router 서비스 주소와 포트를 위한 자리표시자입니다. 이를 배포 정보로 교체하세요. 예를 들어 quickstart 배포라면 http://localhost:8888을 사용합니다.

Supervisor 정보

다음 표는 supervisor 객체의 속성을 나열합니다.

속성 타입 설명
id String 고유 식별자.
state String supervisor의 일반 상태. 가능한 상태: UNHEALTHY_SUPERVISOR, UNHEALTHY_TASKS, PENDING, RUNNING, SUSPENDED, STOPPING. 자세한 내용은 Supervisor reference를 참고하세요.
detailedState String supervisor의 상세 상태. 이 속성은 state 속성보다 supervisor의 활동에 더 많은 통찰을 줄 수 있는, 더 설명적인 구현별 상태를 담습니다. supervisor별 상태는 Apache Kafka ingestion과 Amazon Kinesis ingestion을 참고하세요.
healthy Boolean supervisor 건강 지표.
spec Object supervisor 구성의 컨테이너 객체.
suspended Boolean supervisor가 일시 중지(suspended) 상태인지 나타냅니다.

활성 supervisor ID 배열 가져오기

활성 supervisor 이름을 나타내는 문자열 배열을 반환합니다. 활성 supervisor가 없으면 빈 배열을 반환합니다.

URL

GET /druid/indexer/v1/supervisor

응답
  • 200 SUCCESS — 활성 supervisor ID 배열을 성공적으로 조회함
샘플 요청

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor"

HTTP

GET /druid/indexer/v1/supervisor HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
[
  "wikipedia_stream",
  "social_media"
]

활성 supervisor 객체 배열 가져오기

활성 supervisor 객체 배열을 가져옵니다. 활성 supervisor가 없으면 빈 배열을 반환합니다. supervisor 객체 속성에 대한 참고는 앞의 표를 보세요.

URL

GET /druid/indexer/v1/supervisor?full

응답
  • 200 SUCCESS — supervisor 객체를 성공적으로 조회함
샘플 요청

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor?full=null"

HTTP

GET /druid/indexer/v1/supervisor?full=null HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
[
  {
      "id": "wikipedia_stream",
      "state": "RUNNING",
      "detailedState": "CONNECTING_TO_STREAM",
      "healthy": true,
      "spec": {
          "type": "kafka",
          "spec": {
              "dataSchema": {
                  "dataSource": "wikipedia_stream",
                  "timestampSpec": {
                      "column": "__time",
                      "format": "iso",
                      "missingValue": null
                  },
                  "dimensionsSpec": {
                      "dimensions": [
                          {
                              "type": "string",
                              "name": "username",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          },
                          {
                              "type": "string",
                              "name": "post_title",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          },
                          {
                              "type": "long",
                              "name": "views",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "long",
                              "name": "upvotes",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "long",
                              "name": "comments",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "string",
                              "name": "edited",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          }
                      ],
                      "dimensionExclusions": [
                          "__time"
                      ],
                      "includeAllDimensions": false,
                      "useSchemaDiscovery": false
                  },
                  "metricsSpec": [],
                  "granularitySpec": {
                      "type": "uniform",
                      "segmentGranularity": "HOUR",
                      "queryGranularity": {
                          "type": "none"
                      },
                      "rollup": false,
                      "intervals": []
                  },
                  "transformSpec": {
                      "filter": null,
                      "transforms": []
                  }
              },
              "ioConfig": {
                  "topic": "social_media",
                  "inputFormat": {
                      "type": "json"
                  },
                  "replicas": 1,
                  "taskCount": 1,
                  "taskDuration": "PT3600S",
                  "consumerProperties": {
                      "bootstrap.servers": "localhost:9042"
                  },
                  "autoScalerConfig": null,
                  "pollTimeout": 100,
                  "startDelay": "PT5S",
                  "period": "PT30S",
                  "useEarliestOffset": true,
                  "completionTimeout": "PT1800S",
                  "lateMessageRejectionPeriod": null,
                  "earlyMessageRejectionPeriod": null,
                  "lateMessageRejectionStartDateTime": null,
                  "configOverrides": null,
                  "idleConfig": null,
                  "stream": "social_media",
                  "useEarliestSequenceNumber": true
              },
              "tuningConfig": {
                  "type": "kafka",
                  "appendableIndexSpec": {
                      "type": "onheap",
                      "preserveExistingMetrics": false
                  },
                  "maxRowsInMemory": 150000,
                  "maxBytesInMemory": 0,
                  "skipBytesInMemoryOverheadCheck": false,
                  "maxRowsPerSegment": 5000000,
                  "maxTotalRows": null,
                  "intermediatePersistPeriod": "PT10M",
                  "maxPendingPersists": 0,
                  "indexSpec": {
                      "bitmap": {
                          "type": "roaring"
                      },
                      "dimensionCompression": "lz4",
                      "stringDictionaryEncoding": {
                          "type": "utf8"
                      },
                      "metricCompression": "lz4",
                      "longEncoding": "longs"
                  },
                  "indexSpecForIntermediatePersists": {
                      "bitmap": {
                          "type": "roaring"
                      },
                      "dimensionCompression": "lz4",
                      "stringDictionaryEncoding": {
                          "type": "utf8"
                      },
                      "metricCompression": "lz4",
                      "longEncoding": "longs"
                  },
                  "reportParseExceptions": false,
                  "handoffConditionTimeout": 0,
                  "resetOffsetAutomatically": false,
                  "segmentWriteOutMediumFactory": null,
                  "workerThreads": null,
                  "chatRetries": 8,
                  "httpTimeout": "PT10S",
                  "shutdownTimeout": "PT80S",
                  "offsetFetchPeriod": "PT30S",
                  "intermediateHandoffPeriod": "P2147483647D",
                  "logParseExceptions": false,
                  "maxParseExceptions": 2147483647,
                  "maxSavedParseExceptions": 0,
                  "skipSequenceNumberAvailabilityCheck": false,
                  "repartitionTransitionDuration": "PT120S"
              }
          },
          "dataSchema": {
              "dataSource": "wikipedia_stream",
              "timestampSpec": {
                  "column": "__time",
                  "format": "iso",
                  "missingValue": null
              },
              "dimensionsSpec": {
                  "dimensions": [
                      {
                          "type": "string",
                          "name": "username",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      },
                      {
                          "type": "string",
                          "name": "post_title",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      },
                      {
                          "type": "long",
                          "name": "views",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "long",
                          "name": "upvotes",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "long",
                          "name": "comments",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "string",
                          "name": "edited",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      }
                  ],
                  "dimensionExclusions": [
                      "__time"
                  ],
                  "includeAllDimensions": false,
                  "useSchemaDiscovery": false
              },
              "metricsSpec": [],
              "granularitySpec": {
                  "type": "uniform",
                  "segmentGranularity": "HOUR",
                  "queryGranularity": {
                      "type": "none"
                  },
                  "rollup": false,
                  "intervals": []
              },
              "transformSpec": {
                  "filter": null,
                  "transforms": []
              }
          },
          "tuningConfig": {
              "type": "kafka",
              "appendableIndexSpec": {
                  "type": "onheap",
                  "preserveExistingMetrics": false
              },
              "maxRowsInMemory": 150000,
              "maxBytesInMemory": 0,
              "skipBytesInMemoryOverheadCheck": false,
              "maxRowsPerSegment": 5000000,
              "maxTotalRows": null,
              "intermediatePersistPeriod": "PT10M",
              "maxPendingPersists": 0,
              "indexSpec": {
                  "bitmap": {
                      "type": "roaring"
                  },
                  "dimensionCompression": "lz4",
                  "stringDictionaryEncoding": {
                      "type": "utf8"
                  },
                  "metricCompression": "lz4",
                  "longEncoding": "longs"
              },
              "indexSpecForIntermediatePersists": {
                  "bitmap": {
                      "type": "roaring"
                  },
                  "dimensionCompression": "lz4",
                  "stringDictionaryEncoding": {
                      "type": "utf8"
                  },
                  "metricCompression": "lz4",
                  "longEncoding": "longs"
              },
              "reportParseExceptions": false,
              "handoffConditionTimeout": 0,
              "resetOffsetAutomatically": false,
              "segmentWriteOutMediumFactory": null,
              "workerThreads": null,
              "chatRetries": 8,
              "httpTimeout": "PT10S",
              "shutdownTimeout": "PT80S",
              "offsetFetchPeriod": "PT30S",
              "intermediateHandoffPeriod": "P2147483647D",
              "logParseExceptions": false,
              "maxParseExceptions": 2147483647,
              "maxSavedParseExceptions": 0,
              "skipSequenceNumberAvailabilityCheck": false,
              "repartitionTransitionDuration": "PT120S"
          },
          "ioConfig": {
              "topic": "social_media",
              "inputFormat": {
                  "type": "json"
              },
              "replicas": 1,
              "taskCount": 1,
              "taskDuration": "PT3600S",
              "consumerProperties": {
                  "bootstrap.servers": "localhost:9042"
              },
              "autoScalerConfig": null,
              "pollTimeout": 100,
              "startDelay": "PT5S",
              "period": "PT30S",
              "useEarliestOffset": true,
              "completionTimeout": "PT1800S",
              "lateMessageRejectionPeriod": null,
              "earlyMessageRejectionPeriod": null,
              "lateMessageRejectionStartDateTime": null,
              "configOverrides": null,
              "idleConfig": null,
              "stream": "social_media",
              "useEarliestSequenceNumber": true
          },
          "context": null,
          "suspended": false
      },
      "suspended": false
  },
  {
      "id": "social_media",
      "state": "RUNNING",
      "detailedState": "RUNNING",
      "healthy": true,
      "spec": {
          "type": "kafka",
          "spec": {
              "dataSchema": {
                  "dataSource": "social_media",
                  "timestampSpec": {
                      "column": "__time",
                      "format": "iso",
                      "missingValue": null
                  },
                  "dimensionsSpec": {
                      "dimensions": [
                          {
                              "type": "string",
                              "name": "username",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          },
                          {
                              "type": "string",
                              "name": "post_title",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          },
                          {
                              "type": "long",
                              "name": "views",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "long",
                              "name": "upvotes",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "long",
                              "name": "comments",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "string",
                              "name": "edited",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          }
                      ],
                      "dimensionExclusions": [
                          "__time"
                      ],
                      "includeAllDimensions": false,
                      "useSchemaDiscovery": false
                  },
                  "metricsSpec": [],
                  "granularitySpec": {
                      "type": "uniform",
                      "segmentGranularity": "HOUR",
                      "queryGranularity": {
                          "type": "none"
                      },
                      "rollup": false,
                      "intervals": []
                  },
                  "transformSpec": {
                      "filter": null,
                      "transforms": []
                  }
              },
              "ioConfig": {
                  "topic": "social_media",
                  "inputFormat": {
                      "type": "json"
                  },
                  "replicas": 1,
                  "taskCount": 1,
                  "taskDuration": "PT3600S",
                  "consumerProperties": {
                      "bootstrap.servers": "localhost:9094"
                  },
                  "autoScalerConfig": null,
                  "pollTimeout": 100,
                  "startDelay": "PT5S",
                  "period": "PT30S",
                  "useEarliestOffset": true,
                  "completionTimeout": "PT1800S",
                  "lateMessageRejectionPeriod": null,
                  "earlyMessageRejectionPeriod": null,
                  "lateMessageRejectionStartDateTime": null,
                  "configOverrides": null,
                  "idleConfig": null,
                  "stream": "social_media",
                  "useEarliestSequenceNumber": true
              },
              "tuningConfig": {
                  "type": "kafka",
                  "appendableIndexSpec": {
                      "type": "onheap",
                      "preserveExistingMetrics": false
                  },
                  "maxRowsInMemory": 150000,
                  "maxBytesInMemory": 0,
                  "skipBytesInMemoryOverheadCheck": false,
                  "maxRowsPerSegment": 5000000,
                  "maxTotalRows": null,
                  "intermediatePersistPeriod": "PT10M",
                  "maxPendingPersists": 0,
                  "indexSpec": {
                      "bitmap": {
                          "type": "roaring"
                      },
                      "dimensionCompression": "lz4",
                      "stringDictionaryEncoding": {
                          "type": "utf8"
                      },
                      "metricCompression": "lz4",
                      "longEncoding": "longs"
                  },
                  "indexSpecForIntermediatePersists": {
                      "bitmap": {
                          "type": "roaring"
                      },
                      "dimensionCompression": "lz4",
                      "stringDictionaryEncoding": {
                          "type": "utf8"
                      },
                      "metricCompression": "lz4",
                      "longEncoding": "longs"
                  },
                  "reportParseExceptions": false,
                  "handoffConditionTimeout": 0,
                  "resetOffsetAutomatically": false,
                  "segmentWriteOutMediumFactory": null,
                  "workerThreads": null,
                  "chatRetries": 8,
                  "httpTimeout": "PT10S",
                  "shutdownTimeout": "PT80S",
                  "offsetFetchPeriod": "PT30S",
                  "intermediateHandoffPeriod": "P2147483647D",
                  "logParseExceptions": false,
                  "maxParseExceptions": 2147483647,
                  "maxSavedParseExceptions": 0,
                  "skipSequenceNumberAvailabilityCheck": false,
                  "repartitionTransitionDuration": "PT120S"
              }
          },
          "dataSchema": {
              "dataSource": "social_media",
              "timestampSpec": {
                  "column": "__time",
                  "format": "iso",
                  "missingValue": null
              },
              "dimensionsSpec": {
                  "dimensions": [
                      {
                          "type": "string",
                          "name": "username",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      },
                      {
                          "type": "string",
                          "name": "post_title",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      },
                      {
                          "type": "long",
                          "name": "views",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "long",
                          "name": "upvotes",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "long",
                          "name": "comments",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "string",
                          "name": "edited",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      }
                  ],
                  "dimensionExclusions": [
                      "__time"
                  ],
                  "includeAllDimensions": false,
                  "useSchemaDiscovery": false
              },
              "metricsSpec": [],
              "granularitySpec": {
                  "type": "uniform",
                  "segmentGranularity": "HOUR",
                  "queryGranularity": {
                      "type": "none"
                  },
                  "rollup": false,
                  "intervals": []
              },
              "transformSpec": {
                  "filter": null,
                  "transforms": []
              }
          },
          "tuningConfig": {
              "type": "kafka",
              "appendableIndexSpec": {
                  "type": "onheap",
                  "preserveExistingMetrics": false
              },
              "maxRowsInMemory": 150000,
              "maxBytesInMemory": 0,
              "skipBytesInMemoryOverheadCheck": false,
              "maxRowsPerSegment": 5000000,
              "maxTotalRows": null,
              "intermediatePersistPeriod": "PT10M",
              "maxPendingPersists": 0,
              "indexSpec": {
                  "bitmap": {
                      "type": "roaring"
                  },
                  "dimensionCompression": "lz4",
                  "stringDictionaryEncoding": {
                      "type": "utf8"
                  },
                  "metricCompression": "lz4",
                  "longEncoding": "longs"
              },
              "indexSpecForIntermediatePersists": {
                  "bitmap": {
                      "type": "roaring"
                  },
                  "dimensionCompression": "lz4",
                  "stringDictionaryEncoding": {
                      "type": "utf8"
                  },
                  "metricCompression": "lz4",
                  "longEncoding": "longs"
              },
              "reportParseExceptions": false,
              "handoffConditionTimeout": 0,
              "resetOffsetAutomatically": false,
              "segmentWriteOutMediumFactory": null,
              "workerThreads": null,
              "chatRetries": 8,
              "httpTimeout": "PT10S",
              "shutdownTimeout": "PT80S",
              "offsetFetchPeriod": "PT30S",
              "intermediateHandoffPeriod": "P2147483647D",
              "logParseExceptions": false,
              "maxParseExceptions": 2147483647,
              "maxSavedParseExceptions": 0,
              "skipSequenceNumberAvailabilityCheck": false,
              "repartitionTransitionDuration": "PT120S"
          },
          "ioConfig": {
              "topic": "social_media",
              "inputFormat": {
                  "type": "json"
              },
              "replicas": 1,
              "taskCount": 1,
              "taskDuration": "PT3600S",
              "consumerProperties": {
                  "bootstrap.servers": "localhost:9094"
              },
              "autoScalerConfig": null,
              "pollTimeout": 100,
              "startDelay": "PT5S",
              "period": "PT30S",
              "useEarliestOffset": true,
              "completionTimeout": "PT1800S",
              "lateMessageRejectionPeriod": null,
              "earlyMessageRejectionPeriod": null,
              "lateMessageRejectionStartDateTime": null,
              "configOverrides": null,
              "idleConfig": null,
              "stream": "social_media",
              "useEarliestSequenceNumber": true
          },
          "context": null,
          "suspended": false
      },
      "suspended": false
  }
]

supervisor 상태 배열 가져오기

활성 supervisor와 그 현재 상태를 나타내는 객체 배열을 가져옵니다. 활성 supervisor가 없으면 빈 배열을 반환합니다. supervisor 객체 속성에 대한 참고는 앞의 표를 보세요.

URL

GET /druid/indexer/v1/supervisor?state=true

응답
  • 200 SUCCESS — supervisor 상태 객체를 성공적으로 조회함
샘플 요청

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor?state=true"

HTTP

GET /druid/indexer/v1/supervisor?state=true HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
[
  {
      "id": "wikipedia_stream",
      "state": "UNHEALTHY_SUPERVISOR",
      "detailedState": "UNABLE_TO_CONNECT_TO_STREAM",
      "healthy": false,
      "suspended": false
  },
  {
      "id": "social_media",
      "state": "RUNNING",
      "detailedState": "RUNNING",
      "healthy": true,
      "suspended": false
  }
]

supervisor 스펙 가져오기

단일 supervisor의 스펙을 가져옵니다. 반환된 스펙에는 dataSchema, ioConfig, tuningConfig 객체가 포함됩니다.

URL

GET /druid/indexer/v1/supervisor/{supervisorId}

응답
  • 200 SUCCESS — supervisor 스펙을 성공적으로 조회함
  • 404 NOT FOUND — 잘못된 supervisor ID
샘플 요청

다음 예시는 이름이 wikipedia_stream인 supervisor의 스펙을 가져오는 방법을 보여줍니다.

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/wikipedia_stream"

HTTP

GET /druid/indexer/v1/supervisor/wikipedia_stream HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "type": "kafka",
  "spec": {
      "dataSchema": {
          "dataSource": "social_media",
          "timestampSpec": {
              "column": "__time",
              "format": "iso",
              "missingValue": null
          },
          "dimensionsSpec": {
              "dimensions": [
                  {
                      "type": "string",
                      "name": "username",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  },
                  {
                      "type": "string",
                      "name": "post_title",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  },
                  {
                      "type": "long",
                      "name": "views",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "long",
                      "name": "upvotes",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "long",
                      "name": "comments",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "string",
                      "name": "edited",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  }
              ],
              "dimensionExclusions": [
                  "__time"
              ],
              "includeAllDimensions": false,
              "useSchemaDiscovery": false
          },
          "metricsSpec": [],
          "granularitySpec": {
              "type": "uniform",
              "segmentGranularity": "HOUR",
              "queryGranularity": {
                  "type": "none"
              },
              "rollup": false,
              "intervals": []
          },
          "transformSpec": {
              "filter": null,
              "transforms": []
          }
      },
      "ioConfig": {
          "topic": "social_media",
          "inputFormat": {
              "type": "json"
          },
          "replicas": 1,
          "taskCount": 1,
          "taskDuration": "PT3600S",
          "consumerProperties": {
              "bootstrap.servers": "localhost:9094"
          },
          "autoScalerConfig": null,
          "pollTimeout": 100,
          "startDelay": "PT5S",
          "period": "PT30S",
          "useEarliestOffset": true,
          "completionTimeout": "PT1800S",
          "lateMessageRejectionPeriod": null,
          "earlyMessageRejectionPeriod": null,
          "lateMessageRejectionStartDateTime": null,
          "configOverrides": null,
          "idleConfig": null,
          "stream": "social_media",
          "useEarliestSequenceNumber": true
      },
      "tuningConfig": {
          "type": "kafka",
          "appendableIndexSpec": {
              "type": "onheap",
              "preserveExistingMetrics": false
          },
          "maxRowsInMemory": 150000,
          "maxBytesInMemory": 0,
          "skipBytesInMemoryOverheadCheck": false,
          "maxRowsPerSegment": 5000000,
          "maxTotalRows": null,
          "intermediatePersistPeriod": "PT10M",
          "maxPendingPersists": 0,
          "indexSpec": {
              "bitmap": {
                  "type": "roaring"
              },
              "dimensionCompression": "lz4",
              "stringDictionaryEncoding": {
                  "type": "utf8"
              },
              "metricCompression": "lz4",
              "longEncoding": "longs"
          },
          "indexSpecForIntermediatePersists": {
              "bitmap": {
                  "type": "roaring"
              },
              "dimensionCompression": "lz4",
              "stringDictionaryEncoding": {
                  "type": "utf8"
              },
              "metricCompression": "lz4",
              "longEncoding": "longs"
          },
          "reportParseExceptions": false,
          "handoffConditionTimeout": 0,
          "resetOffsetAutomatically": false,
          "segmentWriteOutMediumFactory": null,
          "workerThreads": null,
          "chatRetries": 8,
          "httpTimeout": "PT10S",
          "shutdownTimeout": "PT80S",
          "offsetFetchPeriod": "PT30S",
          "intermediateHandoffPeriod": "P2147483647D",
          "logParseExceptions": false,
          "maxParseExceptions": 2147483647,
          "maxSavedParseExceptions": 0,
          "skipSequenceNumberAvailabilityCheck": false,
          "repartitionTransitionDuration": "PT120S"
      }
  },
  "dataSchema": {
      "dataSource": "social_media",
      "timestampSpec": {
          "column": "__time",
          "format": "iso",
          "missingValue": null
      },
      "dimensionsSpec": {
          "dimensions": [
              {
                  "type": "string",
                  "name": "username",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              },
              {
                  "type": "string",
                  "name": "post_title",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              },
              {
                  "type": "long",
                  "name": "views",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "long",
                  "name": "upvotes",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "long",
                  "name": "comments",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "string",
                  "name": "edited",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              }
          ],
          "dimensionExclusions": [
              "__time"
          ],
          "includeAllDimensions": false,
          "useSchemaDiscovery": false
      },
      "metricsSpec": [],
      "granularitySpec": {
          "type": "uniform",
          "segmentGranularity": "HOUR",
          "queryGranularity": {
              "type": "none"
          },
          "rollup": false,
          "intervals": []
      },
      "transformSpec": {
          "filter": null,
          "transforms": []
      }
  },
  "tuningConfig": {
      "type": "kafka",
      "appendableIndexSpec": {
          "type": "onheap",
          "preserveExistingMetrics": false
      },
      "maxRowsInMemory": 150000,
      "maxBytesInMemory": 0,
      "skipBytesInMemoryOverheadCheck": false,
      "maxRowsPerSegment": 5000000,
      "maxTotalRows": null,
      "intermediatePersistPeriod": "PT10M",
      "maxPendingPersists": 0,
      "indexSpec": {
          "bitmap": {
              "type": "roaring"
          },
          "dimensionCompression": "lz4",
          "stringDictionaryEncoding": {
              "type": "utf8"
          },
          "metricCompression": "lz4",
          "longEncoding": "longs"
      },
      "indexSpecForIntermediatePersists": {
          "bitmap": {
              "type": "roaring"
          },
          "dimensionCompression": "lz4",
          "stringDictionaryEncoding": {
              "type": "utf8"
          },
          "metricCompression": "lz4",
          "longEncoding": "longs"
      },
      "reportParseExceptions": false,
      "handoffConditionTimeout": 0,
      "resetOffsetAutomatically": false,
      "segmentWriteOutMediumFactory": null,
      "workerThreads": null,
      "chatRetries": 8,
      "httpTimeout": "PT10S",
      "shutdownTimeout": "PT80S",
      "offsetFetchPeriod": "PT30S",
      "intermediateHandoffPeriod": "P2147483647D",
      "logParseExceptions": false,
      "maxParseExceptions": 2147483647,
      "maxSavedParseExceptions": 0,
      "skipSequenceNumberAvailabilityCheck": false,
      "repartitionTransitionDuration": "PT120S"
  },
  "ioConfig": {
      "topic": "social_media",
      "inputFormat": {
          "type": "json"
      },
      "replicas": 1,
      "taskCount": 1,
      "taskDuration": "PT3600S",
      "consumerProperties": {
          "bootstrap.servers": "localhost:9094"
      },
      "autoScalerConfig": null,
      "pollTimeout": 100,
      "startDelay": "PT5S",
      "period": "PT30S",
      "useEarliestOffset": true,
      "completionTimeout": "PT1800S",
      "lateMessageRejectionPeriod": null,
      "earlyMessageRejectionPeriod": null,
      "lateMessageRejectionStartDateTime": null,
      "configOverrides": null,
      "idleConfig": null,
      "stream": "social_media",
      "useEarliestSequenceNumber": true
  },
  "context": null,
  "suspended": false
}

supervisor 상태 가져오기

단일 supervisor의 현재 상태 보고서를 가져옵니다. 보고서에는 supervisor 태스크의 상태와 최근에 발생한 예외 배열이 포함됩니다.

상태 보고서에 대한 추가 정보는 Supervisor reference를 참고하세요.

URL

GET /druid/indexer/v1/supervisor/{supervisorId}/status

응답
  • 200 SUCCESS — supervisor 상태를 성공적으로 조회함
  • 404 NOT FOUND — 잘못된 supervisor ID
샘플 요청

다음 예시는 이름이 social_media인 supervisor의 상태를 가져오는 방법을 보여줍니다.

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/social_media/status"

HTTP

GET /druid/indexer/v1/supervisor/social_media/status HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
    "id": "social_media",
    "generationTime": "2023-07-05T23:24:43.934Z",
    "payload": {
        "dataSource": "social_media",
        "stream": "social_media",
        "partitions": 1,
        "replicas": 1,
        "durationSeconds": 3600,
        "activeTasks": [
            {
                "id": "index_kafka_social_media_ab72ae4127c591c_flcbhdlh",
                "startingOffsets": {
                    "0": 3176381
                },
                "startTime": "2023-07-05T23:21:39.321Z",
                "remainingSeconds": 3415,
                "type": "ACTIVE",
                "currentOffsets": {
                    "0": 3296632
                },
                "lag": {
                    "0": 3
                }
            }
        ],
        "publishingTasks": [],
        "latestOffsets": {
            "0": 3296635
        },
        "minimumLag": {
            "0": 3
        },
        "aggregateLag": 3,
        "offsetsLastUpdated": "2023-07-05T23:24:30.212Z",
        "suspended": false,
        "healthy": true,
        "state": "RUNNING",
        "detailedState": "RUNNING",
        "recentErrors": []
    }
}

supervisor 헬스 가져오기

단일 supervisor의 현재 헬스 보고서를 가져옵니다. supervisor의 헬스는 supervisor의 상태(/status 엔드포인트가 반환하는)와 druid.supervisor.* Overlord 구성 임계값에 의해 결정됩니다.

URL

GET /druid/indexer/v1/supervisor/{supervisorId}/health

응답
  • 200 SUCCESS — supervisor가 건강함
  • 404 NOT FOUND — 잘못된 supervisor ID
  • 503 SERVICE UNAVAILABLE — supervisor가 건강하지 않음
샘플 요청

다음 예시는 이름이 social_media인 supervisor의 헬스 보고서를 가져오는 방법을 보여줍니다.

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/social_media/health"

HTTP

GET /druid/indexer/v1/supervisor/social_media/health HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "healthy": false
}

supervisor 수집 통계 가져오기

supervisor가 관리하는 각 태스크의 현재 수집 행 카운터와 그 이동 평균(moving average)의 스냅샷을 반환합니다. 자세한 내용은 Row stats를 참고하세요.

응답 스키마

응답은 태스크 그룹 ID → 태스크 ID → 행 통계의 중첩 맵입니다.

{
  "<taskGroupId>": {
    "<taskId>": {
      "movingAverages": { ... },
      "totals": { ... }
    }
  }
}
  • taskGroupId (string): supervisor 태스크 그룹 식별자
  • taskId (string): 그 그룹 안의 Druid 인덱싱 태스크 식별자
  • movingAverages / totals: 태스크별 행 통계. 필드 정의는 Row stats를 참고하세요.

예를 들어 두 개의 태스크 그룹이 있는 supervisor:

{
  "0": {
    "index_kafka_my_datasource_abc123": {
      "movingAverages": {
        "buildSegments": {
          "5m": { "processed": 10.0, "unparseable": 0.0, "thrownAway": 0.0, "processedWithError": 0.0 },
          "15m": { "processed": 5.0, "unparseable": 0.0, "thrownAway": 0.0, "processedWithError": 0.0 },
          "1m": { "processed": 12.0, "unparseable": 0.0, "thrownAway": 0.0, "processedWithError": 0.0 }
        }
      },
      "totals": {
        "buildSegments": { "processed": 2000, "processedWithError": 0, "thrownAway": 0, "unparseable": 0 }
      }
    }
  },
  "1": {
    "index_kafka_my_datasource_def456": {
      "movingAverages": {
        "buildSegments": {
          "5m": { "processed": 8.0, "unparseable": 0.0, "thrownAway": 0.0, "processedWithError": 0.0 },
          "15m": { "processed": 4.0, "unparseable": 0.0, "thrownAway": 0.0, "processedWithError": 0.0 },
          "1m": { "processed": 9.0, "unparseable": 0.0, "thrownAway": 0.0, "processedWithError": 0.0 }
        }
      },
      "totals": {
        "buildSegments": { "processed": 1500, "processedWithError": 0, "thrownAway": 0, "unparseable": 0 }
      }
    }
  }
}

이 예시에서 "0"과 "1"은 태스크 그룹 ID이고, index_kafka_my_datasource_abc123와 index_kafka_my_datasource_def456은 태스크 ID입니다.

URL

GET /druid/indexer/v1/supervisor/{supervisorId}/stats

응답
  • 200 SUCCESS — supervisor 통계를 성공적으로 조회함
  • 404 NOT FOUND — 잘못된 supervisor ID
샘플 요청

다음 예시는 이름이 custom_data인 supervisor의 현재 수집 행 카운터를 가져오는 방법을 보여줍니다.

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/custom_data/stats"

HTTP

GET /druid/indexer/v1/supervisor/custom_data/stats HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답

아래 예시에서 바깥 키("0")는 태스크 그룹 ID이고, 안쪽 키(예: index_kafka_custom_data_881d621078f6b7c_ccplchbi)는 태스크 ID입니다.

{
  "0": {
      "index_kafka_custom_data_881d621078f6b7c_ccplchbi": {
          "movingAverages": {
              "buildSegments": {
                  "5m": {
                      "processed": 53.401225142603316,
                      "processedBytes": 5226.400757148808,
                      "unparseable": 0.0,
                      "thrownAway": 0.0,
                      "processedWithError": 0.0
                  },
                  "15m": {
                      "processed": 56.92994990102502,
                      "processedBytes": 5571.772059828217,
                      "unparseable": 0.0,
                      "thrownAway": 0.0,
                      "processedWithError": 0.0
                  },
                  "1m": {
                      "processed": 37.134921285556636,
                      "processedBytes": 3634.2766230628677,
                      "unparseable": 0.0,
                      "thrownAway": 0.0,
                      "processedWithError": 0.0
                  }
              }
          },
          "totals": {
              "buildSegments": {
                  "processed": 665,
                  "processedBytes": 65079,
                  "processedWithError": 0,
                  "thrownAway": 0,
                  "unparseable": 0
                  }
              }
          }
      }
  }

자동화 클라이언트에게: 태스크 ID를 그룹 ID에 매핑해야 한다면(핸드오프, 드레이닝(draining), 관측성 목적), 파티션 데이터에서 그룹 ID를 다시 유도하지 말고 /stats 응답의 키를 그대로 사용하세요. 이렇게 하면 내부 supervisor 할당 로직에 대한 결합을 피할 수 있습니다.

감사 기록 (Audit history)

감사 기록(audit history)은 supervisor 구성·생성·일시 중지·수정 기록을 포함한 이벤트의 포괄적인 로그를 제공합니다.

모든 supervisor의 감사 기록 가져오기

모든 supervisor의 스펙 감사 기록을 가져옵니다.

URL

GET /druid/indexer/v1/supervisor/history

응답
  • 200 SUCCESS — 감사 기록을 성공적으로 조회함
샘플 요청

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/history"

HTTP

GET /druid/indexer/v1/supervisor/history HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "social_media": [
      {
          "spec": {
              "type": "kafka",
              "spec": {
                  "dataSchema": {
                      "dataSource": "social_media",
                      "timestampSpec": {
                          "column": "__time",
                          "format": "iso",
                          "missingValue": null
                      },
                      "dimensionsSpec": {
                          "dimensions": [
                              {
                                  "type": "string",
                                  "name": "username",
                                  "multiValueHandling": "SORTED_ARRAY",
                                  "createBitmapIndex": true
                              },
                              {
                                  "type": "string",
                                  "name": "post_title",
                                  "multiValueHandling": "SORTED_ARRAY",
                                  "createBitmapIndex": true
                              },
                              {
                                  "type": "long",
                                  "name": "views",
                                  "multiValueHandling": "SORTED_ARRAY",
                                  "createBitmapIndex": false
                              },
                              {
                                  "type": "long",
                                  "name": "upvotes",
                                  "multiValueHandling": "SORTED_ARRAY",
                                  "createBitmapIndex": false
                              },
                              {
                                  "type": "long",
                                  "name": "comments",
                                  "multiValueHandling": "SORTED_ARRAY",
                                  "createBitmapIndex": false
                              },
                              {
                                  "type": "string",
                                  "name": "edited",
                                  "multiValueHandling": "SORTED_ARRAY",
                                  "createBitmapIndex": true
                              }
                          ],
                          "dimensionExclusions": [
                              "__time"
                          ],
                          "includeAllDimensions": false,
                          "useSchemaDiscovery": false
                      },
                      "metricsSpec": [],
                      "granularitySpec": {
                          "type": "uniform",
                          "segmentGranularity": "HOUR",
                          "queryGranularity": {
                              "type": "none"
                          },
                          "rollup": false,
                          "intervals": []
                      },
                      "transformSpec": {
                          "filter": null,
                          "transforms": []
                      }
                  },
                  "ioConfig": {
                      "topic": "social_media",
                      "inputFormat": {
                          "type": "json"
                      },
                      "replicas": 1,
                      "taskCount": 1,
                      "taskDuration": "PT3600S",
                      "consumerProperties": {
                          "bootstrap.servers": "localhost:9094"
                      },
                      "autoScalerConfig": null,
                      "pollTimeout": 100,
                      "startDelay": "PT5S",
                      "period": "PT30S",
                      "useEarliestOffset": true,
                      "completionTimeout": "PT1800S",
                      "lateMessageRejectionPeriod": null,
                      "earlyMessageRejectionPeriod": null,
                      "lateMessageRejectionStartDateTime": null,
                      "configOverrides": null,
                      "idleConfig": null,
                      "stream": "social_media",
                      "useEarliestSequenceNumber": true
                  },
                  "tuningConfig": {
                      "type": "kafka",
                      "appendableIndexSpec": {
                          "type": "onheap",
                          "preserveExistingMetrics": false
                      },
                      "maxRowsInMemory": 150000,
                      "maxBytesInMemory": 0,
                      "skipBytesInMemoryOverheadCheck": false,
                      "maxRowsPerSegment": 5000000,
                      "maxTotalRows": null,
                      "intermediatePersistPeriod": "PT10M",
                      "maxPendingPersists": 0,
                      "indexSpec": {
                          "bitmap": {
                              "type": "roaring"
                          },
                          "dimensionCompression": "lz4",
                          "stringDictionaryEncoding": {
                              "type": "utf8"
                          },
                          "metricCompression": "lz4",
                          "longEncoding": "longs"
                      },
                      "indexSpecForIntermediatePersists": {
                          "bitmap": {
                              "type": "roaring"
                          },
                          "dimensionCompression": "lz4",
                          "stringDictionaryEncoding": {
                              "type": "utf8"
                          },
                          "metricCompression": "lz4",
                          "longEncoding": "longs"
                      },
                      "reportParseExceptions": false,
                      "handoffConditionTimeout": 0,
                      "resetOffsetAutomatically": false,
                      "segmentWriteOutMediumFactory": null,
                      "workerThreads": null,
                      "chatRetries": 8,
                      "httpTimeout": "PT10S",
                      "shutdownTimeout": "PT80S",
                      "offsetFetchPeriod": "PT30S",
                      "intermediateHandoffPeriod": "P2147483647D",
                      "logParseExceptions": false,
                      "maxParseExceptions": 2147483647,
                      "maxSavedParseExceptions": 0,
                      "skipSequenceNumberAvailabilityCheck": false,
                      "repartitionTransitionDuration": "PT120S"
                  }
              },
              "dataSchema": {
                  "dataSource": "social_media",
                  "timestampSpec": {
                      "column": "__time",
                      "format": "iso",
                      "missingValue": null
                  },
                  "dimensionsSpec": {
                      "dimensions": [
                          {
                              "type": "string",
                              "name": "username",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          },
                          {
                              "type": "string",
                              "name": "post_title",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          },
                          {
                              "type": "long",
                              "name": "views",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "long",
                              "name": "upvotes",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "long",
                              "name": "comments",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "string",
                              "name": "edited",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          }
                      ],
                      "dimensionExclusions": [
                          "__time"
                      ],
                      "includeAllDimensions": false,
                      "useSchemaDiscovery": false
                  },
                  "metricsSpec": [],
                  "granularitySpec": {
                      "type": "uniform",
                      "segmentGranularity": "HOUR",
                      "queryGranularity": {
                          "type": "none"
                      },
                      "rollup": false,
                      "intervals": []
                  },
                  "transformSpec": {
                      "filter": null,
                      "transforms": []
                  }
              },
              "tuningConfig": {
                  "type": "kafka",
                  "appendableIndexSpec": {
                      "type": "onheap",
                      "preserveExistingMetrics": false
                  },
                  "maxRowsInMemory": 150000,
                  "maxBytesInMemory": 0,
                  "skipBytesInMemoryOverheadCheck": false,
                  "maxRowsPerSegment": 5000000,
                  "maxTotalRows": null,
                  "intermediatePersistPeriod": "PT10M",
                  "maxPendingPersists": 0,
                  "indexSpec": {
                      "bitmap": {
                          "type": "roaring"
                      },
                      "dimensionCompression": "lz4",
                      "stringDictionaryEncoding": {
                          "type": "utf8"
                      },
                      "metricCompression": "lz4",
                      "longEncoding": "longs"
                  },
                  "indexSpecForIntermediatePersists": {
                      "bitmap": {
                          "type": "roaring"
                      },
                      "dimensionCompression": "lz4",
                      "stringDictionaryEncoding": {
                          "type": "utf8"
                      },
                      "metricCompression": "lz4",
                      "longEncoding": "longs"
                  },
                  "reportParseExceptions": false,
                  "handoffConditionTimeout": 0,
                  "resetOffsetAutomatically": false,
                  "segmentWriteOutMediumFactory": null,
                  "workerThreads": null,
                  "chatRetries": 8,
                  "httpTimeout": "PT10S",
                  "shutdownTimeout": "PT80S",
                  "offsetFetchPeriod": "PT30S",
                  "intermediateHandoffPeriod": "P2147483647D",
                  "logParseExceptions": false,
                  "maxParseExceptions": 2147483647,
                  "maxSavedParseExceptions": 0,
                  "skipSequenceNumberAvailabilityCheck": false,
                  "repartitionTransitionDuration": "PT120S"
              },
              "ioConfig": {
                  "topic": "social_media",
                  "inputFormat": {
                      "type": "json"
                  },
                  "replicas": 1,
                  "taskCount": 1,
                  "taskDuration": "PT3600S",
                  "consumerProperties": {
                      "bootstrap.servers": "localhost:9094"
                  },
                  "autoScalerConfig": null,
                  "pollTimeout": 100,
                  "startDelay": "PT5S",
                  "period": "PT30S",
                  "useEarliestOffset": true,
                  "completionTimeout": "PT1800S",
                  "lateMessageRejectionPeriod": null,
                  "earlyMessageRejectionPeriod": null,
                  "lateMessageRejectionStartDateTime": null,
                  "configOverrides": null,
                  "idleConfig": null,
                  "stream": "social_media",
                  "useEarliestSequenceNumber": true
              },
              "context": null,
              "suspended": false
          },
          "version": "2023-07-03T18:51:02.970Z"
      }
  ]
}

특정 supervisor의 감사 기록 가져오기

단일 supervisor의 스펙 감사 기록을 가져옵니다.

URL

GET /druid/indexer/v1/supervisor/{supervisorId}/history

쿼리 파라미터
  • count (선택) — 타입: Integer. 결과 수를 마지막 n개 항목으로 제한합니다. 지정하면 0보다 커야 합니다.
응답
  • 200 SUCCESS — supervisor 감사 기록을 성공적으로 조회함
  • 404 NOT FOUND — 잘못된 supervisor ID
샘플 요청

다음 예시는 이름이 wikipedia_stream인 supervisor의 감사 기록을 가져오는 방법을 보여줍니다.

모든 기록 항목 가져오기:

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/wikipedia_stream/history"

HTTP

GET /druid/indexer/v1/supervisor/wikipedia_stream/history HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT

마지막 10개 기록 항목 가져오기:

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/wikipedia_stream/history?count=10"

HTTP

GET /druid/indexer/v1/supervisor/wikipedia_stream/history?count=10 HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
[
  {
      "spec": {
          "type": "kafka",
          "spec": {
              "dataSchema": {
                  "dataSource": "wikipedia_stream",
                  "timestampSpec": {
                      "column": "__time",
                      "format": "iso",
                      "missingValue": null
                  },
                  "dimensionsSpec": {
                      "dimensions": [
                          {
                              "type": "string",
                              "name": "username",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          },
                          {
                              "type": "string",
                              "name": "post_title",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          },
                          {
                              "type": "long",
                              "name": "views",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "long",
                              "name": "upvotes",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "long",
                              "name": "comments",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": false
                          },
                          {
                              "type": "string",
                              "name": "edited",
                              "multiValueHandling": "SORTED_ARRAY",
                              "createBitmapIndex": true
                          }
                      ],
                      "dimensionExclusions": [
                          "__time"
                      ],
                      "includeAllDimensions": false,
                      "useSchemaDiscovery": false
                  },
                  "metricsSpec": [],
                  "granularitySpec": {
                      "type": "uniform",
                      "segmentGranularity": "HOUR",
                      "queryGranularity": {
                          "type": "none"
                      },
                      "rollup": false,
                      "intervals": []
                  },
                  "transformSpec": {
                      "filter": null,
                      "transforms": []
                  }
              },
              "ioConfig": {
                  "topic": "social_media",
                  "inputFormat": {
                      "type": "json"
                  },
                  "replicas": 1,
                  "taskCount": 1,
                  "taskDuration": "PT3600S",
                  "consumerProperties": {
                      "bootstrap.servers": "localhost:9042"
                  },
                  "autoScalerConfig": null,
                  "pollTimeout": 100,
                  "startDelay": "PT5S",
                  "period": "PT30S",
                  "useEarliestOffset": true,
                  "completionTimeout": "PT1800S",
                  "lateMessageRejectionPeriod": null,
                  "earlyMessageRejectionPeriod": null,
                  "lateMessageRejectionStartDateTime": null,
                  "configOverrides": null,
                  "idleConfig": null,
                  "stream": "social_media",
                  "useEarliestSequenceNumber": true
              },
              "tuningConfig": {
                  "type": "kafka",
                  "appendableIndexSpec": {
                      "type": "onheap",
                      "preserveExistingMetrics": false
                  },
                  "maxRowsInMemory": 150000,
                  "maxBytesInMemory": 0,
                  "skipBytesInMemoryOverheadCheck": false,
                  "maxRowsPerSegment": 5000000,
                  "maxTotalRows": null,
                  "intermediatePersistPeriod": "PT10M",
                  "maxPendingPersists": 0,
                  "indexSpec": {
                      "bitmap": {
                          "type": "roaring"
                      },
                      "dimensionCompression": "lz4",
                      "stringDictionaryEncoding": {
                          "type": "utf8"
                      },
                      "metricCompression": "lz4",
                      "longEncoding": "longs"
                  },
                  "indexSpecForIntermediatePersists": {
                      "bitmap": {
                          "type": "roaring"
                      },
                      "dimensionCompression": "lz4",
                      "stringDictionaryEncoding": {
                          "type": "utf8"
                      },
                      "metricCompression": "lz4",
                      "longEncoding": "longs"
                  },
                  "reportParseExceptions": false,
                  "handoffConditionTimeout": 0,
                  "resetOffsetAutomatically": false,
                  "segmentWriteOutMediumFactory": null,
                  "workerThreads": null,
                  "chatRetries": 8,
                  "httpTimeout": "PT10S",
                  "shutdownTimeout": "PT80S",
                  "offsetFetchPeriod": "PT30S",
                  "intermediateHandoffPeriod": "P2147483647D",
                  "logParseExceptions": false,
                  "maxParseExceptions": 2147483647,
                  "maxSavedParseExceptions": 0,
                  "skipSequenceNumberAvailabilityCheck": false,
                  "repartitionTransitionDuration": "PT120S"
              }
          },
          "dataSchema": {
              "dataSource": "wikipedia_stream",
              "timestampSpec": {
                  "column": "__time",
                  "format": "iso",
                  "missingValue": null
              },
              "dimensionsSpec": {
                  "dimensions": [
                      {
                          "type": "string",
                          "name": "username",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      },
                      {
                          "type": "string",
                          "name": "post_title",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      },
                      {
                          "type": "long",
                          "name": "views",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "long",
                          "name": "upvotes",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "long",
                          "name": "comments",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": false
                      },
                      {
                          "type": "string",
                          "name": "edited",
                          "multiValueHandling": "SORTED_ARRAY",
                          "createBitmapIndex": true
                      }
                  ],
                  "dimensionExclusions": [
                      "__time"
                  ],
                  "includeAllDimensions": false,
                  "useSchemaDiscovery": false
              },
              "metricsSpec": [],
              "granularitySpec": {
                  "type": "uniform",
                  "segmentGranularity": "HOUR",
                  "queryGranularity": {
                      "type": "none"
                  },
                  "rollup": false,
                  "intervals": []
              },
              "transformSpec": {
                  "filter": null,
                  "transforms": []
              }
          },
          "tuningConfig": {
              "type": "kafka",
              "appendableIndexSpec": {
                  "type": "onheap",
                  "preserveExistingMetrics": false
              },
              "maxRowsInMemory": 150000,
              "maxBytesInMemory": 0,
              "skipBytesInMemoryOverheadCheck": false,
              "maxRowsPerSegment": 5000000,
              "maxTotalRows": null,
              "intermediatePersistPeriod": "PT10M",
              "maxPendingPersists": 0,
              "indexSpec": {
                  "bitmap": {
                      "type": "roaring"
                  },
                  "dimensionCompression": "lz4",
                  "stringDictionaryEncoding": {
                      "type": "utf8"
                  },
                  "metricCompression": "lz4",
                  "longEncoding": "longs"
              },
              "indexSpecForIntermediatePersists": {
                  "bitmap": {
                      "type": "roaring"
                  },
                  "dimensionCompression": "lz4",
                  "stringDictionaryEncoding": {
                      "type": "utf8"
                  },
                  "metricCompression": "lz4",
                  "longEncoding": "longs"
              },
              "reportParseExceptions": false,
              "handoffConditionTimeout": 0,
              "resetOffsetAutomatically": false,
              "segmentWriteOutMediumFactory": null,
              "workerThreads": null,
              "chatRetries": 8,
              "httpTimeout": "PT10S",
              "shutdownTimeout": "PT80S",
              "offsetFetchPeriod": "PT30S",
              "intermediateHandoffPeriod": "P2147483647D",
              "logParseExceptions": false,
              "maxParseExceptions": 2147483647,
              "maxSavedParseExceptions": 0,
              "skipSequenceNumberAvailabilityCheck": false,
              "repartitionTransitionDuration": "PT120S"
          },
          "ioConfig": {
              "topic": "social_media",
              "inputFormat": {
                  "type": "json"
              },
              "replicas": 1,
              "taskCount": 1,
              "taskDuration": "PT3600S",
              "consumerProperties": {
                  "bootstrap.servers": "localhost:9042"
              },
              "autoScalerConfig": null,
              "pollTimeout": 100,
              "startDelay": "PT5S",
              "period": "PT30S",
              "useEarliestOffset": true,
              "completionTimeout": "PT1800S",
              "lateMessageRejectionPeriod": null,
              "earlyMessageRejectionPeriod": null,
              "lateMessageRejectionStartDateTime": null,
              "configOverrides": null,
              "idleConfig": null,
              "stream": "social_media",
              "useEarliestSequenceNumber": true
          },
          "context": null,
          "suspended": false
      },
      "version": "2023-07-05T20:59:16.872Z"
  }
]

Supervisor 관리

supervisor 생성 또는 업데이트

새 supervisor 스펙을 생성하거나 기존 스펙을 새로운 구성과 스키마 정보로 업데이트합니다. supervisor 스펙을 업데이트할 때 데이터소스는 이전 supervisor와 동일해야 합니다.

Apache Kafka 또는 Amazon Kinesis 스트리밍 수집 방식에 대한 supervisor 스펙을 정의할 수 있어요.

다음 표는 supervisor 스펙의 속성을 나열합니다.

속성 타입 설명 필수
type String supervisor 타입. kafka 또는 kinesis 중 하나. 예
spec Object supervisor 구성의 컨테이너 객체. 예
ioConfig Object supervisor와 인덱싱 태스크의 연결 및 I/O 관련 설정을 정의하는 I/O 구성 객체. 예
dataSchema Object 수집 중 인덱싱 태스크가 사용할 스키마. 자세한 내용은 dataSchema를 참고하세요. 예
tuningConfig Object supervisor와 인덱싱 태스크의 성능 관련 설정을 정의하는 튜닝 구성 객체. 아니요

기존 supervisor에 대해 이 엔드포인트를 호출하면, 실행 중인 supervisor가 태스크에 읽기를 중단하고 게시를 시작하도록 신호를 보내며 스스로 종료됩니다. 그러면 Druid가 요청 본문에서 제공된 구성을 사용해 새 supervisor를 만듭니다. Druid는 기존 게시 태스크를 유지하면서 새 스키마를 제출하고, 이전 태스크 offset에서 새 태스크를 시작합니다. 이렇게 해서 수집을 중단하지 않고 구성 변경을 적용할 수 있습니다.

URL

POST /druid/indexer/v1/supervisor

응답
  • 200 SUCCESS — 새 supervisor를 성공적으로 만들거나 기존 supervisor를 업데이트함
  • 415 UNSUPPORTED MEDIA TYPE — 요청 본문 콘텐츠 타입이 JSON 형식이 아님
샘플 요청

다음 예시는 social_media 데이터소스와 social_media 토픽을 가진 Kafka용 supervisor 스펙을 JSON 입력 형식으로 생성합니다.

cURL

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor" \
--header 'Content-Type: application/json' \
--data '{
    "type": "kafka",
    "spec": {
        "ioConfig": {
            "type": "kafka",
            "consumerProperties": {
                "bootstrap.servers": "localhost:9094"
            },
            "topic": "social_media",
            "inputFormat": {
                "type": "json"
            },
            "useEarliestOffset": true
        },
        "tuningConfig": {
            "type": "kafka"
        },
        "dataSchema": {
            "dataSource": "social_media",
            "timestampSpec": {
                "column": "__time",
                "format": "iso"
            },
            "dimensionsSpec": {
                "dimensions": [
                    "username",
                    "post_title",
                    {
                        "type": "long",
                        "name": "views"
                    },
                    {
                        "type": "long",
                        "name": "upvotes"
                    },
                    {
                        "type": "long",
                        "name": "comments"
                    },
                    "edited"
                ]
            },
            "granularitySpec": {
                "queryGranularity": "none",
                "rollup": false,
                "segmentGranularity": "hour"
            }
        }
    }
}'

HTTP

POST /druid/indexer/v1/supervisor HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
Content-Type: application/json
Content-Length: 1359

{
    "type": "kafka",
    "spec": {
        "ioConfig": {
            "type": "kafka",
            "consumerProperties": {
                "bootstrap.servers": "localhost:9094"
            },
            "topic": "social_media",
            "inputFormat": {
                "type": "json"
            },
            "useEarliestOffset": true
        },
        "tuningConfig": {
            "type": "kafka"
        },
        "dataSchema": {
            "dataSource": "social_media",
            "timestampSpec": {
                "column": "__time",
                "format": "iso"
            },
            "dimensionsSpec": {
                "dimensions": [
                    "username",
                    "post_title",
                    {
                        "type": "long",
                        "name": "views"
                    },
                    {
                        "type": "long",
                        "name": "upvotes"
                    },
                    {
                        "type": "long",
                        "name": "comments"
                    },
                    "edited"
                ]
            },
            "granularitySpec": {
                "queryGranularity": "none",
                "rollup": false,
                "segmentGranularity": "hour"
            }
        }
    }
}
skipRestartIfUnmodified를 사용한 샘플 요청

다음 예시는 skipRestartIfUnmodified 플래그를 true로 설정합니다. 이 플래그가 true로 설정되면 SupervisorSpec에 수정이 있을 때만 supervisor가 재시작됩니다. 설정하지 않으면 플래그는 기본적으로 false입니다.

curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor?skipRestartIfUnmodified=true" \
--header 'Content-Type: application/json' \
--data '{
    "type": "kafka",
    "spec": {
        "ioConfig": {
            "type": "kafka",
            "consumerProperties": {
                "bootstrap.servers": "localhost:9094"
            },
            "topic": "social_media",
            "inputFormat": {
                "type": "json"
            },
            "useEarliestOffset": true
        },
        "tuningConfig": {
            "type": "kafka"
        },
        "dataSchema": {
            "dataSource": "social_media",
            "timestampSpec": {
                "column": "__time",
                "format": "iso"
            },
            "dimensionsSpec": {
                "dimensions": [
                    "username",
                    "post_title",
                    {
                        "type": "long",
                        "name": "views"
                    },
                    {
                        "type": "long",
                        "name": "upvotes"
                    },
                    {
                        "type": "long",
                        "name": "comments"
                    },
                    "edited"
                ]
            },
            "granularitySpec": {
                "queryGranularity": "none",
                "rollup": false,
                "segmentGranularity": "hour"
            }
        }
    }
}'
샘플 응답
{
  "id": "social_media"
}

실행 중인 supervisor 일시 중지

단일 실행 중인 supervisor를 일시 중지합니다. suspended 속성이 true로 설정된 업데이트된 supervisor 스펙을 반환합니다. 일시 중지된 supervisor는 계속 로그와 메트릭을 내보냅니다. 인덱싱 태스크는 supervisor를 재개할 때까지 일시 중지된 상태로 유지됩니다.

URL

POST /druid/indexer/v1/supervisor/{supervisorId}/suspend

응답
  • 200 SUCCESS — supervisor를 성공적으로 종료함
  • 400 BAD REQUEST — supervisor가 이미 일시 중지됨
  • 404 NOT FOUND — 잘못된 supervisor ID
샘플 요청

다음 예시는 이름이 social_media인 실행 중인 supervisor를 일시 중지하는 방법을 보여줍니다.

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/social_media/suspend"

HTTP

POST /druid/indexer/v1/supervisor/social_media/suspend HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "type": "kafka",
  "spec": {
      "dataSchema": {
          "dataSource": "social_media",
          "timestampSpec": {
              "column": "__time",
              "format": "iso",
              "missingValue": null
          },
          "dimensionsSpec": {
              "dimensions": [
                  {
                      "type": "string",
                      "name": "username",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  },
                  {
                      "type": "string",
                      "name": "post_title",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  },
                  {
                      "type": "long",
                      "name": "views",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "long",
                      "name": "upvotes",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "long",
                      "name": "comments",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "string",
                      "name": "edited",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  }
              ],
              "dimensionExclusions": [
                  "__time"
              ],
              "includeAllDimensions": false,
              "useSchemaDiscovery": false
          },
          "metricsSpec": [],
          "granularitySpec": {
              "type": "uniform",
              "segmentGranularity": "HOUR",
              "queryGranularity": {
                  "type": "none"
              },
              "rollup": false,
              "intervals": []
          },
          "transformSpec": {
              "filter": null,
              "transforms": []
          }
      },
      "ioConfig": {
          "topic": "social_media",
          "inputFormat": {
              "type": "json"
          },
          "replicas": 1,
          "taskCount": 1,
          "taskDuration": "PT3600S",
          "consumerProperties": {
              "bootstrap.servers": "localhost:9094"
          },
          "autoScalerConfig": null,
          "pollTimeout": 100,
          "startDelay": "PT5S",
          "period": "PT30S",
          "useEarliestOffset": true,
          "completionTimeout": "PT1800S",
          "lateMessageRejectionPeriod": null,
          "earlyMessageRejectionPeriod": null,
          "lateMessageRejectionStartDateTime": null,
          "configOverrides": null,
          "idleConfig": null,
          "stream": "social_media",
          "useEarliestSequenceNumber": true
      },
      "tuningConfig": {
          "type": "kafka",
          "appendableIndexSpec": {
              "type": "onheap",
              "preserveExistingMetrics": false
          },
          "maxRowsInMemory": 150000,
          "maxBytesInMemory": 0,
          "skipBytesInMemoryOverheadCheck": false,
          "maxRowsPerSegment": 5000000,
          "maxTotalRows": null,
          "intermediatePersistPeriod": "PT10M",
          "maxPendingPersists": 0,
          "indexSpec": {
              "bitmap": {
                  "type": "roaring"
              },
              "dimensionCompression": "lz4",
              "stringDictionaryEncoding": {
                  "type": "utf8"
              },
              "metricCompression": "lz4",
              "longEncoding": "longs"
          },
          "indexSpecForIntermediatePersists": {
              "bitmap": {
                  "type": "roaring"
              },
              "dimensionCompression": "lz4",
              "stringDictionaryEncoding": {
                  "type": "utf8"
              },
              "metricCompression": "lz4",
              "longEncoding": "longs"
          },
          "reportParseExceptions": false,
          "handoffConditionTimeout": 0,
          "resetOffsetAutomatically": false,
          "segmentWriteOutMediumFactory": null,
          "workerThreads": null,
          "chatRetries": 8,
          "httpTimeout": "PT10S",
          "shutdownTimeout": "PT80S",
          "offsetFetchPeriod": "PT30S",
          "intermediateHandoffPeriod": "P2147483647D",
          "logParseExceptions": false,
          "maxParseExceptions": 2147483647,
          "maxSavedParseExceptions": 0,
          "skipSequenceNumberAvailabilityCheck": false,
          "repartitionTransitionDuration": "PT120S"
      }
  },
  "dataSchema": {
      "dataSource": "social_media",
      "timestampSpec": {
          "column": "__time",
          "format": "iso",
          "missingValue": null
      },
      "dimensionsSpec": {
          "dimensions": [
              {
                  "type": "string",
                  "name": "username",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              },
              {
                  "type": "string",
                  "name": "post_title",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              },
              {
                  "type": "long",
                  "name": "views",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "long",
                  "name": "upvotes",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "long",
                  "name": "comments",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "string",
                  "name": "edited",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              }
          ],
          "dimensionExclusions": [
              "__time"
          ],
          "includeAllDimensions": false,
          "useSchemaDiscovery": false
      },
      "metricsSpec": [],
      "granularitySpec": {
          "type": "uniform",
          "segmentGranularity": "HOUR",
          "queryGranularity": {
              "type": "none"
          },
          "rollup": false,
          "intervals": []
      },
      "transformSpec": {
          "filter": null,
          "transforms": []
      }
  },
  "tuningConfig": {
      "type": "kafka",
      "appendableIndexSpec": {
          "type": "onheap",
          "preserveExistingMetrics": false
      },
      "maxRowsInMemory": 150000,
      "maxBytesInMemory": 0,
      "skipBytesInMemoryOverheadCheck": false,
      "maxRowsPerSegment": 5000000,
      "maxTotalRows": null,
      "intermediatePersistPeriod": "PT10M",
      "maxPendingPersists": 0,
      "indexSpec": {
          "bitmap": {
              "type": "roaring"
          },
          "dimensionCompression": "lz4",
          "stringDictionaryEncoding": {
              "type": "utf8"
          },
          "metricCompression": "lz4",
          "longEncoding": "longs"
      },
      "indexSpecForIntermediatePersists": {
          "bitmap": {
              "type": "roaring"
          },
          "dimensionCompression": "lz4",
          "stringDictionaryEncoding": {
              "type": "utf8"
          },
          "metricCompression": "lz4",
          "longEncoding": "longs"
      },
      "reportParseExceptions": false,
      "handoffConditionTimeout": 0,
      "resetOffsetAutomatically": false,
      "segmentWriteOutMediumFactory": null,
      "workerThreads": null,
      "chatRetries": 8,
      "httpTimeout": "PT10S",
      "shutdownTimeout": "PT80S",
      "offsetFetchPeriod": "PT30S",
      "intermediateHandoffPeriod": "P2147483647D",
      "logParseExceptions": false,
      "maxParseExceptions": 2147483647,
      "maxSavedParseExceptions": 0,
      "skipSequenceNumberAvailabilityCheck": false,
      "repartitionTransitionDuration": "PT120S"
  },
  "ioConfig": {
      "topic": "social_media",
      "inputFormat": {
          "type": "json"
      },
      "replicas": 1,
      "taskCount": 1,
      "taskDuration": "PT3600S",
      "consumerProperties": {
          "bootstrap.servers": "localhost:9094"
      },
      "autoScalerConfig": null,
      "pollTimeout": 100,
      "startDelay": "PT5S",
      "period": "PT30S",
      "useEarliestOffset": true,
      "completionTimeout": "PT1800S",
      "lateMessageRejectionPeriod": null,
      "earlyMessageRejectionPeriod": null,
      "lateMessageRejectionStartDateTime": null,
      "configOverrides": null,
      "idleConfig": null,
      "stream": "social_media",
      "useEarliestSequenceNumber": true
  },
  "context": null,
  "suspended": true
}

모든 supervisor 일시 중지

모든 supervisor를 일시 중지합니다. 참고로 이 엔드포인트는 일시 중지할 supervisor나 실행 중인 supervisor가 없어도 HTTP 200 Success 코드를 반환합니다.

URL

POST /druid/indexer/v1/supervisor/suspendAll

응답
  • 200 SUCCESS — 모든 supervisor를 성공적으로 일시 중지함
샘플 요청

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/suspendAll"

HTTP

POST /druid/indexer/v1/supervisor/suspendAll HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "status": "success"
}

supervisor 재개

supervisor의 인덱싱 태스크를 재개합니다. suspended 속성이 false로 설정된 업데이트된 supervisor 스펙을 반환합니다.

URL

POST /druid/indexer/v1/supervisor/{supervisorId}/resume

응답
  • 200 SUCCESS — supervisor를 성공적으로 재개함
  • 400 BAD REQUEST — supervisor가 이미 실행 중임
  • 404 NOT FOUND — 잘못된 supervisor ID
샘플 요청

다음 예시는 이름이 social_media인 이전에 일시 중지된 supervisor를 재개합니다.

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/social_media/resume"

HTTP

POST /druid/indexer/v1/supervisor/social_media/resume HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "type": "kafka",
  "spec": {
      "dataSchema": {
          "dataSource": "social_media",
          "timestampSpec": {
              "column": "__time",
              "format": "iso",
              "missingValue": null
          },
          "dimensionsSpec": {
              "dimensions": [
                  {
                      "type": "string",
                      "name": "username",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  },
                  {
                      "type": "string",
                      "name": "post_title",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  },
                  {
                      "type": "long",
                      "name": "views",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "long",
                      "name": "upvotes",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "long",
                      "name": "comments",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": false
                  },
                  {
                      "type": "string",
                      "name": "edited",
                      "multiValueHandling": "SORTED_ARRAY",
                      "createBitmapIndex": true
                  }
              ],
              "dimensionExclusions": [
                  "__time"
              ],
              "includeAllDimensions": false,
              "useSchemaDiscovery": false
          },
          "metricsSpec": [],
          "granularitySpec": {
              "type": "uniform",
              "segmentGranularity": "HOUR",
              "queryGranularity": {
                  "type": "none"
              },
              "rollup": false,
              "intervals": []
          },
          "transformSpec": {
              "filter": null,
              "transforms": []
          }
      },
      "ioConfig": {
          "topic": "social_media",
          "inputFormat": {
              "type": "json"
          },
          "replicas": 1,
          "taskCount": 1,
          "taskDuration": "PT3600S",
          "consumerProperties": {
              "bootstrap.servers": "localhost:9094"
          },
          "autoScalerConfig": null,
          "pollTimeout": 100,
          "startDelay": "PT5S",
          "period": "PT30S",
          "useEarliestOffset": true,
          "completionTimeout": "PT1800S",
          "lateMessageRejectionPeriod": null,
          "earlyMessageRejectionPeriod": null,
          "lateMessageRejectionStartDateTime": null,
          "configOverrides": null,
          "idleConfig": null,
          "stream": "social_media",
          "useEarliestSequenceNumber": true
      },
      "tuningConfig": {
          "type": "kafka",
          "appendableIndexSpec": {
              "type": "onheap",
              "preserveExistingMetrics": false
          },
          "maxRowsInMemory": 150000,
          "maxBytesInMemory": 0,
          "skipBytesInMemoryOverheadCheck": false,
          "maxRowsPerSegment": 5000000,
          "maxTotalRows": null,
          "intermediatePersistPeriod": "PT10M",
          "maxPendingPersists": 0,
          "indexSpec": {
              "bitmap": {
                  "type": "roaring"
              },
              "dimensionCompression": "lz4",
              "stringDictionaryEncoding": {
                  "type": "utf8"
              },
              "metricCompression": "lz4",
              "longEncoding": "longs"
          },
          "indexSpecForIntermediatePersists": {
              "bitmap": {
                  "type": "roaring"
              },
              "dimensionCompression": "lz4",
              "stringDictionaryEncoding": {
                  "type": "utf8"
              },
              "metricCompression": "lz4",
              "longEncoding": "longs"
          },
          "reportParseExceptions": false,
          "handoffConditionTimeout": 0,
          "resetOffsetAutomatically": false,
          "segmentWriteOutMediumFactory": null,
          "workerThreads": null,
          "chatRetries": 8,
          "httpTimeout": "PT10S",
          "shutdownTimeout": "PT80S",
          "offsetFetchPeriod": "PT30S",
          "intermediateHandoffPeriod": "P2147483647D",
          "logParseExceptions": false,
          "maxParseExceptions": 2147483647,
          "maxSavedParseExceptions": 0,
          "skipSequenceNumberAvailabilityCheck": false,
          "repartitionTransitionDuration": "PT120S"
      }
  },
  "dataSchema": {
      "dataSource": "social_media",
      "timestampSpec": {
          "column": "__time",
          "format": "iso",
          "missingValue": null
      },
      "dimensionsSpec": {
          "dimensions": [
              {
                  "type": "string",
                  "name": "username",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              },
              {
                  "type": "string",
                  "name": "post_title",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              },
              {
                  "type": "long",
                  "name": "views",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "long",
                  "name": "upvotes",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "long",
                  "name": "comments",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": false
              },
              {
                  "type": "string",
                  "name": "edited",
                  "multiValueHandling": "SORTED_ARRAY",
                  "createBitmapIndex": true
              }
          ],
          "dimensionExclusions": [
              "__time"
          ],
          "includeAllDimensions": false,
          "useSchemaDiscovery": false
      },
      "metricsSpec": [],
      "granularitySpec": {
          "type": "uniform",
          "segmentGranularity": "HOUR",
          "queryGranularity": {
              "type": "none"
          },
          "rollup": false,
          "intervals": []
      },
      "transformSpec": {
          "filter": null,
          "transforms": []
      }
  },
  "tuningConfig": {
      "type": "kafka",
      "appendableIndexSpec": {
          "type": "onheap",
          "preserveExistingMetrics": false
      },
      "maxRowsInMemory": 150000,
      "maxBytesInMemory": 0,
      "skipBytesInMemoryOverheadCheck": false,
      "maxRowsPerSegment": 5000000,
      "maxTotalRows": null,
      "intermediatePersistPeriod": "PT10M",
      "maxPendingPersists": 0,
      "indexSpec": {
          "bitmap": {
              "type": "roaring"
          },
          "dimensionCompression": "lz4",
          "stringDictionaryEncoding": {
              "type": "utf8"
          },
          "metricCompression": "lz4",
          "longEncoding": "longs"
      },
      "indexSpecForIntermediatePersists": {
          "bitmap": {
              "type": "roaring"
          },
          "dimensionCompression": "lz4",
          "stringDictionaryEncoding": {
              "type": "utf8"
          },
          "metricCompression": "lz4",
          "longEncoding": "longs"
      },
      "reportParseExceptions": false,
      "handoffConditionTimeout": 0,
      "resetOffsetAutomatically": false,
      "segmentWriteOutMediumFactory": null,
      "workerThreads": null,
      "chatRetries": 8,
      "httpTimeout": "PT10S",
      "shutdownTimeout": "PT80S",
      "offsetFetchPeriod": "PT30S",
      "intermediateHandoffPeriod": "P2147483647D",
      "logParseExceptions": false,
      "maxParseExceptions": 2147483647,
      "maxSavedParseExceptions": 0,
      "skipSequenceNumberAvailabilityCheck": false,
      "repartitionTransitionDuration": "PT120S"
  },
  "ioConfig": {
      "topic": "social_media",
      "inputFormat": {
          "type": "json"
      },
      "replicas": 1,
      "taskCount": 1,
      "taskDuration": "PT3600S",
      "consumerProperties": {
          "bootstrap.servers": "localhost:9094"
      },
      "autoScalerConfig": null,
      "pollTimeout": 100,
      "startDelay": "PT5S",
      "period": "PT30S",
      "useEarliestOffset": true,
      "completionTimeout": "PT1800S",
      "lateMessageRejectionPeriod": null,
      "earlyMessageRejectionPeriod": null,
      "lateMessageRejectionStartDateTime": null,
      "configOverrides": null,
      "idleConfig": null,
      "stream": "social_media",
      "useEarliestSequenceNumber": true
  },
  "context": null,
  "suspended": false
}

모든 supervisor 재개

모든 supervisor를 재개합니다. 참고로 이 엔드포인트는 재개할 supervisor나 일시 중지된 supervisor가 없어도 HTTP 200 Success 코드를 반환합니다.

URL

POST /druid/indexer/v1/supervisor/resumeAll

응답
  • 200 SUCCESS — 모든 supervisor를 성공적으로 재개함
샘플 요청

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/resumeAll"

HTTP

POST /druid/indexer/v1/supervisor/resumeAll HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "status": "success"
}

supervisor 리셋

이 엔드포인트를 사용하려면 supervisor가 실행 중이어야 합니다.

지정된 supervisor를 리셋합니다. 이 엔드포인트는 supervisor 메타데이터를 지우고 supervisor가 데이터 읽기를 재개하도록 합니다. supervisor는 useEarliestOffset 속성 값에 따라 가장 이른(earliest) 또는 가장 늦은(latest) 사용 가능한 위치에서 다시 시작합니다. 저장된 모든 offset을 지운 후 supervisor는 활성 태스크를 종료하고 다시 만들어, 태스크가 유효한 위치에서 읽기를 시작하게 합니다.

이 엔드포인트를 사용해 offset이 없어 멈춘 상태에서 복구하세요. 메시지가 건너뛰어 데이터 손실이나 중복 데이터가 발생할 수 있으므로 주의해서 사용하세요.

인덱싱 서비스는 태스크 간 exactly-once 수집 보장을 위해 최신 영구화된 offset을 추적합니다. Druid가 생성된 세그먼트를 수용하려면 후속 태스크가 이전 태스크가 완료된 위치부터 읽기를 시작해야 합니다. 기대되는 시작 offset의 메시지를 더 이상 사용할 수 없으면 supervisor는 시작을 거부하고 진행 중인 태스크는 실패합니다. 메시지 누락의 가능한 원인으로는 메시지 보존 기간이 지나거나 토픽이 제거 후 재생성된 경우가 있습니다. 리셋 엔드포인트로 이 조건에서 복구하세요.

URL

POST /druid/indexer/v1/supervisor/{supervisorId}/reset

응답
  • 200 SUCCESS — supervisor를 성공적으로 리셋함
  • 404 NOT FOUND — 잘못된 supervisor ID
샘플 요청

다음 예시는 이름이 social_media인 supervisor를 리셋하는 방법을 보여줍니다.

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/social_media/reset"

HTTP

POST /druid/indexer/v1/supervisor/social_media/reset HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "id": "social_media"
}

supervisor의 offset 리셋

이 엔드포인트를 사용하려면 supervisor가 실행 중이어야 합니다.

전체 집합을 리셋하지 않고 파티션의 지정된 offset을 리셋합니다.

이 엔드포인트는 저장된 offset만 지우고 supervisor가 지정된 offset에서 데이터 읽기를 재개하도록 합니다. 저장된 offset이 없으면 지정된 offset이 메타데이터 스토어에 설정됩니다.

저장된 offset을 리셋한 후 supervisor는 지정된 파티션에 속한 모든 활성 태스크를 종료하고 다시 만들어, 태스크가 지정된 offset에서 읽기를 시작하게 합니다. 이 작업에 지정되지 않은 파티션의 경우 supervisor는 마지막 저장된 offset에서 재개합니다.

주의해서 사용하세요. 메시지가 건너뛰어 데이터 손실이나 중복 데이터가 발생할 수 있습니다.

URL

POST /druid/indexer/v1/supervisor/{supervisorId}/resetOffsets

응답
  • 200 SUCCESS — offset을 성공적으로 리셋함
  • 404 NOT FOUND — 잘못된 supervisor ID
리셋 offsets 메타데이터

이 섹션은 리셋 offsets 메타데이터 페이로드의 구조와 세부 사항을 제시합니다.

필드 타입 설명 필수
type String 리셋 offsets 메타데이터 페이로드의 타입. supervisor의 타입과 일치해야 합니다. 가능한 값: kafka 또는 kinesis. 예
partitions Object 리셋 메타데이터를 나타내는 객체. 아래에서 자세히 설명합니다. 예
Partitions

다음 표는 리셋 offsets 메타데이터 페이로드의 partitions 객체 안 필드를 정의합니다.

필드 타입 설명 필수
type String end로 설정해야 합니다. 리셋 offsets의 끝 시퀀스 번호를 나타냅니다. 예
stream String 리셋할 스트림. supervisor가 소비하는 유효한 스트림이어야 합니다. 예
partitionOffsetMap Object 리셋할 스트림의 파티션을 해당 offset에 매핑한 맵. 예
샘플 요청

다음 예시는 이름이 social_media인 Kafka supervisor의 offset을 리셋하는 방법을 보여줍니다. 예를 들어 supervisor가 Kafka 토픽 ads_media_stream에서 읽고 있고 저장된 offset이 {"0": 0, "1": 10, "2": 20, "3": 40}이라고 가정합니다.

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/social_media/resetOffsets"
--header 'Content-Type: application/json'
--data-raw '{"type":"kafka","partitions":{"type":"end","stream":"ads_media_stream","partitionOffsetMap":{"0":100, "2": 650}}}'

HTTP

POST /druid/indexer/v1/supervisor/social_media/resetOffsets HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
Content-Type: application/json

{
  "type": "kafka",
  "partitions": {
    "type": "end",
    "stream": "ads_media_stream",
    "partitionOffsetMap": {
      "0": 100,
      "2": 650
    }
  }
}

예시 작업은 파티션 0과 2의 offset만 각각 100과 650으로 리셋합니다. 성공적인 리셋 후 supervisor의 태스크가 재시작하면 {"0": 100, "1": 10, "2": 650, "3": 40}에서 읽기를 재개합니다.

샘플 응답
{
  "id": "social_media"
}

supervisor 종료

supervisor와 그에 연결된 인덱싱 태스크를 종료해 세그먼트 게시를 트리거합니다. supervisor를 종료하면 Druid는 재시작 시 다시 로드되는 것을 막기 위해 메타데이터 스토어에 tombstone 마커를 배치합니다.

종료된 supervisor는 여전히 메타데이터 스토어에 존재하며 그 기록은 검색할 수 있습니다.

URL

POST /druid/indexer/v1/supervisor/{supervisorId}/terminate

응답
  • 200 SUCCESS — supervisor를 성공적으로 종료함
  • 404 NOT FOUND — 잘못된 supervisor ID이거나 supervisor가 실행 중이 아님
샘플 요청

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/social_media/terminate"

HTTP

POST /druid/indexer/v1/supervisor/social_media/terminate HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "id": "social_media"
}

모든 supervisor 종료

모든 supervisor를 종료합니다. 종료된 supervisor는 여전히 메타데이터 스토어에 존재하며 그 기록은 검색할 수 있습니다. 참고로 이 엔드포인트는 종료할 supervisor나 실행 중인 supervisor가 없어도 HTTP 200 Success 코드를 반환합니다.

URL

POST /druid/indexer/v1/supervisor/terminateAll

응답
  • 200 SUCCESS — 모든 supervisor를 성공적으로 종료함
샘플 요청

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/terminateAll"

HTTP

POST /druid/indexer/v1/supervisor/terminateAll HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
샘플 응답
{
  "status": "success"
}

supervisor의 태스크 그룹을 조기에 핸드오프

supervisor의 지정된 태스크 그룹에 대한 핸드오프를 조기에 트리거합니다. 이 API는 최선 노력(best-effort)이며 핸드오프 실행을 보장하지 않습니다.

URL

POST /druid/indexer/v1/supervisor/{supervisorId}/taskGroups/handoff

응답
  • 202 ACCEPTED — 요청이 수락되었고 백그라운드에서 핸드오프가 시작됨
  • 404 NOT FOUND — 잘못된 supervisor ID이거나 supervisor가 실행 중이 아님
  • 400 BAD REQUEST — supervisor가 조기 핸드오프를 지원하지 않음
샘플 요청

다음 예시는 이름이 social_media이고 태스크 그룹 1, 2, 3을 가진 supervisor의 태스크 그룹을 핸드오프하는 방법을 보여줍니다.

cURL

curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/social_media/taskGroups/handoff"
--header 'Content-Type: application/json'
--data-raw '{"taskGroupIds": [1, 2, 3]}'

HTTP

POST /druid/indexer/v1/supervisor/social_media/taskGroups/handoff HTTP/1.1
Host: http://ROUTER_IP:ROUTER_PORT
Content-Type: application/json

{
  "taskGroupIds": [1, 2, 3],
}
샘플 응답

202 Accepted

빈 응답

supervisor 종료

supervisor를 종료합니다. 이 엔드포인트는 비권장(deprecated)이며 향후 릴리스에서 제거될 예정입니다. 대신 동등한 terminate 엔드포인트를 사용하세요.

URL

POST /druid/indexer/v1/supervisor/{supervisorId}/shutdown

더 알아보기 (Learn more)

  • supervisor 스펙의 전체 구성은 supervisor reference 문서를 참고하세요.
  • 스트리밍 수집 supervisor 설정은 Kafka ingestion / Kinesis ingestion 문서를 확인해 보세요.