text:
title: "Configuration"
nav-id: "config"
nav-parent_id: setup
nav-pos: 1
---
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

**For single-node setups Flink is ready to go out of the box and you don't need to change the default configuration to get started.**

The out of the box configuration will use your default Java installation. You can manually set the environment variable `JAVA_HOME` or the configuration key `env.java.home` in `conf/flink-conf.yaml` if you want to manually override the Java runtime to use.

This page lists the most common options that are typically needed to set up a well performing (distributed) installation. In addition a full list of all available configuration parameters is listed here.

All configuration is done in `conf/flink-conf.yaml`, which is expected to be a flat collection of [YAML key value pairs](http://www.yaml.org/spec/1.2/spec.html) with format `key: value`.

The system and run scripts parse the config at startup time. Changes to the configuration file require restarting the Flink JobManager and TaskManagers.

The configuration files for the TaskManagers can be different, Flink does not assume uniform machines in the cluster.

* This will be replaced by the TOC
{:toc}

## Common Options

- `env.java.home`: The path to the Java installation to use (DEFAULT: system's default Java installation, if found). Needs to be specified if the startup scripts fail to automatically resolve the java home directory. Can be specified to point to a specific java installation or version. If this option is not specified, the startup scripts also evaluate the `$JAVA_HOME` environment variable.

- `env.java.opts`: Set custom JVM options. This value is respected by Flink's start scripts, both JobManager and
TaskManager, and Flink's YARN client. This can be used to set different garbage collectors or to include remote
debuggers into the JVMs running Flink's services. Enclosing options in double quotes delays parameter substitution
allowing access to variables from Flink's startup scripts. Use `env.java.opts.jobmanager` and `env.java.opts.taskmanager`
for JobManager or TaskManager-specific options, respectively.

- `env.java.opts.jobmanager`: JobManager-specific JVM options. These are used in addition to the regular `env.java.opts`.

- `env.java.opts.taskmanager`: TaskManager-specific JVM options. These are used in addition to the regular `env.java.opts`.

- `jobmanager.rpc.address`: The external address of the JobManager, which is the master/coordinator of the distributed system (DEFAULT: localhost). **Note:** The address (host name or IP) should be accessible by all nodes including the client.

- `jobmanager.rpc.port`: The port number of the JobManager (DEFAULT: 6123).

- `jobmanager.heap.mb`: JVM heap size (in megabytes) for the JobManager. You may have to increase the heap size for the JobManager if you are running very large applications (with many operators), or if you are keeping a long history of them.

- `taskmanager.heap.mb`: JVM heap size (in megabytes) for the TaskManagers, which are the parallel workers of the system. In contrast to Hadoop, Flink runs operators (e.g., join, aggregate) and user-defined functions (e.g., Map, Reduce, CoGroup) inside the TaskManager (including sorting/hashing/caching), so this value should be as large as possible. If the cluster is exclusively running Flink, the total amount of available memory per machine minus some memory for the operating system (maybe 1-2 GB) is a good value. On YARN setups, this value is automatically configured to the size of the TaskManager's YARN container, minus a certain tolerance value.

- `taskmanager.numberOfTaskSlots`: The number of parallel operator or user function instances that a single TaskManager can run (DEFAULT: 1). If this value is larger than 1, a single TaskManager takes multiple instances of a function or operator. That way, the TaskManager can utilize multiple CPU cores, but at the same time, the available memory is divided between the different operator or function instances. This value is typically proportional to the number of physical CPU cores that the TaskManager's machine has (e.g., equal to the number of cores, or half the number of cores). [More about task slots](config.html#configuring-taskmanager-processing-slots).

- `parallelism.default`: The default parallelism to use for programs that have no parallelism specified. (DEFAULT: 1). For setups that have no concurrent jobs running, setting this value to NumTaskManagers * NumSlotsPerTaskManager will cause the system to use all available execution resources for the program's execution. **Note**: The default parallelism can be overwriten for an entire job by calling `setParallelism(int parallelism)` on the `ExecutionEnvironment` or by passing `-p <parallelism>` to the Flink Command-line frontend. It can be overwritten for single transformations by calling `setParallelism(int
parallelism)` on an operator. See [Parallel Execution]({{site.baseurl}}/dev/parallel.html) for more information about parallelism.

- `fs.default-scheme`: The default filesystem scheme to be used, with the necessary authority to contact, e.g. the host:port of the NameNode in the case of HDFS (if needed).
By default, this is set to `file:///` which points to the local filesystem. This means that the local
filesystem is going to be used to search for user-specified files **without** an explicit scheme
definition. As another example, if this is set to `hdfs://localhost:9000/`, then a user-specified file path
without explicit scheme definition, such as `/user/USERNAME/in.txt`, is going to be transformed into
`hdfs://localhost:9000/user/USERNAME/in.txt`. This scheme is used **ONLY** if no other scheme is specified (explicitly) in the user-provided `URI`.

- `fs.hdfs.hadoopconf`: The absolute path to the Hadoop File System's (HDFS) configuration **directory** (OPTIONAL VALUE). Specifying this value allows programs to reference HDFS files using short URIs (`hdfs:///path/to/files`, without including the address and port of the NameNode in the file URI). Without this option, HDFS files can be accessed, but require fully qualified URIs like `hdfs://address:port/path/to/files`. This option also causes file writers to pick up the HDFS's default values for block sizes and replication factors. Flink will look for the "core-site.xml" and "hdfs-site.xml" files in the specified directory.

## Advanced Options

### Compute

- `taskmanager.compute.numa`: When enabled a TaskManager is started on each NUMA node for each worker listed in *conf/slaves* (DEFAULT: false). Note: only supported when deploying Flink as a standalone cluster.

### Managed Memory

By default, Flink allocates a fraction of `0.7` of the total memory configured via `taskmanager.heap.mb` for its managed memory. Managed memory helps Flink to run the batch operators efficiently. It prevents `OutOfMemoryException`s because Flink knows how much memory it can use to execute operations. If Flink runs out of managed memory, it utilizes disk space. Using managed memory, some operations can be performed directly on the raw data without having to deserialize the data to convert it into Java objects. All in all, managed memory improves the robustness and speed of the system.

The default fraction for managed memory can be adjusted using the `taskmanager.memory.fraction` parameter. An absolute value may be set using `taskmanager.memory.size` (overrides the fraction parameter). If desired, the managed memory may be allocated outside the JVM heap. This may improve performance in setups with large memory sizes.

- `taskmanager.memory.size`: The amount of memory (in megabytes) that the task manager reserves on-heap or off-heap (depending on `taskmanager.memory.off-heap`) for sorting, hash tables, and caching of intermediate results. If unspecified (-1), the memory manager will take a fixed ratio with respect to the size of the task manager JVM as specified by `taskmanager.memory.fraction`. (DEFAULT: -1)

- `taskmanager.memory.fraction`: The relative amount of memory (with respect to `taskmanager.heap.mb`) that the task manager reserves for sorting, hash tables, and caching of intermediate results. For example, a value of `0.8` means that a task manager reserves 80% of its memory (on-heap or off-heap depending on `taskmanager.memory.off-heap`) for internal data buffers, leaving 20% of free memory for the task manager's heap for objects created by user-defined functions. (DEFAULT: 0.7) This parameter is only evaluated, if `taskmanager.memory.size` is not set.

- `taskmanager.memory.off-heap`: If set to `true`, the task manager allocates memory which is used for sorting, hash tables, and caching of intermediate results outside of the JVM heap. For setups with larger quantities of memory, this can improve the efficiency of the operations performed on the memory (DEFAULT: false).

- `taskmanager.memory.segment-size`: The size of memory buffers used by the memory manager and the network stack in bytes (DEFAULT: 32768 (= 32 KiBytes)).

- `taskmanager.memory.preallocate`: Can be either of `true` or `false`. Specifies whether task managers should allocate all managed memory when starting up. (DEFAULT: false). When `taskmanager.memory.off-heap` is set to `true`, then it is advised that this configuration is also set to `true`.  If this configuration is set to `false` cleaning up of the allocated offheap memory happens only when the configured JVM parameter MaxDirectMemorySize is reached by triggering a full GC. **Note:** For streaming setups, we highly recommend to set this value to `false` as the core state backends currently do not use the managed memory.

### Memory and Performance Debugging

These options are useful for debugging a Flink application for memory and garbage collection related issues, such as performance and out-of-memory process kills or exceptions.

- `taskmanager.debug.memory.startLogThread`: Causes the TaskManagers to periodically log memory and Garbage collection statistics. The statistics include current heap-, off-heap, and other memory pool utilization, as well as the time spent on garbage collection, by heap memory pool.

- `taskmanager.debug.memory.logIntervalMs`: The interval (in milliseconds) in which the TaskManagers log the memory and garbage collection statistics. Only has an effect, if `taskmanager.debug.memory.startLogThread` is set to true.

### Kerberos-based Security

Flink supports Kerberos authentication for the following services:

+ Hadoop Components, such as HDFS, YARN, or HBase *(version 2.6.1 and above; all other versions have critical bugs which might fail the Flink job unexpectedly)*.
+ Kafka Connectors *(version 0.9+ and above)*.
+ Zookeeper

Configuring Flink for Kerberos security involves three aspects, explained separately in the following sub-sections.

##### 1. Providing the cluster with a Kerberos credential (i.e. a keytab or a ticket via `kinit`)

To provide the cluster with a Kerberos credential, Flink supports using a Kerberos keytab file or ticket caches managed by `kinit`.

- `security.kerberos.login.use-ticket-cache`: Indicates whether to read from your Kerberos ticket cache (default: `true`).

- `security.kerberos.login.keytab`: Absolute path to a Kerberos keytab file that contains the user credentials.

- `security.kerberos.login.principal`: Kerberos principal name associated with the keytab.

If both `security.kerberos.login.keytab` and `security.kerberos.login.principal` have values provided, keytabs will be used for authentication.
It is preferable to use keytabs for long-running jobs, to avoid ticket expiration issues.   If you prefer to use the ticket cache,
talk to your administrator about increasing the Hadoop delegation token lifetime.

Note that authentication using ticket caches is only supported when deploying Flink as a standalone cluster or on YARN.

##### 2. Making the Kerberos credential available to components and connectors as needed

For Hadoop components, Flink will automatically detect if the configured Kerberos credentials should be used when connecting to HDFS, HBase, and other Hadoop components depending on whether Hadoop security is enabled (in `core-site.xml`).

For any connector or component that uses a JAAS configuration file, make the Kerberos credentials available to them by configuring JAAS login contexts for each one respectively, using the following configuration:

- `security.kerberos.login.contexts`: A comma-separated list of login contexts to provide the Kerberos credentials to (for example, `Client,KafkaClient` to use the credentials for ZooKeeper authentication and for Kafka authentication).

This allows enabling Kerberos authentication for different connectors or components independently. For example, you can enable Hadoop security without necessitating the use of Kerberos for ZooKeeper, or vice versa.

You may also provide a static JAAS configuration file using the mechanisms described in the [Java SE Documentation](http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/tutorials/LoginConfigFile.html), whose entries will override those produced by the above configuration option.

##### 3. Configuring the component and/or connector to use Kerberos authentication

Finally, be sure to configure the connector within your Flink program or component as necessary to use Kerberos authentication.

Below is a list of currently first-class supported connectors or components by Flink for Kerberos authentication:

- Kafka: see [here]({{site.baseurl}}/dev/connectors/kafka.html#enabling-kerberos-authentication-for-versions-above-09-only) for details on configuring the Kafka connector to use Kerberos authentication.

- Zookeeper (for HA): see [here]({{site.baseurl}}/setup/jobmanager_high_availability.html#configuring-for-zookeeper-security) for details on Zookeeper security configuration to work with the Kerberos-based security configurations mentioned here.

For more information on how Flink security internally setups Kerberos authentication, please see [here]({{site.baseurl}}/ops/security-kerberos.html).

### Other

- `taskmanager.tmp.dirs`: The directory for temporary files, or a list of directories separated by the system's directory delimiter (for example ':' (colon) on Linux/Unix). If multiple directories are specified, then the temporary files will be distributed across the directories in a round-robin fashion. The I/O manager component will spawn one reading and one writing thread per directory. A directory may be listed multiple times to have the I/O manager use multiple threads for it (for example if it is physically stored on a very fast disc or RAID) (DEFAULT: The system's tmp dir).

- `taskmanager.log.path`: The config parameter defining the taskmanager log file location

- `jobmanager.web.address`: Address of the JobManager's web interface (DEFAULT: anyLocalAddress()).

- `jobmanager.web.port`: Port of the JobManager's web interface (DEFAULT: 8081).

- `jobmanager.web.tmpdir`: This configuration parameter allows defining the Flink web directory to be used by the web interface. The web interface
will copy its static files into the directory. Also uploaded job jars are stored in the directory if not overridden. By default, the temporary directory is used.

- `jobmanager.web.upload.dir`: The config parameter defining the directory for uploading the job jars. If not specified a dynamic directory
will be used under the directory specified by jobmanager.web.tmpdir.

- `fs.overwrite-files`: Specifies whether file output writers should overwrite existing files by default. Set to *true* to overwrite by default, *false* otherwise. (DEFAULT: false)

- `fs.output.always-create-directory`: File writers running with a parallelism larger than one create a directory for the output file path and put the different result files (one per parallel writer task) into that directory. If this option is set to *true*, writers with a parallelism of 1 will also create a directory and place a single result file into it. If the option is set to *false*, the writer will directly create the file directly at the output path, without creating a containing directory. (DEFAULT: false)

- `taskmanager.network.numberOfBuffers`: The number of buffers available to the network stack. This number determines how many streaming data exchange channels a TaskManager can have at the same time and how well buffered the channels are. If a job is rejected or you get a warning that the system has not enough buffers available, increase this value (DEFAULT: 2048).

- `state.backend`: The backend that will be used to store operator state checkpoints if checkpointing is enabled. Supported backends:
   -  `jobmanager`: In-memory state, backup to JobManager's/ZooKeeper's memory. Should be used only for minimal state (Kafka offsets) or testing and local debugging.
   -  `filesystem`: State is in-memory on the TaskManagers, and state snapshots are stored in a file system. Supported are all filesystems supported by Flink, for example HDFS, S3, ...

- `state.backend.fs.checkpointdir`: Directory for storing checkpoints in a Flink supported filesystem. Note: State backend must be accessible from the JobManager, use `file://` only for local setups.

- `state.backend.rocksdb.checkpointdir`:  The local directory for storing RocksDB files, or a list of directories separated by the systems directory delimiter (for example ':' (colon) on Linux/Unix). (DEFAULT value is `taskmanager.tmp.dirs`)

- `state.checkpoints.dir`: The target directory for meta data of [externalized checkpoints]({{ site.baseurl }}/setup/checkpoints.html#externalized-checkpoints).

- `state.checkpoints.num-retained`: The number of completed checkpoint instances to retain. Having more than one allows recovery fallback to an earlier checkpoints if the latest checkpoint is corrupt. (Default: 1)

- `high-availability.zookeeper.storageDir`: Required for HA. Directory for storing JobManager metadata; this is persisted in the state backend and only a pointer to this state is stored in ZooKeeper. Exactly like the checkpoint directory it must be accessible from the JobManager and a local filesystem should only be used for local deployments. Previously this key was named `recovery.zookeeper.storageDir`.

- `blob.storage.directory`: Directory for storing blobs (such as user JARs) on the TaskManagers.

- `blob.server.port`: Port definition for the blob server (serving user JARs) on the TaskManagers. By default the port is set to 0, which means that the operating system is picking an ephemeral port. Flink also accepts a list of ports ("50100,50101"), ranges ("50100-50200") or a combination of both. It is recommended to set a range of ports to avoid collisions when multiple JobManagers are running on the same machine.

- `blob.service.ssl.enabled`: Flag to enable ssl for the blob client/server communication. This is applicable only when the global ssl flag security.ssl.enabled is set to true (DEFAULT: true).

- `restart-strategy`: Default [restart strategy]({{site.baseurl}}/dev/restart_strategies.html) to use in case no
restart strategy has been specified for the job.
The options are:
    - fixed delay strategy: `fixed-delay`.
    - failure rate strategy: `failure-rate`.
    - no restarts: `none`

    Default value is `none` unless checkpointing is enabled for the job in which case the default is `fixed-delay` with `Integer.MAX_VALUE` restart attempts and `10s` delay.

- `restart-strategy.fixed-delay.attempts`: Number of restart attempts, used if the default restart strategy is set to "fixed-delay".
Default value is 1, unless "fixed-delay" was activated by enabling checkpoints, in which case the default is `Integer.MAX_VALUE`.

- `restart-strategy.fixed-delay.delay`: Delay between restart attempts, used if the default restart strategy is set to "fixed-delay".
Default value is the `akka.ask.timeout`, unless "fixed-delay" was activated by enabling checkpoints, in which case
the default is 10s.

- `restart-strategy.failure-rate.max-failures-per-interval`: Maximum number of restarts in given time interval before failing a job in "failure-rate" strategy.
Default value is 1.

- `restart-strategy.failure-rate.failure-rate-interval`: Time interval for measuring failure rate in "failure-rate" strategy.
Default value is `1 minute`.

- `restart-strategy.failure-rate.delay`: Delay between restart attempts, used if the default restart strategy is set to "failure-rate".
Default value is the `akka.ask.timeout`.

## Full Reference

### HDFS

These parameters configure the default HDFS used by Flink. Setups that do not specify a HDFS configuration have to specify the full path to HDFS files (`hdfs://address:port/path/to/files`) Files will also be written with default HDFS parameters (block size, replication factor).

- `fs.hdfs.hadoopconf`: The absolute path to the Hadoop configuration directory. The system will look for the "core-site.xml" and "hdfs-site.xml" files in that directory (DEFAULT: null).

- `fs.hdfs.hdfsdefault`: The absolute path of Hadoop's own configuration file "hdfs-default.xml" (DEFAULT: null).

- `fs.hdfs.hdfssite`: The absolute path of Hadoop's own configuration file "hdfs-site.xml" (DEFAULT: null).

### JobManager & TaskManager

The following parameters configure Flink's JobManager and TaskManagers.

- `jobmanager.rpc.address`: The external address of the JobManager, which is the master/coordinator of the distributed system (DEFAULT: **localhost**). **Note:** The address (host name or IP) should be accessible by all nodes including the client.

- `jobmanager.rpc.port`: The port number of the JobManager (DEFAULT: **6123**).

- `taskmanager.hostname`: The hostname of the network interface that the TaskManager binds to. By default, the TaskManager searches for network interfaces that can connect to the JobManager and other TaskManagers. This option can be used to define a hostname if that strategy fails for some reason. Because different TaskManagers need different values for this option, it usually is specified in an additional non-shared TaskManager-specific config file.

- `taskmanager.rpc.port`: The task manager's IPC port (DEFAULT: **0**, which lets the OS choose a free port).

- `taskmanager.data.port`: The task manager's port used for data exchange operations (DEFAULT: **0**, which lets the OS choose a free port).

- `taskmanager.data.ssl.enabled`: Enable SSL support for the taskmanager data transport. This is applicable only when the global ssl flag security.ssl.enabled is set to true (DEFAULT: **true**)

- `jobmanager.heap.mb`: JVM heap size (in megabytes) for the JobManager (DEFAULT: **256**).

- `taskmanager.heap.mb`: JVM heap size (in megabytes) for the TaskManagers, which are the parallel workers of the system. In contrast to Hadoop, Flink runs operators (e.g., join, aggregate) and user-defined functions (e.g., Map, Reduce, CoGroup) inside the TaskManager (including sorting/hashing/caching), so this value should be as large as possible (DEFAULT: **512**). On YARN setups, this value is automatically configured to the size of the TaskManager's YARN container, minus a certain tolerance value.

- `taskmanager.numberOfTaskSlots`: The number of parallel operator or user function instances that a single TaskManager can run (DEFAULT: **1**). If this value is larger than 1, a single TaskManager takes multiple instances of a function or operator. That way, the TaskManager can utilize multiple CPU cores, but at the same time, the available memory is divided between the different operator or function instances. This value is typically proportional to the number of physical CPU cores that the TaskManager's machine has (e.g., equal to the number of cores, or half the number of cores).

- `taskmanager.tmp.dirs`: The directory for temporary files, or a list of directories separated by the system's directory delimiter (for example ':' (colon) on Linux/Unix). If multiple directories are specified, then the temporary files will be distributed across the directories in a round robin fashion. The I/O manager component will spawn one reading and one writing thread per directory. A directory may be listed multiple times to have the I/O manager use multiple threads for it (for example if it is physically stored on a very fast disc or RAID) (DEFAULT: **The system's tmp dir**).

- `taskmanager.network.numberOfBuffers`: The number of buffers available to the network stack. This number determines how many streaming data exchange channels a TaskManager can have at the same time and how well buffered the channels are. If a job is rejected or you get a warning that the system has not enough buffers available, increase this value (DEFAULT: **2048**).

- `taskmanager.memory.size`: The amount of memory (in megabytes) that the task manager reserves on the JVM's heap space for sorting, hash tables, and caching of intermediate results. If unspecified (-1), the memory manager will take a fixed ratio of the heap memory available to the JVM, as specified by `taskmanager.memory.fraction`. (DEFAULT: **-1**)

- `taskmanager.memory.fraction`: The relative amount of memory that the task manager reserves for sorting, hash tables, and caching of intermediate results. For example, a value of 0.8 means that TaskManagers reserve 80% of the JVM's heap space for internal data buffers, leaving 20% of the JVM's heap space free for objects created by user-defined functions. (DEFAULT: **0.7**) This parameter is only evaluated, if `taskmanager.memory.size` is not set.

- `taskmanager.debug.memory.startLogThread`: Causes the TaskManagers to periodically log memory and Garbage collection statistics. The statistics include current heap-, off-heap, and other memory pool utilization, as well as the time spent on garbage collection, by heap memory pool.

- `taskmanager.debug.memory.logIntervalMs`: The interval (in milliseconds) in which the TaskManagers log the memory and garbage collection statistics. Only has an effect, if `taskmanager.debug.memory.startLogThread` is set to true.

- `taskmanager.maxRegistrationDuration`: Defines the maximum time it can take for the TaskManager registration. If the duration is exceeded without a successful registration, then the TaskManager terminates. The max registration duration requires a time unit specifier (ms/s/min/h/d) (e.g. "10 min"). (DEFAULT: **Inf**)

- `taskmanager.initial-registration-pause`: The initial registration pause between two consecutive registration attempts. The pause is doubled for each new registration attempt until it reaches the maximum registration pause. The initial registration pause requires a time unit specifier (ms/s/min/h/d) (e.g. "5 s"). (DEFAULT: **500 ms**)

- `taskmanager.max-registration-pause`: The maximum registration pause between two consecutive registration attempts. The max registration pause requires a time unit specifier (ms/s/min/h/d) (e.g. "5 s"). (DEFAULT: **30 s**)

- `taskmanager.refused-registration-pause`: The pause after a registration has been refused by the job manager before retrying to connect. The refused registration pause requires a time unit specifier (ms/s/min/h/d) (e.g. "5 s"). (DEFAULT: **10 s**)

- `taskmanager.jvm-exit-on-oom`: Indicates that the TaskManager should immediately terminate the JVM if the task thread throws an `OutOfMemoryError` (DEFAULT: **false**).

- `blob.fetch.retries`: The number of retries for the TaskManager to download BLOBs (such as JAR files) from the JobManager (DEFAULT: **50**).

- `blob.fetch.num-concurrent`: The number concurrent BLOB fetches (such as JAR file downloads) that the JobManager serves (DEFAULT: **50**).

- `blob.fetch.backlog`: The maximum number of queued BLOB fetches (such as JAR file downloads) that the JobManager allows (DEFAULT: **1000**).

- `task.cancellation-interval`: Time interval between two successive task cancellation attempts in milliseconds (DEFAULT: **30000**).

### Distributed Coordination (via Akka)

- `akka.ask.timeout`: Timeout used for all futures and blocking Akka calls. If Flink fails due to timeouts then you should try to increase this value. Timeouts can be caused by slow machines or a congested network. The timeout value requires a time-unit specifier (ms/s/min/h/d) (DEFAULT: **10 s**).

- `akka.lookup.timeout`: Timeout used for the lookup of the JobManager. The timeout value has to contain a time-unit specifier (ms/s/min/h/d) (DEFAULT: **10 s**).

- `akka.client.timeout`: Timeout used by Flink clients (e.g. `CliFrontend`, `ClusterClient`) when communicating with the Flink cluster. The timeout value has to contain a time-unit specifier (ms/s/min/h/d) (DEFAULT: **60 s**).

- `akka.framesize`: Maximum size of messages which are sent between the JobManager and the TaskManagers. If Flink fails because messages exceed this limit, then you should increase it. The message size requires a size-unit specifier (DEFAULT: **10485760b**).

- `akka.watch.heartbeat.interval`: Heartbeat interval for Akka's DeathWatch mechanism to detect dead TaskManagers. If TaskManagers are wrongly marked dead because of lost or delayed heartbeat messages, then you should increase this value. A thorough description of Akka's DeathWatch can be found [here](http://doc.akka.io/docs/akka/snapshot/scala/remoting.html#failure-detector) (DEFAULT: **10 s**).

- `akka.watch.heartbeat.pause`: Acceptable heartbeat pause for Akka's DeathWatch mechanism. A low value does not allow a irregular heartbeat. A thorough description of Akka's DeathWatch can be found [here](http://doc.akka.io/docs/akka/snapshot/scala/remoting.html#failure-detector) (DEFAULT: **60 s**).

- `akka.watch.threshold`: Threshold for the DeathWatch failure detector. A low value is prone to false positives whereas a high value increases the time to detect a dead TaskManager. A thorough description of Akka's DeathWatch can be found [here](http://doc.akka.io/docs/akka/snapshot/scala/remoting.html#failure-detector) (DEFAULT: **12**).

- `akka.transport.heartbeat.interval`: Heartbeat interval for Akka's transport failure detector. Since Flink uses TCP, the detector is not necessary. Therefore, the detector is disabled by setting the interval to a very high value. In case you should need the transport failure detector, set the interval to some reasonable value. The interval value requires a time-unit specifier (ms/s/min/h/d) (DEFAULT: **1000 s**).

- `akka.transport.heartbeat.pause`: Acceptable heartbeat pause for Akka's transport failure detector. Since Flink uses TCP, the detector is not necessary. Therefore, the detector is disabled by setting the pause to a very high value. In case you should need the transport failure detector, set the pause to some reasonable value. The pause value requires a time-unit specifier (ms/s/min/h/d) (DEFAULT: **6000 s**).

- `akka.transport.threshold`: Threshold for the transport failure detector. Since Flink uses TCP, the detector is not necessary and, thus, the threshold is set to a high value (DEFAULT: **300**).

- `akka.tcp.timeout`: Timeout for all outbound connections. If you should experience problems with connecting to a TaskManager due to a slow network, you should increase this value (DEFAULT: **20 s**).

- `akka.throughput`: Number of messages that are processed in a batch before returning the thread to the pool. Low values denote a fair scheduling whereas high values can increase the performance at the cost of unfairness (DEFAULT: **15**).

- `akka.log.lifecycle.events`: Turns on the Akka's remote logging of events. Set this value to 'true' in case of debugging (DEFAULT: **false**).

- `akka.startup-timeout`: Timeout after which the startup of a remote component is considered being failed (DEFAULT: **akka.ask.timeout**).

- `akka.ssl.enabled`: Turns on SSL for Akka's remote communication. This is applicable only when the global ssl flag security.ssl.enabled is set to true (DEFAULT: **true**).

### SSL Settings

- `security.ssl.enabled`: Turns on SSL for internal network communication. This can be optionally overridden by flags defined in different transport modules (DEFAULT: **false**).

- `security.ssl.keystore`: The Java keystore file to be used by the flink endpoint for its SSL Key and Certificate.

- `security.ssl.keystore-password`: The secret to decrypt the keystore file.

- `security.ssl.key-password`: The secret to decrypt the server key in the keystore.

- `security.ssl.truststore`: The truststore file containing the public CA certificates to be used by flink endpoints to verify the peer's certificate.

- `security.ssl.truststore-password`: The secret to decrypt the truststore.

- `security.ssl.protocol`: The SSL protocol version to be supported for the ssl transport (DEFAULT: **TLSv1.2**). Note that it doesn't support comma separated list.

- `security.ssl.algorithms`: The comma separated list of standard SSL algorithms to be supported. Read more [here](http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#ciphersuites) (DEFAULT: **TLS_RSA_WITH_AES_128_CBC_SHA**).

- `security.ssl.verify-hostname`: Flag to enable peer's hostname verification during ssl handshake (DEFAULT: **true**).

### Network communication (via Netty)

These parameters allow for advanced tuning. The default values are sufficient when running concurrent high-throughput jobs on a large cluster.

- `taskmanager.net.num-arenas`: The number of Netty arenas (DEFAULT: **taskmanager.numberOfTaskSlots**).

- `taskmanager.net.server.numThreads`: The number of Netty server threads (DEFAULT: **taskmanager.numberOfTaskSlots**).

- `taskmanager.net.client.numThreads`: The number of Netty client threads (DEFAULT: **taskmanager.numberOfTaskSlots**).

- `taskmanager.net.server.backlog`: The netty server connection backlog.

- `taskmanager.net.client.connectTimeoutSec`: The Netty client connection timeout (DEFAULT: **120 seconds**).

- `taskmanager.net.sendReceiveBufferSize`: The Netty send and receive buffer size. This defaults to the system buffer size (`cat /proc/sys/net/ipv4/tcp_[rw]mem`) and is 4 MiB in modern Linux.

- `taskmanager.net.transport`: The Netty transport type, either "nio" or "epoll" (DEFAULT: **nio**).

### JobManager Web Frontend

- `jobmanager.web.port`: Port of the JobManager's web interface that displays status of running jobs and execution time breakdowns of finished jobs (DEFAULT: 8081). Setting this value to `-1` disables the web frontend.

- `jobmanager.web.history`: The number of latest jobs that the JobManager's web front-end in its history (DEFAULT: 5).

- `jobmanager.web.checkpoints.disable`: Disables checkpoint statistics (DEFAULT: `false`).

- `jobmanager.web.checkpoints.history`: Number of checkpoint statistics to remember (DEFAULT: `10`).

- `jobmanager.web.backpressure.cleanup-interval`: Time after which cached stats are cleaned up if not accessed (DEFAULT: `600000`, 10 mins).

- `jobmanager.web.backpressure.refresh-interval`: Time after which available stats are deprecated and need to be refreshed (DEFAULT: `60000`, 1 min).

- `jobmanager.web.backpressure.num-samples`: Number of stack trace samples to take to determine back pressure (DEFAULT: `100`).

- `jobmanager.web.backpressure.delay-between-samples`: Delay between stack trace samples to determine back pressure (DEFAULT: `50`, 50 ms).

- `jobmanager.web.ssl.enabled`: Enable https access to the web frontend. This is applicable only when the global ssl flag security.ssl.enabled is set to true (DEFAULT: `true`).

### File Systems

The parameters define the behavior of tasks that create result files.

- `fs.default-scheme`: The default filesystem scheme to be used, with the necessary authority to contact, e.g. the host:port of the NameNode in the case of HDFS (if needed).
By default, this is set to `file:///` which points to the local filesystem. This means that the local
filesystem is going to be used to search for user-specified files **without** an explicit scheme
definition. This scheme is used **ONLY** if no other scheme is specified (explicitly) in the user-provided `URI`.

- `fs.overwrite-files`: Specifies whether file output writers should overwrite existing files by default. Set to *true* to overwrite by default, *false* otherwise. (DEFAULT: false)

- `fs.output.always-create-directory`: File writers running with a parallelism larger than one create a directory for the output file path and put the different result files (one per parallel writer task) into that directory. If this option is set to *true*, writers with a parallelism of 1 will also create a directory and place a single result file into it. If the option is set to *false*, the writer will directly create the file directly at the output path, without creating a containing directory. (DEFAULT: false)

### Compiler/Optimizer

- `compiler.delimited-informat.max-line-samples`: The maximum number of line samples taken by the compiler for delimited inputs. The samples are used to estimate the number of records. This value can be overridden for a specific input with the input format's parameters (DEFAULT: 10).

- `compiler.delimited-informat.min-line-samples`: The minimum number of line samples taken by the compiler for delimited inputs. The samples are used to estimate the number of records. This value can be overridden for a specific input with the input format's parameters (DEFAULT: 2).

- `compiler.delimited-informat.max-sample-len`: The maximal length of a line sample that the compiler takes for delimited inputs. If the length of a single sample exceeds this value (possible because of misconfiguration of the parser), the sampling aborts. This value can be overridden for a specific input with the input format's parameters (DEFAULT: 2097152 (= 2 MiBytes)).

### Runtime Algorithms

- `taskmanager.runtime.hashjoin-bloom-filters`: Flag to activate/deactivate bloom filters in the hybrid hash join implementation. In cases where the hash join needs to spill to disk (datasets larger than the reserved fraction of memory), these bloom filters can greatly reduce the number of spilled records, at the cost some CPU cycles. (DEFAULT: false)

- `taskmanager.runtime.max-fan`: The maximal fan-in for external merge joins and fan-out for spilling hash tables. Limits the number of file handles per operator, but may cause intermediate merging/partitioning, if set too small (DEFAULT: 128).

- `taskmanager.runtime.sort-spilling-threshold`: A sort operation starts spilling when this fraction of its memory budget is full (DEFAULT: 0.8).

### Resource Manager

The configuration keys in this section are independent of the used resource management framework (YARN, Mesos, Standalone, ...)

- `resourcemanager.rpc.port`: The config parameter defining the network port to connect to for communication with the resource manager. By default, the port
of the JobManager, because the same ActorSystem is used. Its not possible to use this configuration key to define port ranges.

### YARN

- `containerized.heap-cutoff-ratio`: (Default 0.25) Percentage of heap space to remove from containers started by YARN. When a user requests a certain amount of memory for each TaskManager container (for example 4 GB), we can not pass this amount as the maximum heap space for the JVM (`-Xmx` argument) because the JVM is also allocating memory outside the heap. YARN is very strict with killing containers which are using more memory than requested. Therefore, we remove a 15% of the memory from the requested heap as a safety margin.

- `containerized.heap-cutoff-min`: (Default 600 MB) Minimum amount of memory to cut off the requested heap size.

- `yarn.maximum-failed-containers` (Default: number of requested containers). Maximum number of containers the system is going to reallocate in case of a failure.

- `yarn.application-attempts` (Default: 1). Number of ApplicationMaster restarts. Note that that the entire Flink cluster will restart and the YARN Client will loose the connection. Also, the JobManager address will change and you'll need to set the JM host:port manually. It is recommended to leave this option at 1.

- `yarn.heartbeat-delay` (Default: 5 seconds). Time between heartbeats with the ResourceManager.

- `yarn.properties-file.location` (Default: temp directory). When a Flink job is submitted to YARN, the JobManager's host and the number of available processing slots is written into a properties file, so that the Flink client is able to pick those details up. This configuration parameter allows changing the default location of that file (for example for environments sharing a Flink installation between users)

- `yarn.containers.vcores` The number of virtual cores (vcores) per YARN container. By default, the number of `vcores` is set to the number of slots per TaskManager, if set, or to 1, otherwise.

- `containerized.master.env.`*ENV_VAR1=value* Configuration values prefixed with `containerized.master.env.` will be passed as environment variables to the ApplicationMaster/JobManager process. For example for passing `LD_LIBRARY_PATH` as an env variable to the ApplicationMaster, set:

    `containerized.master.env.LD_LIBRARY_PATH: "/usr/lib/native"`

- `containerized.taskmanager.env.` Similar to the configuration prefix about, this prefix allows setting custom environment variables for the TaskManager processes.

- `yarn.container-start-command-template`: Flink uses the following template when starting on YARN:
`%java% %jvmmem% %jvmopts% %logging% %class% %args% %redirects%`. This configuration parameter allows users
to pass custom settings (such as JVM paths, arguments etc.). Note that in most cases, it is sufficient to
use the `env.java.opts` setting, which is the `%jvmopts%` variable in the String.

- `yarn.application-master.port` (Default: 0, which lets the OS choose an ephemeral port) With this configuration option, users can specify a port, a range of ports or a list of ports for the  Application Master (and JobManager) RPC port. By default we recommend using the default value (0) to let the operating system choose an appropriate port. In particular when multiple AMs are running on the  same physical host, fixed port assignments prevent the AM from starting.

  For example when running Flink on YARN on an environment with a restrictive firewall, this option allows specifying a range of allowed ports.

- `yarn.tags` A comma-separated list of tags to apply to the Flink YARN application.

### Mesos

- `mesos.initial-tasks`: The initial workers to bring up when the master starts (**DEFAULT**: The number of workers specified at cluster startup).

- `mesos.constraints.hard.hostattribute`: Constraints for task placement on mesos (**DEFAULT**: None).

- `mesos.maximum-failed-tasks`: The maximum number of failed workers before the cluster fails (**DEFAULT**: Number of initial workers).
May be set to -1 to disable this feature.

- `mesos.master`: The Mesos master URL. The value should be in one of the following forms:
  * `host:port`
  * `zk://host1:port1,host2:port2,.../path`
  * `zk://username:password@host1:port1,host2:port2,.../path`
  * `file:///path/to/file`

- `mesos.failover-timeout`: The failover timeout in seconds for the Mesos scheduler, after which running tasks are automatically shut down (**DEFAULT:** 600).

- `mesos.resourcemanager.artifactserver.port`:The config parameter defining the Mesos artifact server port to use. Setting the port to 0 will let the OS choose an available port.

- `mesos.resourcemanager.framework.name`: Mesos framework name (**DEFAULT:** Flink)

- `mesos.resourcemanager.framework.role`: Mesos framework role definition (**DEFAULT:** *)

- `mesos.resourcemanager.framework.principal`: Mesos framework principal (**NO DEFAULT**)

- `mesos.resourcemanager.framework.secret`: Mesos framework secret (**NO DEFAULT**)

- `mesos.resourcemanager.framework.user`: Mesos framework user (**DEFAULT:**"")

- `mesos.resourcemanager.artifactserver.ssl.enabled`: Enables SSL for the Flink artifact server (**DEFAULT**: true). Note that `security.ssl.enabled` also needs to be set to `true` encryption to enable encryption.

- `mesos.resourcemanager.tasks.mem`: Memory to assign to the Mesos workers in MB (**DEFAULT**: 1024)

- `mesos.resourcemanager.tasks.cpus`: CPUs to assign to the Mesos workers (**DEFAULT**: 0.0)

- `mesos.resourcemanager.tasks.container.type`: Type of the containerization used: "mesos" or "docker" (DEFAULT: mesos);

- `mesos.resourcemanager.tasks.container.image.name`: Image name to use for the container (**NO DEFAULT**)

- `mesos.resourcemanager.tasks.container.volumes`: A comma seperated list of [host_path:]container_path[:RO|RW]. This allows for mounting additional volumes into your container. (**NO DEFAULT**)

- `high-availability.zookeeper.path.mesos-workers`: The ZooKeeper root path for persisting the Mesos worker information.

### High Availability (HA)

- `high-availability`: Defines the high availability mode used for the cluster execution. Currently, Flink supports the following modes:
  - `none` (default): No high availability. A single JobManager runs and no JobManager state is checkpointed.
  - `zookeeper`: Supports the execution of multiple JobManagers and JobManager state checkpointing. Among the group of JobManagers, ZooKeeper elects one of them as the leader which is responsible for the cluster execution. In case of a JobManager failure, a standby JobManager will be elected as the new leader and is given the last checkpointed JobManager state. In order to use the 'zookeeper' mode, it is mandatory to also define the `high-availability.zookeeper.quorum` configuration value.

Previously this key was named `recovery.mode` and the default value was `standalone`.

#### ZooKeeper-based HA Mode

- `high-availability.zookeeper.quorum`: Defines the ZooKeeper quorum URL which is used to connect to the ZooKeeper cluster when the 'zookeeper' HA mode is selected. Previously this key was named `recovery.zookeeper.quorum`.

- `high-availability.zookeeper.path.root`: (Default `/flink`) Defines the root dir under which the ZooKeeper HA mode will create namespace directories. Previously this ket was named `recovery.zookeeper.path.root`.

- `high-availability.zookeeper.path.namespace`: (Default `/default_ns` in standalone cluster mode, or the <yarn-application-id> under YARN) Defines the subdirectory under the root dir where the ZooKeeper HA mode will create znodes. This allows to isolate multiple applications on the same ZooKeeper. Previously this key was named `recovery.zookeeper.path.namespace`.

- `high-availability.zookeeper.path.latch`: (Default `/leaderlatch`) Defines the znode of the leader latch which is used to elect the leader. Previously this key was named `recovery.zookeeper.path.latch`.

- `high-availability.zookeeper.path.leader`: (Default `/leader`) Defines the znode of the leader which contains the URL to the leader and the current leader session ID. Previously this key was named `recovery.zookeeper.path.leader`.

- `high-availability.zookeeper.storageDir`: Defines the directory in the state backend where the JobManager metadata will be stored (ZooKeeper only keeps pointers to it). Required for HA. Previously this key was named `recovery.zookeeper.storageDir`.

- `high-availability.zookeeper.client.session-timeout`: (Default `60000`) Defines the session timeout for the ZooKeeper session in ms. Previously this key was named `recovery.zookeeper.client.session-timeout`

- `high-availability.zookeeper.client.connection-timeout`: (Default `15000`) Defines the connection timeout for ZooKeeper in ms. Previously this key was named `recovery.zookeeper.client.connection-timeout`.

- `high-availability.zookeeper.client.retry-wait`: (Default `5000`) Defines the pause between consecutive retries in ms. Previously this key was named `recovery.zookeeper.client.retry-wait`.

- `high-availability.zookeeper.client.max-retry-attempts`: (Default `3`) Defines the number of connection retries before the client gives up. Previously this key was named `recovery.zookeeper.client.max-retry-attempts`.

- `high-availability.job.delay`: (Default `akka.ask.timeout`) Defines the delay before persisted jobs are recovered in case of a master recovery situation. Previously this key was named `recovery.job.delay`.

- `high-availability.zookeeper.client.acl`: (Default `open`) Defines the ACL (open|creator) to be configured on ZK node. The configuration value can be set to "creator" if the ZooKeeper server configuration has the "authProvider" property mapped to use SASLAuthenticationProvider and the cluster is configured to run in secure mode (Kerberos). The ACL options are based on https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_BuiltinACLSchemes

#### ZooKeeper Security

- `zookeeper.sasl.disable`: (Default: `true`) Defines if SASL based authentication needs to be enabled or disabled. The configuration value can be set to "true" if ZooKeeper cluster is running in secure mode (Kerberos).

- `zookeeper.sasl.service-name`: (Default: `zookeeper`) If the ZooKeeper server is configured with a different service name (default:"zookeeper") then it can be supplied using this configuration. A mismatch in service name between client and server configuration will cause the authentication to fail.

### Kerberos-based Security

- `security.kerberos.login.use-ticket-cache`: Indicates whether to read from your Kerberos ticket cache (default: `true`).

- `security.kerberos.login.keytab`: Absolute path to a Kerberos keytab file that contains the user credentials.

- `security.kerberos.login.principal`: Kerberos principal name associated with the keytab.

- `security.kerberos.login.contexts`: A comma-separated list of login contexts to provide the Kerberos credentials to (for example, `Client,KafkaClient` to use the credentials for ZooKeeper authentication and for Kafka authentication).

### Environment

- `env.log.dir`: (Defaults to the `log` directory under Flink's home) Defines the directory where the Flink logs are saved. It has to be an absolute path.

- `env.log.max`: (Default: `5`) The maximum number of old log files to keep.

- `env.ssh.opts`: Additional command line options passed to SSH clients when starting or stopping JobManager, TaskManager, and Zookeeper services (start-cluster.sh, stop-cluster.sh, start-zookeeper-quorum.sh, stop-zookeeper-quorum.sh).

### Queryable State

#### Server

- `query.server.enable`: Enable queryable state (Default: `true`).

- `query.server.port`: Port to bind queryable state server to (Default: `0`, binds to random port).

- `query.server.network-threads`: Number of network (Netty's event loop) Threads for queryable state server (Default: `0`, picks number of slots).

- `query.server.query-threads`: Number of query Threads for queryable state server (Default: `0`, picks number of slots).

#### Client

- `query.client.network-threads`: Number of network (Netty's event loop) Threads for queryable state client (Default: `0`, picks number of available cores as returned by `Runtime.getRuntime().availableProcessors()`).

- `query.client.lookup.num-retries`: Number of retries on KvState lookup failure due to unavailable JobManager (Default: `3`).

- `query.client.lookup.retry-delay`: Retry delay in milliseconds on KvState lookup failure due to unavailable JobManager (Default: `1000`).

### Metrics

- `metrics.reporters`: The list of named reporters, i.e. "foo,bar".

- `metrics.reporter.<name>.<config>`: Generic setting `<config>` for the reporter named `<name>`.

- `metrics.reporter.<name>.class`: The reporter class to use for the reporter named `<name>`.

- `metrics.reporter.<name>.interval`: The reporter interval to use for the reporter named `<name>`.

- `metrics.scope.jm`: (Default: <host>.jobmanager) Defines the scope format string that is applied to all metrics scoped to a JobManager.

- `metrics.scope.jm.job`: (Default: <host>.jobmanager.<job_name>) Defines the scope format string that is applied to all metrics scoped to a job on a JobManager.

- `metrics.scope.tm`: (Default: <host>.taskmanager.<tm_id>) Defines the scope format string that is applied to all metrics scoped to a TaskManager.

- `metrics.scope.tm.job`: (Default: <host>.taskmanager.<tm_id>.<job_name>) Defines the scope format string that is applied to all metrics scoped to a job on a TaskManager.

- `metrics.scope.task`: (Default: <host>.taskmanager.<tm_id>.<job_name>.<task_name>.<subtask_index>) Defines the scope format string that is applied to all metrics scoped to a task.

- `metrics.scope.operator`: (Default: <host>.taskmanager.<tm_id>.<job_name>.<operator_name>.<subtask_index>) Defines the scope format string that is applied to all metrics scoped to an operator.

- `metrics.latency.history-size`: (Default: 128) Defines the number of measured latencies to maintain at each operator

### History Server

You have to configure `jobmanager.archive.fs.dir` in order to archive terminated jobs and add it to the list of monitored directories via `historyserver.archive.fs.dir` if you want to display them via the HistoryServer's web frontend.

- `jobmanager.archive.fs.dir`: Directory to upload information about terminated jobs to. You have to add this directory to the list of monitored directories of the history server via `historyserver.archive.fs.dir`.

- `historyserver.archive.fs.dir`: Comma separated list of directories to fetch archived jobs from. The history server will monitor these directories for archived jobs. You can configure the JobManager to archive jobs to a directory via `jobmanager.archive.fs.dir`.

- `historyserver.archive.fs.refresh-interval`: Interval in milliseconds for refreshing the archived job directories (DEFAULT: `10000`).

- `historyserver.web.tmpdir`: This configuration parameter allows defining the Flink web directory to be used by the history server web interface. The web interface will copy its static files into the directory (DEFAULT: local system temporary directory).

- `historyserver.web.address`: Address of the HistoryServer's web interface (DEFAULT: `anyLocalAddress()`).

- `historyserver.web.port`: Port of the HistoryServers's web interface (DEFAULT: `8082`).

- `historyserver.web.ssl.enabled`: Enable HTTPs access to the HistoryServer web frontend. This is applicable only when the global SSL flag security.ssl.enabled is set to true (DEFAULT: `false`).

## Background

### Configuring the Network Buffers

If you ever see the Exception `java.io.IOException: Insufficient number of network buffers`, please use the following formula to adjust the number of network buffers:

```
#slots-per-TM^2 * #TMs * 4
```

Where `#slots per TM` are the [number of slots per TaskManager](#configuring-taskmanager-processing-slots) and `#TMs` are the total number of task managers.

Network buffers are a critical resource for the communication layers. They are used to buffer records before transmission over a network, and to buffer incoming data before dissecting it into records and handing them to the
application. A sufficient number of network buffers is critical to achieve a good throughput.

In general, configure the task manager to have enough buffers that each logical network connection you expect to be open at the same time has a dedicated buffer. A logical network connection exists for each point-to-point exchange of data over the network, which typically happens at repartitioning- or broadcasting steps (shuffle phase). In those, each parallel task inside the TaskManager has to be able to talk to all other parallel tasks. Hence, the required number of buffers on a task manager is *total-degree-of-parallelism* (number of targets) \* *intra-node-parallelism* (number of sources in one task manager) \* *n*. Here, *n* is a constant that defines how many repartitioning-/broadcasting steps you expect to be active at the same time.

Since the *intra-node-parallelism* is typically the number of cores, and more than 4 repartitioning or broadcasting channels are rarely active in parallel, it frequently boils down to `#slots-per-TM^2 * #TMs * 4`.

To support for example a cluster of 20 8-slot machines, you should use roughly 5000 network buffers for optimal throughput.

Each network buffer has by default a size of 32 KiBytes. In the above example, the system would allocate roughly 300 MiBytes for network buffers.

The number and size of network buffers can be configured with the following parameters:

- `taskmanager.network.numberOfBuffers`, and
- `taskmanager.memory.segment-size`.

### Configuring Temporary I/O Directories

Although Flink aims to process as much data in main memory as possible, it is not uncommon that more data needs to be processed than memory is available. Flink's runtime is designed to write temporary data to disk to handle these situations.

The `taskmanager.tmp.dirs` parameter specifies a list of directories into which Flink writes temporary files. The paths of the directories need to be separated by ':' (colon character). Flink will concurrently write (or read) one temporary file to (from) each configured directory. This way, temporary I/O can be evenly distributed over multiple independent I/O devices such as hard disks to improve performance. To leverage fast I/O devices (e.g., SSD, RAID, NAS), it is possible to specify a directory multiple times.

If the `taskmanager.tmp.dirs` parameter is not explicitly specified, Flink writes temporary data to the temporary directory of the operating system, such as */tmp* in Linux systems.

### Configuring TaskManager processing slots

Flink executes a program in parallel by splitting it into subtasks and scheduling these subtasks to processing slots.

Each Flink TaskManager provides processing slots in the cluster. The number of slots is typically proportional to the number of available CPU cores __of each__ TaskManager. As a general recommendation, the number of available CPU cores is a good default for `taskmanager.numberOfTaskSlots`.

When starting a Flink application, users can supply the default number of slots to use for that job. The command line value therefore is called `-p` (for parallelism). In addition, it is possible to [set the number of slots in the programming APIs]({{site.baseurl}}/dev/parallel.html) for the whole application and for individual operators.

<img src="{{ site.baseurl }}/fig/slots_parallelism.svg" class="img-responsive" />


Microdermabrasion is a clinically proven skin resurfacing treatment that offers flawless results for problem skin, lines and wrinkles, acne, scarring, stretch marks and pigmentation issues. It dramatically and visibly improves the tone, texture and appearance of your skin, leaving your skin looking, feeling and being healthier. 'Highly Recommended'.
Microdermabrasion uses an adjustable applicator head that removes dead surface skin cells and initiates cellular turnover at the dermis and epidermis levels in a safe, controlled manner. This approach respects the integrity of the skin and promotes even healing. Maintaining even cellular growth on the surface aids in the youthfulness of the skins appearance.
Results may include improved skin tone, fewer breakouts, diminished appearance of scars, even skin colour, refined skin pores, renewed elasticity and a healthy glow.
What should you expect during your treatment?
Prior to your first microdermabrasion, a skin analysis will be performed and skin areas which concern you will be discussed. If microdermabrasion is not appropriate or an alternative treatment is recommended you will be informed of this. If microdermabrasion is for you, maximum results are obtained by participating in a series of treatments plus following a home care regime.
Prior to the microdermabrasion treatment, your skin will be cleared and cleansed appropriately. This is the relaxing and distressing part of the facial. It also allows your skin to relax, your pores opened in order to gain the most benefit from the microdermabrasion itself. You will then experience the crystal clear microdermabrasion facial which will cover the entire face and certain areas concentrated on. Following the microderm your skin will go through a finishing regime custom designed for your skin type and treatment goals.
Align Clinics Microdermabrasion Facial Prices.
Special Offer 3 Sessions for £90.
A full confidential consultation is required for each client ensuring the treatment is appropriate and viable. Treatment can be carried out on the same day as the consultation, within the same session.


text:
Orthodontist in Broomfield CO
Broomfield Orthodontic Care for Adults, Teens and Children
Residents in search of a skilled Orthodontist Broomfield can turn to Dr. Timothy Hardy. Dr. Hardy is a board-certified orthodontist dedicated to treating bite issues, aligning teeth, and resolving an array of issues relating to Orthodontics Broomfield in children and adults. Hardy Pediatric Dentistry & Orthodontics provides a variety of alternative treatment options to meet your needs. Some of the treatments we provide include Broomfield Braces (conventional), short-term, and other forms of braces such as Lingual braces Broomfield, Broomfield Invisalign aligners, Invisalign Teen®, Broomfield Clear bracket braces, surgical orthodontics, and therapy for Temporomandibular Joint Disorder (TMJ). Dr. Hardy and his skilled team employ the most up-to-date solutions to enable you to accomplish your dental objectives as quickly and discreetly as possible.
Explore our website to learn more about our dental practice and the services we offer. See our detailed map of our clinic below, near Broomfield, CO region. If you have any questions or would like to make an appointment for Orthodontist Broomfield, CO, don't hesitate to give Hardy Pediatric Dentistry & Orthodontics a call.
Why Choose Dr. Hardy for Broomfield Community?
Finding a skilled and trusted orthodontist around or near Broomfield, CO for your orthodontic treatment procedure is critical to a successful treatment. While general dentists may provide some orthodontic services, our dental clinic provides exams and treatments by a licensed Orthodontist Broomfield CO who specializes in these procedures and has the essential knowledge and expertise to achieve the best results. Dr. Hardy earned his Orthodontics accreditation from Tufts University School of Dental Medicine, where he specialized in treating crooked or misaligned teeth, modifying occlusion, and addressing jaw irregularities. As a member of both the American Dental Association and the American Association of Orthodontists and other organizations, Dr. Hardy is dedicated to creating a relaxed, personalized experience for our patients Broomfield, Colorado. He does not want anyone's financial circumstances to hinder receiving proper orthodontic care so he works hard to make braces as affordable as possible.
About Broomfield
Image Source: Wikipedia
The City and County of Broomfield is a consolidated city and county located in the U.S. State of Colorado. Broomfield has a consolidated government which operates under Article XX, Sections 10-13 of the Constitution of the State of Colorado. The Broomfield population was 74,112 at the 2020 United States Census, making it the 15th most populous municipality and the 12th most populous county in Colorado. Broomfield is a part of the Denver–Aurora–Lakewood, CO Metropolitan Statistical Area and the Front Range Urban Corridor.
Several railroads figure in the development of this area. The Colorado Central Railroad built a narrow gauge line from Golden in 1873, the Denver, Utah and Pacific Railroad arrived in 1881, and the Denver, Marshall and Boulder Railway built a line through what would become Broomfield in 1886. The Denver, Utah and Pacific was widened to standard gauge in 1889. One of the early names for the area was Zang's Spur, after the railroad spur serving Adolph Zang's grain fields. (Source: Wikipedia)

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: Regular Expression for checking if a string contains atleas one [a-z] & [0-9, Two [A-Z] and the length of entire string should be 4 to 10 CHARS Regular Expression for checking if a string contains at least one [a-z] & [0-9]. Two [A-Z] and the length of entire stringenter code here should be 4 to 10 CHARS.
I've been trying this for long...but am not able to.

A: /^(?=.*?[a-z])(?=.*?[0-9])(?=.*?[A-Z].*?[A-Z]).{4,10}$/

However, doing the four tests separately with single regexes or getStringLength() would be much more readable and maintainable.

redpajama_set_name: RedPajamaStackExchange


Since the AIM Bloggerbot no longer seems to be a viable mobile solution, I've had to take the mobile blog down indefinitely till other mobile blogging resources present themselves. David Davies' Mobile Blogging How-To Guide relies on the ability to send SMTP email to an email-receiving blog app, but I'm not sure how compatible such a scheme would be with SMS on T-Mobile.
An Audblog, maybe? Nah. Naaah.
SMS on T-mobile? That's how I did all my moblogging for the first 2 years, Nokia 7110, T-mobile, SMS > email. It's a piece of cake. Their SMS > email gateway access number is 191. Format the message as per my how-to. Get in touch if you want a more specific how-to.
I use wap blogger, which is very good if you have gprs, and if you ask nicely you can get the code and install it on your own server which allows you to cut down lots of the code.


text:
Q: How to set IsChecked = True for a Radio buttons that are generated from an Enum WPF I have generated RadioButtons from an enumeration as follows.
 <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="GetRadioTypes">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="Enums:RadioTypes"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>

<ItemsControl ItemsSource="{Binding Source={StaticResource GetRadioTypes}}" VerticalAlignment="Center">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <RadioButton  Margin="10" GroupName="MyRadios" Checked="RadioButton_Checked"  Content="{Binding}" >
                         </RadioButton>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

Now i am interested to Check the first RadioButton generated defaultly.
How can i do that??
If i have IsChecked = "True" for the RadioButtton in ItemTemplate it by default Checks everyone that generates which i dont want to happen.
Thanks in advance

A: If you change your itemscontrol to, say, a list box you'll have access to the SelectedItem property. Bind that to a property in your viewmodel,SelectedRadio (or whatever), and then set SelectedRadio to the first enum in your vewmodel's constructor.


text: Q: Class of Sendinblue could not found in Repository in Laravel I am using Sendinblue for sending email via API in paravel. The problem is when I use Repository for managing sending email, Laravel could not find Sendinblue API. Itest different packages for using Sendinblue for Laravel, but still have problem for using it. This is aa error when I used juanparati/sendinblue Package for sending Email.


Zonet ZWA3006 - 6dBi Directional/3dBi Omni-Directional 2-In-1 Wireless Antenna increases the range of your Wireless network. Attach the ZWA3006 to your Wireless Broadband Router, Access Point, and wireless adapters, it increases both your wireless transmit and receiving sensitivity. ZWA3006 can serves as a point-to-point or a point-to-multi-point antenna with the bonus TNC converter. It's perfect for large areas, such as warehouse environments, public spaces, and wireless hotspots -- anywhere you need extra coverage for your wireless network. Features • Increase the effective range of your wireless network • Works with Most Wireless Devices with Removable Antennas • Serves as an point-to-point bridging antenna or a point-to-multi-point extended range antenna • Compatible with 2.4GHz 802.11b/g compliant devices using a SMA connector • Reflector can be assembled either the front side or the backside • Easy Installation Specifications Frequency Range 2.4GHz - 2.5GHz Omni Gain Peak Gain: 2.6dBi H-plane: Average 1.9dBi Polarization Linear (slant, vertical, horizontal) Omni H-Plane Omni E-Plane • 360° • 60° HPDW/ Horizonal HPDW/Vertical • 150° • 60° Connector • RP-SMA • Reverse SMA to TNC Impedance 50 Ohms (test condition) Power Rating 2W (cw) Max Package Content • One ZWA3006 Antenna • One TNC Connector • One Quick Install. Guide Caution: Maximum wireless signal rate derived from IEEE Standard 802.11b/g specifications. Actual data throughput will vary from volume of network traffic, building materials and construction, and network overhead, lower actual data throughput rate.


text:
In a first of its kind collaboration between the advertising industry and Google in support of the Sustainable Development Goals adopted at the United Nations, the 'Little by Little' campaign will leverage the power of YouTube and global influencers to mobilize Gen Z to carry out 2 billion acts of good.
'Little by Little' is rooted in the truth that exponential change can be made possible through the repetition of little acts by the largest generation on earth.
To kick-start the campaign, model and activist, Jillian Mercado, is featured in the anthem video which has already garnered more than 15 million views in just two weeks. At launch, she will be joined by a global roster of influencers – UN ambassadors and YouTube creators curated by FameBit - who will share their stories, content and actions on YouTube and other social platforms, including Yara Shahidi, Marissa Rachel, Roxy Rocks, Jessica Dante, Adebola Williams, Gemma Stafford and Khushi Maheshwari, The voices of these global influencers will be amplified by a host of other creators in the U.S., U.K., India and Nigeria as they inspire user-generated content from their followers to save the world with little actions.
This global campaign is under the banner of Common Ground – the initiative by the world's six largest advertising groups to support the Sustainable Development Goals. In April 2017, the six founding members of Common Ground, Dentsu, Havas, IPG, Omnicom, Publicis and WPP alongside Wieden + Kennedy – with the financial, creative and logistical support of Google – came together under the banner 'The Common Futures Project'. The initial direction was conceived in a 'Hackathon' in New York drawing on resources from all agency partners and then developed further by a coalition of agencies including Sapient Razorfish, Ogilvy and Mediacom.
The Deputy Secretary General of the United Nations, Amina J. Mohammed commented on the initiative: "We have a blueprint for a better world – the Sustainable Development Goals. Little by Little is about young people around the world coming together to build a movement for success. It is based on a powerful notion. Yes, we face a lot of big problems – but we can start fixing them through a lot of small acts. Step by step, little by little, we will get to a better world."
In a joint statement, the CEOs of the Common Ground partnership said, "Common Ground was born of the idea that, as an industry, we can set aside our differences to support the agenda of the 17 global goals. Little by Little is proof that this is not a theoretical ambition, but an achievable goal."
In explaining their support for the project, Google spokesperson, Torrence Boone, VP Global Agency Development, commented: "Video can affect us like no other medium. It can educate, build understanding and even change the way we see our world. It's exciting to see Common Ground's Little by Little campaign come to life and we're proud that YouTube's platform and influencers will play a crucial role in spreading this important initiative."
social cause
Nick Law, the New Chief Creative Officer of Publicis Groupe, on CreativityGijs de Swarte Time's Up join forces with the advertising industry to combat sexual harassment
Facing the future: a talk with Farid Chehab about his new book "A Bridge over the 21st Century"
Justifying the unjustifiable?
My Life in Ads with Sabine Massaad
The Changing Face of MBUs
Everybody Wants to Be a Storyteller
Disrupt Business, Create Value
Rising Above the Noise
Design Plus: When a logo is a no go
Mobilise your brand – Making your business visible in the digital marketplace
UNICEF encourages people to be 'Abtal el Madrasa' and contribute in ensuring children's access to education
Lightning in a Bottle: an Interview with Michel Yordanov
Campaign to Abolish the 522


If you are a doctor, there is no denying that you clearly understand how important an IME report is. The report that is obtained from an IME and is very important to the processing of insurance claims. Due to this fact, it is very important that utmost accuracy and effectiveness is maintained. Quick IME transcription service is one way of helping to ensure that you do maintain that effectiveness and accuracy and at Pilottech we provide you with the best of these services.
Pilottech is always looking for newer and better ways to enhance its services. With us you can be sure that you will never be disappointed because of the following reasons.
We hire the most competent and skilled professionals in the industry to provide transcription services for you.
Our services are delivered within the shortest time possible with high quality.
To assure you that our services are indeed the best available, we are willing to give you a free trial that you can use to confirm.


3. Why choose the Witch Doctor?
The purpose of the beginner Witch Doctor guide is to provide you with a build and item recommendations that will reliably carry you from leveling, through the pre-Torment difficulties and get you into low Torment farming, without requiring specific legendary or set bonuses. The guide also includes a section for Seasonal Witch Doctors, explaining how best to take advantage of the free set from Haedrig's Gifts.
Choose the Witch Doctor if you enjoy outsmarting the enemy, rendering them helpless and broken through hexes and transmutations. Once in control, you can either dive in for the kill with a devastating curse, or revel in the carnage your pets will deliver. Figures misshapen and undead bend to your will, as will reality itself — distorted, blurred and bloodied.
The build begins farming runs with an activation of Summon Zombie Dogs and Gargantuan, who are to be kept at your side at all times and re-summoned when killed — which, in the lower difficulties, is almost impossible. You assume an aggressive playstyle, rushing ahead of the pack of minions while dropping Acid Clouds and Haunting as much as your Mana allows, as well as Soul Harvesting big enemy packs to buff yourself up and deal some additional damage. Whenever you feel endangered or have no enemies in sight, you should have a Spirit Walk available to reposition.
Slots 1 and 2 — Summoning skills: The Witch Doctor is one of the strongest early game characters due to his summons, one-time cast abilities that put minions at your side — acting autonomously and dealing considerable damage of their own. You acquire Summon Zombie Dogs at level 4, and you will augment them with a stronger damage rune — Rabid Dogs as soon as it unlocks at level 12. Further down the leveling line (level 40), you will swap it out to the strongest damage dealing rune, Burning Dogs. You will complement the dogs' DoTs with the bigger burst of Gargantuan, available at level 19. The most consistent Gargantuan rune, Humongoid, unlocks right after at level 22, and you will stick to it throughout the Witch Doctor journey.
Slots 3 and 4 — Supplementary DPS: While the minions are responsible for a chunk of your damage and protection, you will be far from idle: the build assumes a proactive, leader of the pack attitude, with the Witch Doctor spreading deadly DoTs and minions cleaning up. Haunt will be your bread and butter — a cheap and powerful self-spreading DoT, acquired at level 12. For the entirety of your leveling process, you should take advantage of the doubling effect of Resentful Spirits (level 23), making the skill even easier on your Mana. It will allow you to run a second hard-hitting spender in the face of Acid Cloud, unlocking at level 22. Enlarge its effect with the rune Acid Rain at level 26, and stick to it for the remainder of your leveling.
Slot 5 — Mobility: Spirit Walk is the solitary mobility skill for Witch Doctors, and you will add it to the build at level 16. You get the safer, longer-lasting Jaunt rune early on (level 23), but it is advisable to switch to the speedfarm-oriented Severance rune as soon as it becomes available at level 47.
Slot 6 — Utility: Soul Harvest is a signature Witch Doctor self-buff, with a base damage increasing effect and additional utility gained through runes. Note its near-melee range and try to time your Spirit Walk to dive in and out of an enemy pack, maximizing your benefits and minimizing your losses. Soul Harvest unlocks early on at level 9, and you can freely experiment with its runes throughout the leveling process. Since early game farming is mostly about quick kill speed and movement efficiency, the best runes are Soul to Waste (level 39) and Vengeful Spirit (level 49).
Passives: You can freely experiment with damage buffing ( Gruesome Feast, Pierce the Veil) and damage reducing ( Jungle Fortitude, Bad Medicine) passives early on, until better passives kick in mid-leveling. At level 30, you gain the Witch Doctor cheat death, Spirit Vessel, and Fetish Sycophants — another summoning skill, hidden among your passives. Easily maxed out with Haunt spam, this passive will amass a Fetish army at your side and lay waste to your enemies with an efficiency comparable to your other summons. One of the best movement speed passives in the game, Fierce Loyalty, becomes available to you at level 45 — a solid addition to an early farming setup. Finally, you will add Grave Injustice at level 50 to gain access to kill-based cooldown reduction and resource regeneration, an amazing bonus you will likely keep all the way into the endgame.
Completion of chapters II, III and IV of the Seasonal Journey yields Haedrig's Gifts, a cache-like reward that drops two pieces of a fixed class-specific set. With the completion of these chapters, you will have a full 6-piece set bonus available to you, skyrocketing your character power well into the mid-to-high Torments. This makes the early portion of the Seasonal Journey your first priority upon reaching max level. The Season 16 Haedrig's Gift for Witch Doctors is the Arachyr set.
Slot 1 — Main Damage: Firebats will fulfill the purpose of a primary damage dealer in the build, taken with the strongest rune Cloud of Bats. Note that prior to obtaining the 6-piece Arachyr bonus, you will not have any set related bonuses to damage, and you can temporarily work with any Mana spender of your liking until then.
Slot 2 & 3 — Supplementary Damage and Buffs: While only Locust Swarm is affected by the Arachyr set, you will do well to adopt both Locust Swarm and Haunt early on, and get used to the dynamic of supplementing your damage with Pestilence and restoring Mana with Draining Spirit. This will best prepare you for Ring of Emptiness, a key legendary item that quadruples your damage against enemies affected by both DoTs.
Slot 4 — Set Mechanic: Hex is taken into the build by necessity, as the 4-piece set bonus grants you Damage Reduction that hinges on regular Hexing. The default rune recommendation is the damage increasing Jinx, but once you obtain the Manajuma set you swap into the speedfarming staple Angry Chicken.
Slot 5 — Mobility: Every well rounded build needs mobility, and for Witch Doctors this means Spirit Walk; for farming, consider taking the speediest rune of them all — Severance.
Slot 6 — Utility: Early on when you are still missing key legendaries, Summon Zombie Dogs Leeching Beasts can provide some decent sustain and act as meat shields that protect you from the fray. As soon as you acquire Lakumba's Ornament (and especially when you add a Sacred Harvester), you should switch to the Witch Doctor protective mainstay — Soul Harvest Languish.
Passives: Try to balance your passives according to your needs, adding and subtracting offensive and defensive passives as needed. Preferred offensive passives for the build (in order) include: Confidence Ritual, Pierce the Veil, Creeping Death and Gruesome Feast. The preferred defensive passives are Spirit Vessel and Swampland Attunement. Note that in speedfarming Grave Injustice trumps pretty much all other passives due to the fast killspeed of normal rifts — even more pronounced if you obtain the Manajuma set, due to the Angry Chicken resets.
Firebats Build — Sacred Harvester and Manajuma's Carving Knife (Ceremonial Knives); Staff of Chiroptera (staff); Manajuma's Gory Fetch and Vile Hive (Mojos); Lakumba's Ornament and Coils of the First Spider (bracers); Mantle of Channeling (shoulders); Ring of Emptiness and The Compass Rose (rings); The Traveler's Pledge (amulet).
The Helltooth starter build will be fairly similar to the leveling and fresh 70 build, keeping its rotation and general strategy with minor adjustments. You will be swapping out Haunt for the Helltooth centerpiece, Wall of Death. Wall of Death is one of the abilities that apply the Necrosis effect of the set, in turn DoTing and slowing enemies from the 2-piece Helltooth bonus and reducing incoming damage by 60% from the 4-piece bonus. More importantly, Wall of Death alone triggers the 6-piece bonus of the set, empowering a good deal of your summons and Mana spenders to a point that will trivialize most in-game difficulties. You have two viable rune choices: Fire Wall will deal the highest damage, which is preferable early on; when you push against your gear's limits, or at any point that you feel lacking Toughness, you can change to the rune Communing with Spirits for another 25% reduction of enemy damage. The other swap in the beginner Helltooth build is in your passives; since the set empowers your Summon Zombie Dogs and Gargantuan more than enough, you will abandon Fetish Sycophants and buff up your active summons with the passive Midnight Feast.
Gargantuan Build — Sacred Harvester and Manajuma's Carving Knife (Ceremonial Knives); Wormwood (staff); Ring of Emptiness, The Short Man's Finger and The Compass Rose (rings); The Traveler's Pledge (amulet); Mask of Jeram (Voodoo Mask); Henri's Perquisition, Manajuma's Gory Fetch and Homunculus (Mojos); The Witching Hour and Goldwrap (belts); Lakumba's Ornament and Nemesis Bracers (bracers).
The Zunimassa starting build is roughly similar to the leveling and Fresh 70 build, but takes into account the Fetish Army-centric nature of the set and leans heavily into the pet strengths of the set bonuses. You will be replacing Summon Zombie Dogs from the leveling spec with Fetish Army Legion of Daggers as early as the 2-piece bonus; this will provide a significantly larger menagerie at your side, and one that is able to dish out more damage overall. With this extra DPS added to the build — and because you will not be needing to keep up massacre DoT streaks from your leveling strats — you will drop Acid Cloud for the grouping tool Piranhas Piranhado. The earlier you learn how to work the only mass displacement in your arsenal, the better — most endgame builds incorporate that skill.
The remaining active skill changes mostly revolve around rune swaps, and you can retain the skills you used from leveling. If survival becomes problematic as you push your early game gear to its limits, you should swap the Haunt rune from Resentful Spirits to Consuming Spirit. In theory, any resource-efficient will fulfill the requirement of the Zunimassa 6-piece, so if you stumble upon Mantle of Channeling, you can also try Firebats Vampire Bats. Soul Harvest can vary between the extra survivability of Languish and the bonus movement speed from Soul to Waste, depending on your needs.
Spirit Walk Severance stays as a solid movement tool. Gargantuan will also remain in the build and will benefit from the Zunimassa bonuses, providing the bulk of your damage. This makes finding or gambling The Short Man's Finger a big priority in the early game.
In the passives, you can stay on Fetish Sycophants for a while, but exchange it for Confidence Ritual as soon as you find a Belt of Transcendence — a common legendary that basically provides a superior, guaranteed proc version of the Fetish passive. You can also stay on Fierce Loyalty for as long as you feel comfortable, but it is likely you will need the extra damage from Midnight Feast until you optimize gear. Spirit Vessel and Grave Injustice are staples in your passive selection, and should not be swapped out.
The build above is specifically created not to require any additional sets or legendary items. In order to transition to a late game-oriented spec using the same set, we have a rough list of high priority items to obtain, as well as a link to the build they pertain to. Note that while the link will take you to a Helltooth set build, it will also work with the Zunimassa's set, albeit with a lower Greater Rift potential.
While Acid Cloud is a respectable nuke, it is not a damage over time effect, and such are required for the Jade set to thrive. Locust Swarm should replace it as one of the two major DoTs that Soul Harvest will consume with the power of the Jade 6 piece set bonus.
Soul Harvest is a centerpiece of the Jade Harvester playstyle and turns from a utility skill into a nuke with the 6 piece set bonus. Note that the leveling rune Vengeful Spirit should be changed to elementally match your Haunt rune; since Resentful Spirits is the most cost efficient rune for starting characters, the recommended rune is the cold Languish.
Continuing the transition from a pet-centric build into a DoT-nuke playstyle, Summon Zombie Dogs will be replaced by Piranhas Piranhado. While it does add a minor DoT of its own, Piranhado is primarily taken to group up monsters and prepare them for a Soul Harvest consumption.
To finalize the transition away from pets, replace Gargantuan with the Jade set staple Horrify. You can choose between the speed-oriented Stalker or the toughness champion Frightening Aspect according to your needs.
Passives: Pet related passives like Fetish Sycophants and Fierce Loyalty should give way to Creeping Death and Confidence Ritual, both of which complement the Jade playstyle perfectly.
Jade Harvester Build — Sacred Harvester (Ceremonial Knife); In-geom (1h sword); Henri's Perquisition and Vile Hive (Mojos); Lakumba's Ornament and Nemesis Bracers (bracers); Haunting Girdle (belt); Ring of Emptiness and The Compass Rose (rings); The Traveler's Pledge (amulet).
This point does not apply in Season 16. Ring of Royal Grandeur is a legendary from Act I caches that reduces the number of set items required for set bonuses by one. While it might not be immediately useful, obtaining powerful bonuses (such as the 4 and 6 piece set bonuses of the Helltooth set) as early as possible for a huge spike in character power is an opportunity you should not pass up. Doing bounties will be inevitable for crafting materials anyway, so optimize your farming time and get this ring as soon as possible.
Illusory Boots are an Act II cache legendary item that removes enemy collision — a staple of support builds in Greater Rifts, as their precise positioning for party-wide buffs and enemy disables dictates the course of Greater Rift progress. Witch Doctors have decent support character potential, with several party-wide damage buffs and plenty of damage reduction to add to the group, making Illusory Boots reasonably attractive to the class.
Gloves of Worship are an Act II cache legendary that extends the duration of Shrines to 10 minutes, a very decent farming effect that is usually stored in Kanai's Cube. The combined power of Empowered Shrines (doubled resource gain, halved cooldowns), Frenzied Shrines (25% Attack Speed) and Fleeting Shrines (25% increase to Movement Speed and 20 yard pickup radius), often refreshing before their 10 minute duration, is a huge buff during normal rifts. Witch Doctors are among the classes that can benefit from Gloves of Worship, as the armor Cube slots of their most common farming specs (usually based around the Manajuma set) are flexible enough to fit the item in.
Envious Blade is an Act II cache dagger with one of the most powerful speedfarming bonuses in the game — a guaranteed Critical Hit against enemies at full health. A well equipped character using this dagger can oneshot entire screens of enemies in a suitable farming difficulty. Since Witch Doctors can not dual wield and their weapon slots are frequently taken by more important legendaries, Envious Blade is not considered a cache priority.
Reaper's Wraps are meant to assist classes and builds with resource management problems. These bracers restore up to 30% of your Mana reserves when you get healed by a health globe — an easy trigger if you keep an eye on the battlefield. Note that these bracers are craftable, and the plan for their creation drops when you kill the Act V boss Malthael on any difficulty. Relying on summons and usually spending less and less Mana the closer they get to endgame, Witch Doctors mostly skip the Reaper's Wraps crutch.
Pride's Fall is a helm obtained through Act III cache bounties, whose legendary effect reduces resource costs by 30% after not taking damage for 5 seconds. Rarely fighting at a range that can abuse this power and never really struggling with Mana, Witch Doctors do not consider farming Pride's Fall a priority.
Manajuma's Way: Manajuma's Carving Knife and Manajuma's Gory Fetch.
The weapon is by far the most impactful item on your damage output, putting a priority on the weapon slot as the first to obtain an ancient item for. Due to its higher bloodshard cost (75 for weapons vs. 25 for armor pieces and offhands), you should delay weapon gambling — avoiding it at the start of character progression and only considering it when you start perfecting your gear. If you simply need a specific weapon, you will get a much better deal with the Upgrade Rare recipe in Kanai's Cube. The Hope of Cain recipe (1 rare item, 25 Death's Breaths, 50 of white, blue and yellow crafting materials) will only produce the type of item you put in (i.e. ceremonial knives), cutting out all other weapons from the RNG pool that you would have to deal with through regular gambling at Kadala. Ceremonial knives are the Witch Doctor-specific one handed weapon you can easily target through upgrading rares, with valuable and build-defining ceremonial knives such as Sacred Harvester, Starmetal Kukri, Manajuma's Carving Knife, The Dagger of Darts and Last Breath. Witch Doctors also have several important staves: Wormwood, Staff of Chiroptera and SuWong Diviner. Other weapons valuable to the Witch Doctor include In-geom, Scrimshaw, Solanium and The Furnace.
Voodoo masks are Witch Doctor-specific headpieces that significantly alter or boost most builds of the class. Due to their cheap gambling price and significant impact, it is highly recommended to gamble on helmets early on. Crucial Witch Doctor Voodoo masks include: Mask of Jeram, The Grin Reaper, Quetzalcoatl and Carnevil. An important cross-class item from the same slot is Leoric's Crown.
Jewelry has a huge influence on your DPS, but similarly to weapons it is expensive to gamble (50 shards for rings, 100 for amulets). When searching for specific jewelry rolls, you should consider upgrading rares instead. Ring of Emptiness warrants a mention before anything else, as it is the highest damage multiplier available to Witch Doctors at the cost of using two skills (core part of many WD builds to begin with); get this ring as soon as possible. All three jewelry sets can be utilized by Witch Doctors, in order of importance: the Endless Walk set, The Compass Rose and The Traveler's Pledge; the Bastions of Will set, Focus and Restraint; and the Legacy of Nightmares set, Litany of the Undaunted and The Wailing Host. Witch Doctors also have powerful summon-oriented jewelry that you have to look out for, especially if you are intending to use the Helltooth Harness set: The Short Man's Finger and The Tall Man's Finger, both of which multiply the efficiency of their dedicated skills. Other situational Witch Doctor jewelry includes Unity, Obsidian Ring of the Zodiac, Oculus Ring, Rechel's Ring of Larceny and Convention of Elements.
Mojos mostly add protective or utility effects, and can be safely gambled for early on due to their low bloodshard price. Offhands with important augmentative effects include Henri's Perquisition, Manajuma's Gory Fetch, Uhkapian Serpent, Thing of the Deep and Homunculus.
Belts are a moderately important slot for Witch Doctors, adding considerable power to the majority of the popular builds. Since they are cheap to gamble, you can sink some amount of bloodshards into the slot if you need to boost your chosen playstyle. The important Witch Doctor-specific belts include: Belt of Transcendence, Haunting Girdle and Bakuli Jungle Wraps, and cross-class belts like The Witching Hour and Goldwrap also warrant mention here.
Similarly to belts, bracers are an inexpensive gambling slot with several important specimens. You will be prioritizing the progression powerhouse Lakumba's Ornament and the speedfarming staple Nemesis Bracers first, but Coils of the First Spider and Jeram's Bracers are also important to their respective playstyles.
Most remaining armor slots only have one or two desirable items for Witch Doctors, and it is preferable to leave them to drop from normal farming instead of wasting shards and materials on the numerous possible duds for the slot. In the long run, you will want to find Aquila Cuirass and Cindercoat (chest pieces); Depth Diggers (pants); Tasker and Theo (gloves); Mantle of Channeling (shoulders); no legendary boots are especially attractive to Witch Doctors.
Bane of the Trapped — staple multiplicative damage increase. The gem triggers upon crowd control (and is self-sufficient in melee range), which the Witch Doctor class excels at with his numerous skill and item-based sources of slows, stuns and disables.
Enforcer is a signature Witch Doctor gem, as the class fulfills the summoner role in Diablo 3. It offers a multiplicative damage increase to your minions, as well as majorly boosting their Toughness (important in Greater Rifts).
Situational gems — Simplicity's Strength is a primary skill empowering gem, strengthening your basic attacks with a multiplicative damage increase and a heal; highly recommended for Poison Dart setups. Esoteric Alteration is sometimes added to close range spellcasting builds (i.e. Jade Harvester setups) to counteract bursty elemental affixes. Gem of Efficacious Toxin and Iceblink are often part of support builds.
Kanai's Cube choices are highly build- and content-specific, making them hard to summarize. Generally speaking, Witch Doctors should store the powers of the following items in the Cube as soon as they have the materials available: Wormwood, The Furnace, Starmetal Kukri, In-geom, Vile Hive, Mask of Jeram, Quetzalcoatl, Carnevil, The Grin Reaper, Nemesis Bracers, Goldwrap, Ring of Emptiness, The Short Man's Finger, Ring of Royal Grandeur (outside of Season 16) and Unity.
29 Jun. 2017: Updated for Season 11.
31 Mar. 2017: Updated the guide with a starter build for the Season 10 free set, Zunimassa's Haunt.
05 Jan. 2016: Updated the guide with a starter build for the Season 9 free set, Jade Harvester.
21 Oct. 2016: Updated the guide with a starter build for the Season 8 free set, Spirit of Arachyr.
31 Jul. 2016: Updated the guide to include leveling, a better fresh 70 setup and Haedrig's Gift use tips.