From ceb6646dec16abc69d7d80f81b94add7fe242339 Mon Sep 17 00:00:00 2001 From: Katya Macedo <38017980+ektravel@users.noreply.github.com> Date: Wed, 24 Apr 2024 15:14:01 -0500 Subject: [PATCH] Add supervisor actions (#16276) * Add supervisor actions * Update text * Update text * Update after review * Update after review --- docs/api-reference/supervisor-api.md | 13 +++-- docs/assets/supervisor-actions.png | Bin 0 -> 77894 bytes docs/ingestion/supervisor.md | 84 +++++++++++++++++++++------ 3 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 docs/assets/supervisor-actions.png diff --git a/docs/api-reference/supervisor-api.md b/docs/api-reference/supervisor-api.md index 59980f2cc126..341340faf2fb 100644 --- a/docs/api-reference/supervisor-api.md +++ b/docs/api-reference/supervisor-api.md @@ -26,6 +26,7 @@ import TabItem from '@theme/TabItem'; --> This topic describes the API endpoints to manage and monitor supervisors for Apache Druid. +The topic uses the Apache Kafka term offset to refer to the identifier for records in a partition. If you are using Amazon Kinesis, the equivalent is sequence number. In this topic, `http://ROUTER_IP:ROUTER_PORT` is a placeholder for your Router service address and port. Replace it with the information for your deployment. For example, use `http://localhost:8888` for quickstart deployments. @@ -3247,13 +3248,13 @@ Host: http://ROUTER_IP:ROUTER_PORT The supervisor must be running for this endpoint to be available. -Resets the specified supervisor. This endpoint clears all stored offsets in Kafka or sequence numbers in Kinesis, prompting the supervisor to resume data reading. The supervisor restarts from the earliest or latest available position, depending on the platform: offsets in Kafka or sequence numbers in Kinesis. -After clearing all stored offsets in Kafka or sequence numbers in Kinesis, the supervisor kills and recreates active tasks, +Resets the specified supervisor. This endpoint clears supervisor metadata, prompting the supervisor to resume data reading. The supervisor restarts from the earliest or latest available position, depending on the value of the `useEarliestOffset` property. +After clearing all stored offsets, the supervisor kills and recreates active tasks, so that tasks begin reading from valid positions. -Use this endpoint to recover from a stopped state due to missing offsets in Kafka or sequence numbers in Kinesis. Use this endpoint with caution as it may result in skipped messages and lead to data loss or duplicate data. +Use this endpoint to recover from a stopped state due to missing offsets. Use this endpoint with caution as it may result in skipped messages and lead to data loss or duplicate data. -The indexing service keeps track of the latest persisted offsets in Kafka or sequence numbers in Kinesis to provide exactly-once ingestion guarantees across tasks. Subsequent tasks must start reading from where the previous task completed for Druid to accept the generated segments. If the messages at the expected starting offsets in Kafka or sequence numbers in Kinesis are no longer available, the supervisor refuses to start and in-flight tasks fail. Possible causes for missing messages include the message retention period elapsing or the topic being removed and re-created. Use the `reset` endpoint to recover from this condition. +The indexing service keeps track of the latest persisted offsets to provide exactly-once ingestion guarantees across tasks. Subsequent tasks must start reading from where the previous task completed for Druid to accept the generated segments. If the messages at the expected starting offsets are no longer available, the supervisor refuses to start and in-flight tasks fail. Possible causes for missing messages include the message retention period elapsing or the topic being removed and re-created. Use the `reset` endpoint to recover from this condition. #### URL @@ -3322,7 +3323,7 @@ The supervisor must be running for this endpoint to be available. Resets the specified offsets for partitions without resetting the entire set. -This endpoint clears only the specified offsets in Kafka or sequence numbers in Kinesis, prompting the supervisor to resume reading data from the specified offsets. +This endpoint clears only the stored offsets, prompting the supervisor to resume reading data from the specified offsets. If there are no stored offsets, the specified offsets are set in the metadata store. After resetting stored offsets, the supervisor kills and recreates any active tasks pertaining to the specified partitions, @@ -3429,7 +3430,7 @@ when the supervisor's tasks restart, they resume reading from `{"0": 100, "1": 1 ### Terminate a supervisor -Terminates a supervisor and its associated indexing tasks, triggering the publishing of their segments. When terminated, a tombstone marker is placed in the database to prevent reloading on restart. +Terminates a supervisor and its associated indexing tasks, triggering the publishing of their segments. When you terminate a supervisor, Druid places a tombstone marker in the metadata store to prevent reloading on restart. The terminated supervisor still exists in the metadata store and its history can be retrieved. diff --git a/docs/assets/supervisor-actions.png b/docs/assets/supervisor-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..2797cf69ea7173a980ff1a2c558f589a82b3444c GIT binary patch literal 77894 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 LlPi$9`QU#6fqTPC literal 0 HcmV?d00001 diff --git a/docs/ingestion/supervisor.md b/docs/ingestion/supervisor.md index 8baf2e6149d8..76dd1cc4a7c9 100644 --- a/docs/ingestion/supervisor.md +++ b/docs/ingestion/supervisor.md @@ -26,6 +26,8 @@ sidebar_label: Supervisor A supervisor manages streaming ingestion from external streaming sources into Apache Druid. Supervisors oversee the state of indexing tasks to coordinate handoffs, manage failures, and ensure that the scalability and replication requirements are maintained. +This topic uses the Apache Kafka term offset to refer to the identifier for records in a partition. If you are using Amazon Kinesis, the equivalent is sequence number. + ## Supervisor spec Druid uses a JSON specification, often referred to as the supervisor spec, to define streaming ingestion tasks. @@ -44,7 +46,7 @@ The following table outlines the high-level configuration options for a supervis ### I/O configuration The following table outlines the `ioConfig` configuration properties that apply to both Apache Kafka and Amazon Kinesis ingestion methods. -For configuration properties specific to Apache Kafka and Amazon Kinesis, see [Kafka I/O configuration](kafka-ingestion.md#io-configuration) and [Kinesis I/O configuration](kinesis-ingestion.md#io-configuration) respectively. +For configuration properties specific to Kafka and Kinesis, see [Kafka I/O configuration](kafka-ingestion.md#io-configuration) and [Kinesis I/O configuration](kinesis-ingestion.md#io-configuration) respectively. |Property|Type|Description|Required|Default| |--------|----|-----------|--------|-------| @@ -69,7 +71,7 @@ The following table outlines the configuration properties for `autoScalerConfig` |Property|Description|Required|Default| |--------|-----------|--------|-------| |`enableTaskAutoScaler`|Enables the autoscaler. If not specified, Druid disables the autoscaler even when `autoScalerConfig` is not null.|No|`false`| -|`taskCountMax`|The maximum number of ingestion tasks. Must be greater than or equal to `taskCountMin`. If `taskCountMax` is greater than the number of Kafka partitions or Kinesis shards, Druid set the maximum number of reading tasks to the number of Kafka partitions or Kinesis shards and ignores `taskCountMax`.|Yes|| +|`taskCountMax`|The maximum number of ingestion tasks. Must be greater than or equal to `taskCountMin`. If `taskCountMax` is greater than the number of Kafka partitions or Kinesis shards, Druid sets the maximum number of reading tasks to the number of Kafka partitions or Kinesis shards and ignores `taskCountMax`.|Yes|| |`taskCountMin`|The minimum number of ingestion tasks. When you enable the autoscaler, Druid ignores the value of `taskCount` in `ioConfig` and starts with the `taskCountMin` number of tasks to launch.|Yes|| |`minTriggerScaleActionFrequencyMillis`|The minimum time interval between two scale actions.| No|600000| |`autoScalerStrategy`|The algorithm of autoscaler. Druid only supports the `lagBased` strategy. See [Autoscaler strategy](#autoscaler-strategy) for more information.|No|`lagBased`| @@ -77,7 +79,7 @@ The following table outlines the configuration properties for `autoScalerConfig` ##### Autoscaler strategy :::info -Unlike the Kafka indexing service, Kinesis reports lag metrics measured in time difference in milliseconds between the current sequence number and latest sequence number, rather than message count. +Unlike the Kafka indexing service, Kinesis reports lag metrics as the time difference in milliseconds between the current sequence number and the latest sequence number, rather than message count. ::: The following table outlines the configuration properties related to the `lagBased` autoscaler strategy: @@ -182,14 +184,14 @@ The following example shows a supervisor spec with `lagBased` autoscaler: The `tuningConfig` object is optional. If you don't specify the `tuningConfig` object, Druid uses the default configuration settings. -The following table outlines the `tuningConfig` configuration properties that apply to both Apache Kafka and Amazon Kinesis ingestion methods. -For configuration properties specific to Apache Kafka and Amazon Kinesis, see [Kafka tuning configuration](kafka-ingestion.md#tuning-configuration) and [Kinesis tuning configuration](kinesis-ingestion.md#tuning-configuration) respectively. +The following table outlines the `tuningConfig` configuration properties that apply to both Kafka and Kinesis ingestion methods. +For configuration properties specific to Kafka and Kinesis, see [Kafka tuning configuration](kafka-ingestion.md#tuning-configuration) and [Kinesis tuning configuration](kinesis-ingestion.md#tuning-configuration) respectively. |Property|Type|Description|Required|Default| |--------|----|-----------|--------|-------| |`type`|String|The tuning type code for the ingestion method. One of `kafka` or `kinesis`.|Yes|| |`maxRowsInMemory`|Integer|The number of rows to accumulate before persisting. This number represents the post-aggregation rows. It is not equivalent to the number of input events, but the resulting number of aggregated rows. Druid uses `maxRowsInMemory` to manage the required JVM heap size. The maximum heap memory usage for indexing scales is `maxRowsInMemory * (2 + maxPendingPersists)`. Normally, you don't need to set this, but depending on the nature of data, if rows are short in terms of bytes, you may not want to store a million rows in memory and this value should be set.|No|150000| -|`maxBytesInMemory`|Long|The number of bytes to accumulate in heap memory before persisting. This is based on a rough estimate of memory usage and not actual usage. Normally, this is computed internally. The maximum heap memory usage for indexing is `maxBytesInMemory * (2 + maxPendingPersists)`.|No|One-sixth of max JVM memory| +|`maxBytesInMemory`|Long|The number of bytes to accumulate in heap memory before persisting. The value is based on a rough estimate of memory usage and not actual usage. Normally, Druid computes the value internally. The maximum heap memory usage for indexing is `maxBytesInMemory * (2 + maxPendingPersists)`.|No|One-sixth of max JVM memory| |`skipBytesInMemoryOverheadCheck`|Boolean|The calculation of `maxBytesInMemory` takes into account overhead objects created during ingestion and each intermediate persist. To exclude the bytes of these overhead objects from the `maxBytesInMemory` check, set `skipBytesInMemoryOverheadCheck` to `true`.|No|`false`| |`maxRowsPerSegment`|Integer|The number of rows to store in a segment. This number is post-aggregation rows. Handoff occurs when `maxRowsPerSegment` or `maxTotalRows` is reached or every `intermediateHandoffPeriod`, whichever happens first.|No|5000000| |`maxTotalRows`|Long|The number of rows to aggregate across all segments; this number is post-aggregation rows. Handoff happens either if `maxRowsPerSegment` or `maxTotalRows` is reached or every `intermediateHandoffPeriod`, whichever happens earlier.|No|20000000| @@ -200,7 +202,7 @@ For configuration properties specific to Apache Kafka and Amazon Kinesis, see [K |`indexSpecForIntermediatePersists`|Object|Defines segment storage format options to use at indexing time for intermediate persisted temporary segments. You can use `indexSpecForIntermediatePersists` to disable dimension/metric compression on intermediate segments to reduce memory required for final merging. However, disabling compression on intermediate segments might increase page cache use while they are used before getting merged into final segment published.|No|| |`reportParseExceptions`|Boolean|DEPRECATED. If `true`, Druid throws exceptions encountered during parsing causing ingestion to halt. If `false`, Druid skips unparseable rows and fields. Setting `reportParseExceptions` to `true` overrides existing configurations for `maxParseExceptions` and `maxSavedParseExceptions`, setting `maxParseExceptions` to 0 and limiting `maxSavedParseExceptions` to not more than 1.|No|`false`| |`handoffConditionTimeout`|Long|Number of milliseconds to wait for segment handoff. Set to a value >= 0, where 0 means to wait indefinitely.|No|900000 (15 minutes) for Kafka. 0 for Kinesis.| -|`resetOffsetAutomatically`|Boolean|Resets partitions when the sequence number is unavailable. If set to `true`, Druid resets partitions to the earliest or latest Kafka sequence number or Kinesis offset, based on the value of `useEarliestSequenceNumber` or `useEarliestOffset` (earliest if `true`, latest if `false`). If set to `false`, the exception bubbles up causing tasks to fail and ingestion to halt. If this occurs, manual intervention is required to correct the situation, potentially through [resetting the supervisor](../api-reference/supervisor-api.md#reset-a-supervisor).|No|`false`| +|`resetOffsetAutomatically`|Boolean|Resets partitions when the sequence number is unavailable. If set to `true`, Druid resets partitions to the earliest or latest offset, based on the value of `useEarliestSequenceNumber` or `useEarliestOffset` (earliest if `true`, latest if `false`). If set to `false`, Druid surfaces the exception causing tasks to fail and ingestion to halt. If this occurs, manual intervention is required to correct the situation, potentially through [resetting the supervisor](../api-reference/supervisor-api.md#reset-a-supervisor).|No|`false`| |`workerThreads`|Integer|The number of threads that the supervisor uses to handle requests/responses for worker tasks, along with any other internal asynchronous operation.|No|`min(10, taskCount)`| |`chatRetries`|Integer|The number of times Druid retries HTTP requests to indexing tasks before considering tasks unresponsive.|No|8| |`httpTimeout`|ISO 8601 period|The period of time to wait for a HTTP response from an indexing task.|No|`PT10S`| @@ -208,15 +210,15 @@ For configuration properties specific to Apache Kafka and Amazon Kinesis, see [K |`offsetFetchPeriod`|ISO 8601 period|Determines how often the supervisor queries the streaming source and the indexing tasks to fetch current offsets and calculate lag. If the user-specified value is below the minimum value of `PT5S`, the supervisor ignores the value and uses the minimum value instead.|No|`PT30S`| |`segmentWriteOutMediumFactory`|Object|The segment write-out medium to use when creating segments. See [Additional Peon configuration: SegmentWriteOutMediumFactory](../configuration/index.md#segmentwriteoutmediumfactory) for explanation and available options.|No|If not specified, Druid uses the value from `druid.peon.defaultSegmentWriteOutMediumFactory.type`.| |`logParseExceptions`|Boolean|If `true`, Druid logs an error message when a parsing exception occurs, containing information about the row where the error occurred.|No|`false`| -|`maxParseExceptions`|Integer|The maximum number of parse exceptions that can occur before the task halts ingestion and fails. Overridden if `reportParseExceptions` is set.|No|unlimited| -|`maxSavedParseExceptions`|Integer|When a parse exception occurs, Druid keeps track of the most recent parse exceptions. `maxSavedParseExceptions` limits the number of saved exception instances. These saved exceptions are available after the task finishes in the [task completion report](../ingestion/tasks.md#task-reports). Overridden if `reportParseExceptions` is set.|No|0| +|`maxParseExceptions`|Integer|The maximum number of parse exceptions that can occur before the task halts ingestion and fails. Setting `reportParseExceptions` overrides this limit.|No|unlimited| +|`maxSavedParseExceptions`|Integer|When a parse exception occurs, Druid keeps track of the most recent parse exceptions. `maxSavedParseExceptions` limits the number of saved exception instances. These saved exceptions are available after the task finishes in the [task completion report](../ingestion/tasks.md#task-reports). Setting `reportParseExceptions` overrides this limit.|No|0| ## Start a supervisor Druid starts a new supervisor when you submit a supervisor spec. -You can submit the supervisor spec using the Druid console [data loader](../operations/web-console.md#data-loader) or by calling the [Supervisor API](../api-reference/supervisor-api.md). +You can submit the supervisor spec in the Druid web console [data loader](../operations/web-console.md#data-loader) or with the [Supervisor API](../api-reference/supervisor-api.md). -The following screenshot shows the [Supervisors](../operations/web-console.md#supervisors) view of the Druid web console for a cluster with two supervisors: +The following screenshot shows the [Supervisors](../operations/web-console.md#supervisors) view of the web console for a cluster with two supervisors: ![Supervisors view](../assets/supervisor-view.png) @@ -226,7 +228,7 @@ When an Overlord gains leadership, either by being started or as a result of ano ### Schema and configuration changes -Schema and configuration changes are handled by submitting the new supervisor spec. The Overlord initiates a graceful shutdown of the existing supervisor. The running supervisor signals its tasks to stop reading and begin publishing, exiting itself. Druid then uses the provided configuration to create a new supervisor. Druid submits a new schema while retaining existing publishing tasks and starts new tasks at the previous task offsets. +To make schema or configuration changes, you must submit a new supervisor spec. The Overlord initiates a graceful shutdown of the existing supervisor. The running supervisor signals its tasks to stop reading and begin publishing, exiting itself. Druid then uses the new configuration to create a new supervisor. Druid submits the updated schema while retaining existing publishing tasks. It also starts new tasks at the previous task offsets. This way, configuration changes can be applied without requiring any pause in ingestion. ## Status report @@ -309,23 +311,23 @@ The following table lists `detailedState` values and their corresponding `state` On each iteration of the supervisor's run loop, the supervisor completes the following tasks in sequence: -1. Fetch the list of units of parallelism, such as Kinesis shards or Kafka partitions, and determine the starting sequence number or offset for each unit (either based on the last processed sequence number or offset if continuing, or starting from the beginning or ending of the stream if this is a new stream). +1. Retrieve the list of partitions and determine the starting offset for each partition. If continuing, Druid uses the last processed offset. For new streams, Druid starts from either the beginning or end of the stream, depending on the `useEarliestOffset` property. 2. Discover any running indexing tasks that are writing to the supervisor's datasource and adopt them if they match the supervisor's configuration, else signal them to stop. 3. Send a status request to each supervised task to update the view of the state of the tasks under supervision. -4. Handle tasks that have exceeded `taskDuration` and should transition from the reading to publishing state. +4. Handle tasks that have exceeded `taskDuration` and should transition from reading to publishing. 5. Handle tasks that have finished publishing and signal redundant replica tasks to stop. 6. Handle tasks that have failed and clean up the supervisor's internal state. 7. Compare the list of healthy tasks to the requested `taskCount` and `replicas` configurations and create additional tasks if required. The `detailedState` property shows additional values (marked with "first iteration only" in the preceding table) the first time the supervisor executes this run loop after startup or after resuming from a suspension. This is intended to surface -initialization-type issues, where the supervisor is unable to reach a stable state. For example, if the supervisor cannot connect to -the stream, if it's unable to read from the stream, or cannot communicate with existing tasks. Once the supervisor is stable; +initialization-type issues, where the supervisor is unable to reach a stable state. For example, if the supervisor can't connect to +the stream, if it's unable to read from the stream, or if it can't communicate with existing tasks. Once the supervisor is stable; that is, once it has completed a full execution without encountering any issues, `detailedState` will show a `RUNNING` state until it is stopped, suspended, or hits a failure threshold and transitions to an unhealthy state. :::info -For the Kafka indexing service, the consumer lag per partition may be reported as negative values if the supervisor hasn't received the latest offset response from Kafka. The aggregate lag value will always be >= 0. +For the Kafka indexing service, Druid may report the consumer lag per partition as a negative value if the supervisor hasn't received the latest offset response from Kafka. The aggregate lag value is always >= 0. ::: ## SUPERVISORS system table @@ -339,6 +341,54 @@ SELECT * FROM sys.supervisors WHERE healthy=0; For more information on the supervisors system table, see [SUPERVISORS table](../querying/sql-metadata-tables.md#supervisors-table). +## Manage a supervisor + +You can manage a supervisor from the web console or with the [Supervisor API](../api-reference/supervisor-api.md). +In the web console, navigate to the **Supervisors** view and click the ellipsis in the **Actions** column. Select the desired action from the menu that appears. + +![Actions menu](../assets/supervisor-actions.png) + +The supervisor must be running for some of these actions to be available. + +### Suspend + +**Suspend** pauses a running supervisor. +The suspended supervisor continues to emit logs and metrics. +Indexing tasks remain suspended until you resume the supervisor. +For information on how to suspend a supervisor by API, see [Supervisors: Suspend a running supervisor](../api-reference/supervisor-api.md#suspend-a-running-supervisor). + +### Set offsets + +:::info +Perform this action with caution as it may result in skipped messages and lead to data loss or duplicate data. +::: + +**Set offsets** resets the offsets for supervisor partitions. +This action clears the stored offsets and instructs the supervisor to resume reading data from the specified offsets. If there are no stored offsets, Druid saves the specified offsets in the metadata store. +**Set offsets** terminates and recreates active tasks for the specified partitions to begin reading from the reset offsets. +For partitions not specified in this operation, the supervisor resumes from the last stored offset. + +For information on how to reset offsets by API, see [Supervisors: Reset offsets for a supervisor](../api-reference/supervisor-api.md#reset-offsets-for-a-supervisor). + +### Hard reset + +:::info +Perform this action with caution as it may result in skipped messages and lead to data loss or duplicate data. +::: + +**Hard reset** clears supervisor metadata, causing the supervisor to resume data reading from either the earliest or latest available position, depending on the `useEarliestOffset` setting. **Hard reset** terminates and recreates active tasks, so that tasks begin reading from valid positions. + +Use this action to recover from a stopped state due to missing offsets. + +For information on how to reset a supervisor by API, see [Supervisors: Reset a supervisor](../api-reference/supervisor-api.md#reset-a-supervisor). + +### Terminate + +**Terminate** stops a supervisor and its indexing tasks, triggering the publishing of their segments. When you terminate a supervisor, Druid places a tombstone marker in the metadata store to prevent reloading on restart. +The terminated supervisor still exists in the metadata store and its history can be retrieved. + +For information on how to terminate a supervisor by API, see [Supervisors: Terminate a supervisor](../api-reference/supervisor-api.md#terminate-a-supervisor). + ## Capacity planning Indexing tasks run on MiddleManagers and are limited by the resources available in the MiddleManager cluster. In particular, you should make sure that you have sufficient worker capacity, configured using the