From 7b11b404a35f93e4b4b12546034ef8001720eb5f Mon Sep 17 00:00:00 2001 From: Yiqun Lin Date: Wed, 13 Feb 2019 11:16:04 +0800 Subject: [PATCH] HADOOP-16097. Provide proper documentation for FairCallQueue. Contributed by Erik Krogen. --- .../src/site/markdown/FairCallQueue.md | 150 ++++++++++++++++++ .../images/faircallqueue-overview.png | Bin 0 -> 47397 bytes hadoop-project/src/site/site.xml | 1 + 3 files changed, 151 insertions(+) create mode 100644 hadoop-common-project/hadoop-common/src/site/markdown/FairCallQueue.md create mode 100644 hadoop-common-project/hadoop-common/src/site/resources/images/faircallqueue-overview.png diff --git a/hadoop-common-project/hadoop-common/src/site/markdown/FairCallQueue.md b/hadoop-common-project/hadoop-common/src/site/markdown/FairCallQueue.md new file mode 100644 index 0000000000..e62c7ad42e --- /dev/null +++ b/hadoop-common-project/hadoop-common/src/site/markdown/FairCallQueue.md @@ -0,0 +1,150 @@ + + +Fair Call Queue Guide +================================= + + + +Purpose +------- + +This document describes how to configure and manage the Fair Call Queue for Hadoop. + +Prerequisites +------------- + +Make sure Hadoop is installed, configured and setup correctly. For more information see: + +* [Single Node Setup](./SingleCluster.html) for first-time users. +* [Cluster Setup](./ClusterSetup.html) for large, distributed clusters. + +Overview +-------- + +Hadoop server components, in particular the HDFS NameNode, experience very heavy RPC load from clients. By default, +all client requests are routed through a first-in, first-out queue and serviced in the order they arrive. This means +that a single user submitting a very large number of requests can easily overwhelm the service, causing degraded service +for all other users. The Fair Call Queue, and related components, aim to mitigate this impact. + +Design Details +-------------- + +There are a few components in the IPC stack which have a complex interplay, each with their own tuning parameters. +The image below presents a schematic overview of their interactions, which will be explained below. + +![FairCallQueue Overview](./images/faircallqueue-overview.png) + +In the following explanation, **bolded** words refer to named entities or configurables. + +When a client makes a request to an IPC server, this request first lands in a **listen queue**. **Reader** threads +remove requests from this queue and pass them to a configurable **RpcScheduler** to be assigned a priority and placed +into a **call queue**; this is where FairCallQueue sits as a pluggable implementation (the other existing +implementation being a FIFO queue). **Handler** threads accept requests out of the call queue, process them, and +respond to the client. + +The implementation of RpcScheduler used with FairCallQueue by default is **DecayRpcScheduler**, which maintains a +count of requests received for each user. This count _decays_ over time; every **sweep period** (5s by default), +the number of requests per user is multiplied by a **decay factor** (0.5 by default). This maintains a weighted/rolling +average of request count per user. Every time that a sweep is performed, the call counts for all known users are +ranked from highest to lowest. Each user is assigned a **priority** (0-3 by default, with 0 being highest priority) +based on the proportion of calls originating from that user. The default **priority thresholds** are (0.125, 0.25, 0.5), +meaning that users whose calls make up more than 50% of the total (there can be at most one such user) are placed into +the lowest priority, users whose calls make up between 25% and 50% of the total are in the 2nd lowest, users whose calls +make up between 12.5% and 25% are in the 2nd highest priority, and all other users are placed in the highest priority. +At the end of the sweep, each known user has a cached priority which will be used until the next sweep; new users which +appear between sweeps will have their priority calculated on-the-fly. + +Within FairCallQueue, there are multiple **priority queues**, each of which is designated a **weight**. When a request +arrives at the call queue, the request is placed into one of these priority queues based on the current priority +assigned to the call (by the RpcScheduler). When a handler thread attempts to fetch an item from the call queue, which +queue it pulls from is decided via an **RpcMultiplexer**; currently this is hard-coded to be a +**WeightedRoundRobinMultiplexer**. The WRRM serves requests from queues based on their weights; the default weights +for the default 4 priority levels are (8, 4, 2, 1). Thus, the WRRM would serve 8 requests from the highest priority +queue, 4 from the second highest, 2 from the third highest, 1 from the lowest, then serve 8 more from the highest +priority queue, and so on. + +In addition to the priority-weighting mechanisms discussed above, there is also a configurable **backoff** mechanism, +in which the server will throw an exception to the client rather than handling it; the client is expected to wait some +time (i.e., via exponential backoff) before trying again. Typically, backoff is triggered when a request is attempted +to be placed in a priority queue (of FCQ) when that queue is full. This helps to push back further on impactful +clients, reducing load, and can have substantial benefit. There is also a feature, **backoff by response time**, which +will cause requests in lower priority levels to back off if requests in higher priority levels are being serviced +too slowly. For example, if the response time threshold for priority 1 is set to be 10 seconds, but the average +response time in that queue is 12 seconds, an incoming request at priority levels 2 or lower would receive a backoff +exception, while requests at priority levels 0 and 1 would proceed as normal. The intent is to force heavier clients to +back off when overall system load is heavy enough to cause high priority clients to be impacted. + +The discussion above refers to the **user** of a request when discussing how to group together requests for throttling. +This is configurable via the **identity provider**, which defaults to the **UserIdentityProvider**. The user identity +provider simply uses the username of the client submitting the request. However, a custom identity provider can be used +to performing throttling based on other groupings, or using an external identity provider. + +Configuration +------------- + +This section describes how to configure the fair call queue. + +### Configuration Prefixes + +All call queue-related configurations are relevant to only a single IPC server. This allows for a single configuration +file to be used to configure different components, or even different IPC servers within a component, to have uniquely +configured call queues. Each configuration is prefixed with `ipc.`, where `` is the port +used by the IPC server to be configured. For example, `ipc.8020.callqueue.impl` will adjust the call queue +implementation for the IPC server running at port 8020. For the remainder of this section, this prefix will be +omitted. + +### Full List of Configurations + +| Configuration Key | Applicable Component | Description | Default | +|:---- |:---- |:---- |:--- | +| backoff.enable | General | Whether or not to enable client backoff when a queue is full. | false | +| callqueue.impl | General | The fully qualified name of a class to use as the implementation of a call queue. Use `org.apache.hadoop.ipc.FairCallQueue` for the Fair Call Queue. | `java.util.concurrent.LinkedBlockingQueue` (FIFO queue) | +| scheduler.impl | General | The fully qualified name of a class to use as the implementation of the scheduler. Use `org.apache.hadoop.ipc.DecayRpcScheduler` in conjunction with the Fair Call Queue. | `org.apache.hadoop.ipc.DefaultRpcScheduler` (no-op scheduler)
If using FairCallQueue, defaults to `org.apache.hadoop.ipc.DecayRpcScheduler` | +| scheduler.priority.levels | RpcScheduler, CallQueue | How many priority levels to use within the scheduler and call queue. | 4 | +| faircallqueue.multiplexer.weights | WeightedRoundRobinMultiplexer | How much weight to give to each priority queue. This should be a comma-separated list of length equal to the number of priority levels. | Weights descend by a factor of 2 (e.g., for 4 levels: `8,4,2,1`) | +| identity-provider.impl | DecayRpcScheduler | The identity provider mapping user requests to their identity. | org.apache.hadoop.ipc.UserIdentityProvider | +| decay-scheduler.period-ms | DecayRpcScheduler | How frequently the decay factor should be applied to the operation counts of users. Higher values have less overhead, but respond less quickly to changes in client behavior. | 5000 | +| decay-scheduler.decay-factor | DecayRpcScheduler | When decaying the operation counts of users, the multiplicative decay factor to apply. Higher values will weight older operations more strongly, essentially giving the scheduler a longer memory, and penalizing heavy clients for a longer period of time. | 0.5 | +| decay-scheduler.thresholds | DecayRpcScheduler | The client load threshold, as an integer percentage, for each priority queue. Clients producing less load, as a percent of total operations, than specified at position _i_ will be given priority _i_. This should be a comma-separated list of length equal to the number of priority levels minus 1 (the last is implicitly 100). | Thresholds ascend by a factor of 2 (e.g., for 4 levels: `13,25,50`) | +| decay-scheduler.backoff.responsetime.enable | DecayRpcScheduler | Whether or not to enable the backoff by response time feature. | false | +| decay-scheduler.backoff.responsetime.thresholds | DecayRpcScheduler | The response time thresholds, as time durations, for each priority queue. If the average response time for a queue is above this threshold, backoff will occur in lower priority queues. This should be a comma-separated list of length equal to the number of priority levels. | Threshold increases by 10s per level (e.g., for 4 levels: `10s,20s,30s,40s`) | +| decay-scheduler.metrics.top.user.count | DecayRpcScheduler | The number of top (i.e., heaviest) users to emit metric information about. | 10 | + +### Example Configuration + +This is an example of configuration an IPC server at port 8020 to use `FairCallQueue` with the `DecayRpcScheduler` +and only 2 priority levels. The heaviest 10% of users are penalized heavily, given only 1% of the total requests +processed. + + + ipc.8020.callqueue.impl + org.apache.hadoop.ipc.FairCallQueue + + + ipc.8020.scheduler.impl + org.apache.hadoop.ipc.DecayRpcScheduler + + + ipc.8020.scheduler.priority.levels + 2 + + + ipc.8020.faircallqueue.multiplexer.weights + 99,1 + + + ipc.8020.decay-scheduler.thresholds + 90 + diff --git a/hadoop-common-project/hadoop-common/src/site/resources/images/faircallqueue-overview.png b/hadoop-common-project/hadoop-common/src/site/resources/images/faircallqueue-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb04e01027239680031541bcd3f3cfb66e56a93 GIT binary patch literal 47397 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 literal 0 HcmV?d00001 diff --git a/hadoop-project/src/site/site.xml b/hadoop-project/src/site/site.xml index 1584ff697e..9328b7e54b 100644 --- a/hadoop-project/src/site/site.xml +++ b/hadoop-project/src/site/site.xml @@ -62,6 +62,7 @@ +