From 4b9d11fd1ad0f8d7e2bdf688099639bc50d2feb9 Mon Sep 17 00:00:00 2001 From: Kashif Faraz Date: Fri, 18 Oct 2024 12:56:39 +0530 Subject: [PATCH] Website for Druid 31.0.0 RC2 --- 404.html | 10 +-- assets/js/046c719a.2241b764.js | 1 + assets/js/190295b3.3a8aea83.js | 1 + assets/js/2078bf5c.e283fce4.js | 1 + assets/js/8ff86064.225988f1.js | 1 + assets/js/9f3a9cd1.c7edbd8b.js | 1 + assets/js/b48c8f19.13064628.js | 1 + assets/js/b6d922f1.d7b831bc.js | 1 + assets/js/c4f5d8e4.692de4ec.js | 1 + assets/js/d29a09b8.b5a56271.js | 1 + assets/js/main.8da7f295.js | 2 + assets/js/main.8da7f295.js.LICENSE.txt | 70 +++++++++++++++++++ assets/js/runtime~main.3b6f54ab.js | 1 + blog/index.html | 10 +-- community/cla/index.html | 10 +-- community/index.html | 12 ++-- community/join-slack/index.html | 10 +-- .../automatic-compaction-api/index.html | 10 +-- .../data-management-api/index.html | 8 +-- .../dynamic-configuration-api/index.html | 8 +-- docs/31.0.0/api-reference/index.html | 8 +-- .../json-querying-api/index.html | 8 +-- .../legacy-metadata-api/index.html | 8 +-- .../api-reference/lookups-api/index.html | 8 +-- .../retention-rules-api/index.html | 8 +-- .../service-status-api/index.html | 8 +-- docs/31.0.0/api-reference/sql-api/index.html | 8 +-- .../sql-ingestion-api/index.html | 8 +-- docs/31.0.0/api-reference/sql-jdbc/index.html | 8 +-- .../api-reference/supervisor-api/index.html | 8 +-- .../31.0.0/api-reference/tasks-api/index.html | 8 +-- .../druid-vs-elasticsearch/index.html | 8 +-- .../comparisons/druid-vs-key-value/index.html | 8 +-- .../comparisons/druid-vs-kudu/index.html | 8 +-- .../comparisons/druid-vs-redshift/index.html | 8 +-- .../comparisons/druid-vs-spark/index.html | 8 +-- .../druid-vs-sql-on-hadoop/index.html | 8 +-- .../configuration/extensions/index.html | 8 +-- .../human-readable-byte/index.html | 8 +-- docs/31.0.0/configuration/index.html | 10 +-- docs/31.0.0/configuration/logging/index.html | 8 +-- .../automatic-compaction/index.html | 40 +++++------ .../data-management/compaction/index.html | 8 +-- docs/31.0.0/data-management/delete/index.html | 8 +-- docs/31.0.0/data-management/index.html | 8 +-- .../manual-compaction/index.html | 8 +-- .../data-management/schema-changes/index.html | 8 +-- docs/31.0.0/data-management/update/index.html | 8 +-- docs/31.0.0/design/architecture/index.html | 8 +-- docs/31.0.0/design/broker/index.html | 8 +-- docs/31.0.0/design/coordinator/index.html | 8 +-- docs/31.0.0/design/deep-storage/index.html | 8 +-- .../extensions-contrib/dropwizard/index.html | 8 +-- docs/31.0.0/design/historical/index.html | 8 +-- docs/31.0.0/design/index.html | 8 +-- docs/31.0.0/design/indexer/index.html | 8 +-- .../31.0.0/design/indexing-service/index.html | 8 +-- .../31.0.0/design/metadata-storage/index.html | 8 +-- docs/31.0.0/design/middlemanager/index.html | 8 +-- docs/31.0.0/design/overlord/index.html | 8 +-- docs/31.0.0/design/peons/index.html | 8 +-- docs/31.0.0/design/router/index.html | 8 +-- docs/31.0.0/design/segments/index.html | 8 +-- docs/31.0.0/design/storage/index.html | 8 +-- docs/31.0.0/design/zookeeper/index.html | 8 +-- docs/31.0.0/development/build/index.html | 8 +-- .../development/contribute-to-docs/index.html | 8 +-- .../development/experimental/index.html | 8 +-- .../extensions-contrib/aliyun-oss/index.html | 8 +-- .../ambari-metrics-emitter/index.html | 8 +-- .../extensions-contrib/cassandra/index.html | 8 +-- .../extensions-contrib/cloudfiles/index.html | 8 +-- .../compressed-big-decimal/index.html | 8 +-- .../ddsketch-quantiles/index.html | 8 +-- .../extensions-contrib/delta-lake/index.html | 8 +-- .../distinctcount/index.html | 8 +-- .../gce-extensions/index.html | 8 +-- .../extensions-contrib/graphite/index.html | 8 +-- .../extensions-contrib/iceberg/index.html | 8 +-- .../extensions-contrib/influx/index.html | 8 +-- .../influxdb-emitter/index.html | 8 +-- .../extensions-contrib/k8s-jobs/index.html | 8 +-- .../kafka-emitter/index.html | 8 +-- .../materialized-view/index.html | 8 +-- .../momentsketch-quantiles/index.html | 8 +-- .../moving-average-query/index.html | 8 +-- .../opentsdb-emitter/index.html | 8 +-- .../extensions-contrib/prometheus/index.html | 8 +-- .../rabbit-super-stream-injestion/index.html | 8 +-- .../extensions-contrib/redis-cache/index.html | 8 +-- .../spectator-histogram/index.html | 8 +-- .../extensions-contrib/sqlserver/index.html | 8 +-- .../extensions-contrib/statsd/index.html | 8 +-- .../tdigestsketch-quantiles/index.html | 8 +-- .../extensions-contrib/thrift/index.html | 8 +-- .../time-min-max/index.html | 8 +-- .../approximate-histograms/index.html | 8 +-- .../extensions-core/avro/index.html | 8 +-- .../extensions-core/azure/index.html | 8 +-- .../extensions-core/bloom-filter/index.html | 8 +-- .../datasketches-extension/index.html | 8 +-- .../datasketches-hll/index.html | 8 +-- .../datasketches-kll/index.html | 8 +-- .../datasketches-quantiles/index.html | 8 +-- .../datasketches-theta/index.html | 8 +-- .../datasketches-tuple/index.html | 8 +-- .../extensions-core/druid-aws-rds/index.html | 8 +-- .../druid-basic-security/index.html | 8 +-- .../extensions-core/druid-kerberos/index.html | 8 +-- .../extensions-core/druid-lookups/index.html | 8 +-- .../extensions-core/druid-pac4j/index.html | 8 +-- .../druid-ranger-security/index.html | 8 +-- .../extensions-core/examples/index.html | 8 +-- .../extensions-core/google/index.html | 8 +-- .../extensions-core/hdfs/index.html | 8 +-- .../extensions-core/kubernetes/index.html | 8 +-- .../extensions-core/mysql/index.html | 8 +-- .../extensions-core/orc/index.html | 8 +-- .../extensions-core/parquet/index.html | 8 +-- .../extensions-core/postgresql/index.html | 8 +-- .../extensions-core/protobuf/index.html | 8 +-- .../development/extensions-core/s3/index.html | 8 +-- .../simple-client-sslcontext/index.html | 8 +-- .../extensions-core/stats/index.html | 8 +-- .../extensions-core/test-stats/index.html | 8 +-- docs/31.0.0/development/javascript/index.html | 8 +-- docs/31.0.0/development/modules/index.html | 8 +-- docs/31.0.0/development/overview/index.html | 8 +-- docs/31.0.0/development/versioning/index.html | 8 +-- .../concurrent-append-replace/index.html | 10 +-- docs/31.0.0/ingestion/data-formats/index.html | 8 +-- docs/31.0.0/ingestion/faq/index.html | 8 +-- docs/31.0.0/ingestion/hadoop/index.html | 8 +-- docs/31.0.0/ingestion/index.html | 8 +-- .../ingestion/ingestion-spec/index.html | 8 +-- .../31.0.0/ingestion/input-sources/index.html | 8 +-- .../ingestion/kafka-ingestion/index.html | 8 +-- .../ingestion/kinesis-ingestion/index.html | 8 +-- .../native-batch-firehose/index.html | 8 +-- .../native-batch-simple-task/index.html | 8 +-- docs/31.0.0/ingestion/native-batch/index.html | 8 +-- docs/31.0.0/ingestion/partitioning/index.html | 8 +-- docs/31.0.0/ingestion/rollup/index.html | 8 +-- .../31.0.0/ingestion/schema-design/index.html | 8 +-- docs/31.0.0/ingestion/schema-model/index.html | 8 +-- .../ingestion/standalone-realtime/index.html | 8 +-- docs/31.0.0/ingestion/streaming/index.html | 8 +-- docs/31.0.0/ingestion/supervisor/index.html | 14 ++-- docs/31.0.0/ingestion/tasks/index.html | 8 +-- docs/31.0.0/ingestion/tranquility/index.html | 8 +-- docs/31.0.0/misc/papers-and-talks/index.html | 8 +-- .../multi-stage-query/concepts/index.html | 8 +-- .../multi-stage-query/examples/index.html | 8 +-- docs/31.0.0/multi-stage-query/index.html | 8 +-- .../multi-stage-query/known-issues/index.html | 10 +-- .../multi-stage-query/reference/index.html | 8 +-- .../multi-stage-query/security/index.html | 8 +-- docs/31.0.0/operations/alerts/index.html | 8 +-- docs/31.0.0/operations/auth-ldap/index.html | 8 +-- docs/31.0.0/operations/auth/index.html | 8 +-- .../basic-cluster-tuning/index.html | 8 +-- .../clean-metadata-store/index.html | 8 +-- .../deep-storage-migration/index.html | 8 +-- .../31.0.0/operations/dump-segment/index.html | 8 +-- .../operations/durable-storage/index.html | 8 +-- .../dynamic-config-provider/index.html | 8 +-- .../operations/export-metadata/index.html | 8 +-- .../operations/high-availability/index.html | 8 +-- .../operations/http-compression/index.html | 8 +-- .../insert-segment-to-db/index.html | 8 +-- docs/31.0.0/operations/java/index.html | 8 +-- docs/31.0.0/operations/kubernetes/index.html | 8 +-- .../operations/metadata-migration/index.html | 8 +-- docs/31.0.0/operations/metrics/index.html | 8 +-- .../migrate-from-firehose/index.html | 8 +-- .../operations/mixed-workloads/index.html | 8 +-- .../31.0.0/operations/other-hadoop/index.html | 8 +-- .../operations/password-provider/index.html | 8 +-- docs/31.0.0/operations/pull-deps/index.html | 8 +-- .../operations/request-logging/index.html | 8 +-- .../operations/reset-cluster/index.html | 8 +-- .../operations/rolling-updates/index.html | 8 +-- .../operations/rule-configuration/index.html | 8 +-- .../operations/security-overview/index.html | 8 +-- .../operations/security-user-auth/index.html | 8 +-- .../segment-optimization/index.html | 8 +-- .../operations/single-server/index.html | 8 +-- docs/31.0.0/operations/tls-support/index.html | 8 +-- .../use_sbt_to_build_fat_jar/index.html | 8 +-- docs/31.0.0/operations/web-console/index.html | 8 +-- docs/31.0.0/querying/aggregations/index.html | 8 +-- docs/31.0.0/querying/arrays/index.html | 8 +-- docs/31.0.0/querying/caching/index.html | 8 +-- docs/31.0.0/querying/datasource/index.html | 8 +-- .../datasourcemetadataquery/index.html | 8 +-- .../31.0.0/querying/dimensionspecs/index.html | 8 +-- docs/31.0.0/querying/filters/index.html | 8 +-- docs/31.0.0/querying/geo/index.html | 8 +-- docs/31.0.0/querying/granularities/index.html | 8 +-- docs/31.0.0/querying/groupbyquery/index.html | 8 +-- docs/31.0.0/querying/having/index.html | 8 +-- docs/31.0.0/querying/hll-old/index.html | 8 +-- docs/31.0.0/querying/index.html | 8 +-- docs/31.0.0/querying/joins/index.html | 8 +-- .../kafka-extraction-namespace/index.html | 8 +-- docs/31.0.0/querying/limitspec/index.html | 8 +-- .../querying/lookups-cached-global/index.html | 8 +-- docs/31.0.0/querying/lookups/index.html | 8 +-- docs/31.0.0/querying/math-expr/index.html | 8 +-- .../multi-value-dimensions/index.html | 8 +-- docs/31.0.0/querying/multitenancy/index.html | 8 +-- .../31.0.0/querying/nested-columns/index.html | 8 +-- .../querying/post-aggregations/index.html | 8 +-- docs/31.0.0/querying/query-context/index.html | 8 +-- .../querying/query-deep-storage/index.html | 8 +-- .../querying/query-execution/index.html | 8 +-- .../querying/query-processing/index.html | 8 +-- docs/31.0.0/querying/scan-query/index.html | 8 +-- docs/31.0.0/querying/searchquery/index.html | 8 +-- .../querying/segmentmetadataquery/index.html | 8 +-- docs/31.0.0/querying/select-query/index.html | 8 +-- .../31.0.0/querying/sorting-orders/index.html | 8 +-- .../querying/sql-aggregations/index.html | 8 +-- .../querying/sql-array-functions/index.html | 8 +-- .../31.0.0/querying/sql-data-types/index.html | 8 +-- docs/31.0.0/querying/sql-functions/index.html | 8 +-- .../querying/sql-json-functions/index.html | 8 +-- .../querying/sql-metadata-tables/index.html | 8 +-- .../index.html | 8 +-- docs/31.0.0/querying/sql-operators/index.html | 8 +-- .../querying/sql-query-context/index.html | 8 +-- docs/31.0.0/querying/sql-scalar/index.html | 8 +-- .../querying/sql-translation/index.html | 8 +-- .../querying/sql-window-functions/index.html | 8 +-- docs/31.0.0/querying/sql/index.html | 8 +-- .../querying/timeboundaryquery/index.html | 8 +-- .../querying/timeseriesquery/index.html | 8 +-- .../querying/tips-good-queries/index.html | 8 +-- .../31.0.0/querying/topnmetricspec/index.html | 8 +-- docs/31.0.0/querying/topnquery/index.html | 8 +-- .../querying/troubleshooting/index.html | 8 +-- docs/31.0.0/querying/using-caching/index.html | 8 +-- .../querying/virtual-columns/index.html | 8 +-- .../migr-ansi-sql-null/index.html | 8 +-- .../migr-front-coded-dict/index.html | 8 +-- .../release-info/migr-mvd-array/index.html | 8 +-- .../migr-subquery-limit/index.html | 8 +-- .../release-info/migration-guide/index.html | 8 +-- .../release-info/release-notes/index.html | 8 +-- .../release-info/upgrade-notes/index.html | 8 +-- docs/31.0.0/tutorials/cluster/index.html | 8 +-- docs/31.0.0/tutorials/docker/index.html | 8 +-- docs/31.0.0/tutorials/index.html | 8 +-- .../tutorials/tutorial-append-data/index.html | 8 +-- .../tutorial-batch-hadoop/index.html | 8 +-- .../tutorial-batch-native/index.html | 8 +-- .../tutorials/tutorial-batch/index.html | 8 +-- .../tutorials/tutorial-compaction/index.html | 8 +-- .../tutorials/tutorial-delete-data/index.html | 8 +-- .../tutorial-ingestion-spec/index.html | 8 +-- .../31.0.0/tutorials/tutorial-jdbc/index.html | 8 +-- .../tutorials/tutorial-kafka/index.html | 8 +-- .../tutorial-kerberos-hadoop/index.html | 8 +-- .../tutorials/tutorial-latest-by/index.html | 8 +-- .../tutorial-msq-convert-spec/index.html | 8 +-- .../tutorials/tutorial-msq-extern/index.html | 8 +-- .../tutorial-query-deep-storage/index.html | 8 +-- .../tutorials/tutorial-query/index.html | 8 +-- .../tutorials/tutorial-retention/index.html | 8 +-- .../tutorials/tutorial-rollup/index.html | 8 +-- .../tutorial-sketches-theta/index.html | 8 +-- .../tutorials/tutorial-sql-null/index.html | 8 +-- .../tutorial-sql-query-view/index.html | 8 +-- .../tutorials/tutorial-transform/index.html | 8 +-- .../tutorial-unnest-arrays/index.html | 8 +-- .../tutorials/tutorial-update-data/index.html | 8 +-- downloads/index.html | 10 +-- druid-powered/index.html | 10 +-- faq/index.html | 10 +-- index.html | 10 +-- js/version.js | 2 +- libraries/index.html | 10 +-- licensing/index.html | 10 +-- lunr-index-1729235775110.json | 1 + lunr-index.json | 2 +- search-doc-1729235775110.json | 1 + search-doc.json | 2 +- sitemap.xml | 2 +- technology/index.html | 10 +-- use-cases/index.html | 10 +-- 290 files changed, 1213 insertions(+), 1129 deletions(-) create mode 100644 assets/js/046c719a.2241b764.js create mode 100644 assets/js/190295b3.3a8aea83.js create mode 100644 assets/js/2078bf5c.e283fce4.js create mode 100644 assets/js/8ff86064.225988f1.js create mode 100644 assets/js/9f3a9cd1.c7edbd8b.js create mode 100644 assets/js/b48c8f19.13064628.js create mode 100644 assets/js/b6d922f1.d7b831bc.js create mode 100644 assets/js/c4f5d8e4.692de4ec.js create mode 100644 assets/js/d29a09b8.b5a56271.js create mode 100644 assets/js/main.8da7f295.js create mode 100644 assets/js/main.8da7f295.js.LICENSE.txt create mode 100644 assets/js/runtime~main.3b6f54ab.js create mode 100644 lunr-index-1729235775110.json create mode 100644 search-doc-1729235775110.json diff --git a/404.html b/404.html index ebe9225300..6ab1859e29 100644 --- a/404.html +++ b/404.html @@ -14,13 +14,13 @@ - - + +
-
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/assets/js/046c719a.2241b764.js b/assets/js/046c719a.2241b764.js new file mode 100644 index 0000000000..3ca2fa85bd --- /dev/null +++ b/assets/js/046c719a.2241b764.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2511],{14137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),k=o,h=u["".concat(s,".").concat(k)]||u[k]||d[k]||r;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=k;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>p,toc:()=>u});var a=n(87462),o=n(63366),r=(n(67294),n(14137)),i=["components"],l={id:"concurrent-append-replace",title:"Concurrent append and replace"},s=void 0,p={unversionedId:"ingestion/concurrent-append-replace",id:"ingestion/concurrent-append-replace",title:"Concurrent append and replace",description:"\x3c!--",source:"@site/docs/31.0.0/ingestion/concurrent-append-replace.md",sourceDirName:"ingestion",slug:"/ingestion/concurrent-append-replace",permalink:"/docs/31.0.0/ingestion/concurrent-append-replace",draft:!1,tags:[],version:"current",frontMatter:{id:"concurrent-append-replace",title:"Concurrent append and replace"},sidebar:"docs",previous:{title:"Schema design tips",permalink:"/docs/31.0.0/ingestion/schema-design"},next:{title:"Troubleshooting FAQ",permalink:"/docs/31.0.0/ingestion/faq"}},c={},u=[{value:"Update the compaction settings",id:"update-the-compaction-settings",level:2},{value:"Update the compaction settings with the UI",id:"update-the-compaction-settings-with-the-ui",level:3},{value:"Update the compaction settings with the API",id:"update-the-compaction-settings-with-the-api",level:3},{value:"Configure a task lock type for your ingestion job",id:"configure-a-task-lock-type-for-your-ingestion-job",level:2},{value:"Add a task lock using the Druid console",id:"add-a-task-lock-using-the-druid-console",level:3},{value:"Add the task lock through the API",id:"add-the-task-lock-through-the-api",level:3},{value:"Task lock types",id:"task-lock-types",level:2},{value:"Add a task lock type to your ingestion job",id:"add-a-task-lock-type-to-your-ingestion-job",level:4},{value:"Add a task lock using the Druid console",id:"add-a-task-lock-using-the-druid-console-1",level:5},{value:"Add the task lock type through the API",id:"add-the-task-lock-type-through-the-api",level:5}],d={toc:u},k="wrapper";function h(e){var t=e.components,n=(0,o.Z)(e,i);return(0,r.kt)(k,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Concurrent append and replace safely replaces the existing data in an interval of a datasource while new data is being appended to that interval. One of the most common applications of this feature is appending new data (such as with streaming ingestion) to an interval while compaction of that interval is already in progress. Druid segments the data ingested during this time dynamically. The subsequent compaction run segments the data into the granularity you specified."),(0,r.kt)("p",null,"To set up concurrent append and replace, use the context flag ",(0,r.kt)("inlineCode",{parentName:"p"},"useConcurrentLocks"),". Druid will then determine the correct lock type for you, either append or replace. Although you can set the type of lock manually, we don't recommend it. "),(0,r.kt)("h2",{id:"update-the-compaction-settings"},"Update the compaction settings"),(0,r.kt)("p",null,"If you want to append data to a datasource while compaction is running, you need to enable concurrent append and replace for the datasource by updating the compaction settings."),(0,r.kt)("h3",{id:"update-the-compaction-settings-with-the-ui"},"Update the compaction settings with the UI"),(0,r.kt)("p",null,"In the ",(0,r.kt)("strong",{parentName:"p"},"Compaction config")," for a datasource, enable ",(0,r.kt)("strong",{parentName:"p"},"Use concurrent locks (experimental)"),"."),(0,r.kt)("p",null,"For details on accessing the compaction config in the UI, see ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/data-management/automatic-compaction#manage-auto-compaction-using-the-web-console"},"Enable automatic compaction with the web console"),"."),(0,r.kt)("h3",{id:"update-the-compaction-settings-with-the-api"},"Update the compaction settings with the API"),(0,r.kt)("p",null,"Add the ",(0,r.kt)("inlineCode",{parentName:"p"},"taskContext")," like you would any other automatic compaction setting through the API:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},'curl --location --request POST \'http://localhost:8081/druid/coordinator/v1/config/compaction\' \\\n--header \'Content-Type: application/json\' \\\n--data-raw \'{\n "dataSource": "YOUR_DATASOURCE",\n "taskContext": {\n "useConcurrentLocks": true\n }\n}\'\n')),(0,r.kt)("h2",{id:"configure-a-task-lock-type-for-your-ingestion-job"},"Configure a task lock type for your ingestion job"),(0,r.kt)("p",null,"You also need to configure the ingestion job to allow concurrent tasks."),(0,r.kt)("p",null,"You can provide the context parameter like any other parameter for ingestion jobs through the API or the UI."),(0,r.kt)("h3",{id:"add-a-task-lock-using-the-druid-console"},"Add a task lock using the Druid console"),(0,r.kt)("p",null,"As part of the ",(0,r.kt)("strong",{parentName:"p"},"Load data")," wizard for classic batch (JSON-based ingestion) and streaming ingestion, enable the following config on the ",(0,r.kt)("strong",{parentName:"p"},"Publish")," step: ",(0,r.kt)("strong",{parentName:"p"},"Use concurrent locks (experimental)"),"."),(0,r.kt)("h3",{id:"add-the-task-lock-through-the-api"},"Add the task lock through the API"),(0,r.kt)("p",null,"Add the following JSON snippet to your supervisor or ingestion spec if you're using the API:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'"context": {\n "useConcurrentLocks": true\n}\n')),(0,r.kt)("h2",{id:"task-lock-types"},"Task lock types"),(0,r.kt)("p",null,"We recommend that you use the ",(0,r.kt)("inlineCode",{parentName:"p"},"useConcurrentLocks")," context parameter so that Druid automatically determines the task lock types for you. If, for some reason, you need to manually set the task lock types explicitly, you can read more about them in this section."),(0,r.kt)("details",null,(0,r.kt)("summary",null,"Click here to read more about the lock types."),(0,r.kt)("p",null,"Druid uses task locks to make sure that multiple conflicting operations don't happen at once.\nThere are two task lock types: ",(0,r.kt)("inlineCode",{parentName:"p"},"APPEND")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE"),". The type of lock you use is determined by what you're trying to accomplish."),(0,r.kt)("p",null,"When setting task lock types manually, be aware of the following:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The segment granularity of the append task must be equal to or finer than the segment granularity of the replace task."),(0,r.kt)("li",{parentName:"ul"},"Concurrent append and replace fails if the task with ",(0,r.kt)("inlineCode",{parentName:"li"},"APPEND")," lock uses a coarser segment granularity than the task with the ",(0,r.kt)("inlineCode",{parentName:"li"},"REPLACE")," lock. For example, if the ",(0,r.kt)("inlineCode",{parentName:"li"},"APPEND")," task uses a segment granularity of YEAR and the ",(0,r.kt)("inlineCode",{parentName:"li"},"REPLACE")," task uses a segment granularity of MONTH, you should not use concurrent append and replace."),(0,r.kt)("li",{parentName:"ul"},"Only a single task can hold a ",(0,r.kt)("inlineCode",{parentName:"li"},"REPLACE")," lock on a given interval of a datasource."),(0,r.kt)("li",{parentName:"ul"},"Multiple tasks can hold ",(0,r.kt)("inlineCode",{parentName:"li"},"APPEND")," locks on a given interval of a datasource and append data to that interval simultaneously.")),(0,r.kt)("h4",{id:"add-a-task-lock-type-to-your-ingestion-job"},"Add a task lock type to your ingestion job"),(0,r.kt)("p",null,"You configure the task lock type for your ingestion job as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"For streaming jobs, the ",(0,r.kt)("inlineCode",{parentName:"li"},"taskLockType")," context parameter goes in your supervisor spec, and the lock type is always ",(0,r.kt)("inlineCode",{parentName:"li"},"APPEND"),"."),(0,r.kt)("li",{parentName:"ul"},"For classic JSON-based batch ingestion, the ",(0,r.kt)("inlineCode",{parentName:"li"},"taskLockType")," context parameter goes in your ingestion spec, and the lock type can be either ",(0,r.kt)("inlineCode",{parentName:"li"},"APPEND")," or ",(0,r.kt)("inlineCode",{parentName:"li"},"REPLACE"),". ")),(0,r.kt)("p",null,"You can provide the context parameter through the API like any other parameter for ingestion job or through the UI."),(0,r.kt)("h5",{id:"add-a-task-lock-using-the-druid-console-1"},"Add a task lock using the Druid console"),(0,r.kt)("p",null,"As part of the ",(0,r.kt)("strong",{parentName:"p"},"Load data")," wizard for classic batch (JSON-based ingestion) and streaming ingestion, you can configure the task lock type for the ingestion during the ",(0,r.kt)("strong",{parentName:"p"},"Publish")," step:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"If you set ",(0,r.kt)("strong",{parentName:"li"},"Append to existing")," to ",(0,r.kt)("strong",{parentName:"li"},"True"),", you can then set ",(0,r.kt)("strong",{parentName:"li"},"Allow concurrent append tasks (experimental)")," to ",(0,r.kt)("strong",{parentName:"li"},"True"),"."),(0,r.kt)("li",{parentName:"ul"},"If you set ",(0,r.kt)("strong",{parentName:"li"},"Append to existing")," to ",(0,r.kt)("strong",{parentName:"li"},"False"),", you can then set ",(0,r.kt)("strong",{parentName:"li"},"Allow concurrent replace tasks (experimental)")," to ",(0,r.kt)("strong",{parentName:"li"},"True"),".")),(0,r.kt)("h5",{id:"add-the-task-lock-type-through-the-api"},"Add the task lock type through the API"),(0,r.kt)("p",null,"Add the following JSON snippet to your supervisor or ingestion spec if you're using the API:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'"context": {\n "taskLockType": LOCK_TYPE\n} \n')),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"LOCK_TYPE")," depends on what you're trying to accomplish."),(0,r.kt)("p",null,"Set ",(0,r.kt)("inlineCode",{parentName:"p"},"taskLockType")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"APPEND")," if either of the following are true:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Dynamic partitioning with append to existing is set to ",(0,r.kt)("inlineCode",{parentName:"li"},"true")),(0,r.kt)("li",{parentName:"ul"},"The ingestion job is a streaming ingestion job")),(0,r.kt)("p",null,"If you have multiple ingestion jobs that append all targeting the same datasource and want them to run simultaneously, you need to also include the following context parameter:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'"useSharedLock": "true"\n')),(0,r.kt)("p",null,"Keep in mind that ",(0,r.kt)("inlineCode",{parentName:"p"},"taskLockType")," takes precedence over ",(0,r.kt)("inlineCode",{parentName:"p"},"useSharedLock"),". Do not use ",(0,r.kt)("inlineCode",{parentName:"p"},"useSharedLock")," with ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE")," task locks."),(0,r.kt)("p",null,"Set ",(0,r.kt)("inlineCode",{parentName:"p"},"taskLockType")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE")," if you're replacing data. For example, if you use any of the following partitioning types, use ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"hash partitioning "),(0,r.kt)("li",{parentName:"ul"},"range partitioning"),(0,r.kt)("li",{parentName:"ul"},"dynamic partitioning with append to existing set to ",(0,r.kt)("inlineCode",{parentName:"li"},"false")))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/190295b3.3a8aea83.js b/assets/js/190295b3.3a8aea83.js new file mode 100644 index 0000000000..da9f1619eb --- /dev/null +++ b/assets/js/190295b3.3a8aea83.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[879],{14137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(n),d=i,k=m["".concat(s,".").concat(d)]||m[d]||c[d]||r;return n?a.createElement(k,o(o({ref:t},u),{},{components:n})):a.createElement(k,o({ref:t},u))}));function k(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:i,o[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>m});var a=n(87462),i=n(63366),r=(n(67294),n(14137)),o=["components"],l={id:"known-issues",title:"SQL-based ingestion known issues",sidebar_label:"Known issues"},s=void 0,p={unversionedId:"multi-stage-query/known-issues",id:"multi-stage-query/known-issues",title:"SQL-based ingestion known issues",description:"\x3c!--",source:"@site/docs/31.0.0/multi-stage-query/known-issues.md",sourceDirName:"multi-stage-query",slug:"/multi-stage-query/known-issues",permalink:"/docs/31.0.0/multi-stage-query/known-issues",draft:!1,tags:[],version:"current",frontMatter:{id:"known-issues",title:"SQL-based ingestion known issues",sidebar_label:"Known issues"},sidebar:"docs",previous:{title:"Reference",permalink:"/docs/31.0.0/multi-stage-query/reference"},next:{title:"Streaming ingestion",permalink:"/docs/31.0.0/ingestion/streaming"}},u={},m=[{value:"Multi-stage query task runtime",id:"multi-stage-query-task-runtime",level:2},{value:"SELECT Statement",id:"select-statement",level:2},{value:"INSERT and REPLACE Statements",id:"insert-and-replace-statements",level:2},{value:"EXTERN Function",id:"extern-function",level:2},{value:"WINDOW Function",id:"window-function",level:2},{value:"Automatic compaction",id:"automatic-compaction",level:2}],c={toc:m},d="wrapper";function k(e){var t=e.components,n=(0,i.Z)(e,o);return(0,r.kt)(d,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"}," This page describes SQL-based batch ingestion using the ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/multi-stage-query/"},(0,r.kt)("inlineCode",{parentName:"a"},"druid-multi-stage-query")),"\nextension, new in Druid 24.0. Refer to the ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/#batch"},"ingestion methods")," table to determine which\ningestion method is right for you.")),(0,r.kt)("h2",{id:"multi-stage-query-task-runtime"},"Multi-stage query task runtime"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Fault tolerance is partially implemented. Workers get relaunched when they are killed unexpectedly. The controller does not get relaunched if it is killed unexpectedly.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Worker task stage outputs are stored in the working directory given by ",(0,r.kt)("inlineCode",{parentName:"p"},"druid.indexer.task.baseDir"),". Stages that\ngenerate a large amount of output data may exhaust all available disk space. In this case, the query fails with\nan ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/multi-stage-query/reference#error_UnknownError"},"UnknownError"),' with a message including "No space left on device".'))),(0,r.kt)("h2",{id:"select-statement"},(0,r.kt)("inlineCode",{parentName:"h2"},"SELECT")," Statement"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"GROUPING SETS")," are not implemented. Queries using these features return a\n",(0,r.kt)("a",{parentName:"li",href:"/docs/31.0.0/multi-stage-query/reference#error_QueryNotSupported"},"QueryNotSupported")," error.")),(0,r.kt)("h2",{id:"insert-and-replace-statements"},(0,r.kt)("inlineCode",{parentName:"h2"},"INSERT")," and ",(0,r.kt)("inlineCode",{parentName:"h2"},"REPLACE")," Statements"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE")," statements with column lists, like ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT INTO tbl (a, b, c) SELECT ..."),", is not implemented.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"INSERT ... SELECT")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE ... SELECT")," insert columns from the ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT")," statement based on column name. This\ndiffers from SQL standard behavior, where columns are inserted based on position.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"INSERT")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE")," do not support all options available in ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/ingestion-spec"},"ingestion specs"),",\nincluding the ",(0,r.kt)("inlineCode",{parentName:"p"},"createBitmapIndex")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"multiValueHandling")," ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/ingestion-spec#dimension-objects"},"dimension"),"\nproperties, and the ",(0,r.kt)("inlineCode",{parentName:"p"},"indexSpec")," ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/ingestion-spec#tuningconfig"},(0,r.kt)("inlineCode",{parentName:"a"},"tuningConfig"))," property."))),(0,r.kt)("h2",{id:"extern-function"},(0,r.kt)("inlineCode",{parentName:"h2"},"EXTERN")," Function"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/ingestion-spec#inclusions-and-exclusions"},"schemaless dimensions"),"\nfeature is not available. All columns and their types must be specified explicitly using the ",(0,r.kt)("inlineCode",{parentName:"p"},"signature")," parameter\nof the ",(0,r.kt)("a",{parentName:"p",href:"/docs/31.0.0/multi-stage-query/reference#extern-function"},(0,r.kt)("inlineCode",{parentName:"a"},"EXTERN")," function"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"EXTERN")," with input sources that match large numbers of files may exhaust available memory on the controller task.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"EXTERN")," refers to external files. Use ",(0,r.kt)("inlineCode",{parentName:"p"},"FROM")," to access ",(0,r.kt)("inlineCode",{parentName:"p"},"druid")," input sources."))),(0,r.kt)("h2",{id:"window-function"},(0,r.kt)("inlineCode",{parentName:"h2"},"WINDOW")," Function"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The maximum number of elements in a window cannot exceed a value of 100,000. "),(0,r.kt)("li",{parentName:"ul"},"To avoid ",(0,r.kt)("inlineCode",{parentName:"li"},"leafOperators")," in MSQ engine, window functions have an extra scan stage after the window stage for cases\nwhere native engine has a non-empty ",(0,r.kt)("inlineCode",{parentName:"li"},"leafOperator"),".")),(0,r.kt)("h2",{id:"automatic-compaction"},"Automatic compaction"),(0,r.kt)("p",null,"The following known issues and limitations affect automatic compaction with the MSQ task engine:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"metricSpec")," field is only supported for certain aggregators. For more information, see ",(0,r.kt)("a",{parentName:"li",href:"/docs/31.0.0/data-management/automatic-compaction#supported-aggregators"},"Supported aggregators"),"."),(0,r.kt)("li",{parentName:"ul"},"Only dynamic and range-based partitioning are supported."),(0,r.kt)("li",{parentName:"ul"},"Set ",(0,r.kt)("inlineCode",{parentName:"li"},"rollup")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"true")," if and only if ",(0,r.kt)("inlineCode",{parentName:"li"},"metricSpec")," is not empty or null."),(0,r.kt)("li",{parentName:"ul"},"You can only partition on string dimensions. However, multi-valued string dimensions are not supported."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"maxTotalRows")," config is not supported in ",(0,r.kt)("inlineCode",{parentName:"li"},"DynamicPartitionsSpec"),". Use ",(0,r.kt)("inlineCode",{parentName:"li"},"maxRowsPerSegment")," instead."),(0,r.kt)("li",{parentName:"ul"},"Segments can only be sorted on ",(0,r.kt)("inlineCode",{parentName:"li"},"__time")," as the first column.")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2078bf5c.e283fce4.js b/assets/js/2078bf5c.e283fce4.js new file mode 100644 index 0000000000..6fb82de629 --- /dev/null +++ b/assets/js/2078bf5c.e283fce4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4598],{14137:(t,e,a)=>{a.d(e,{Zo:()=>s,kt:()=>c});var r=a(67294);function n(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function l(t){for(var e=1;e=0||(n[a]=t[a]);return n}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(n[a]=t[a])}return n}var p=r.createContext({}),m=function(t){var e=r.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},s=function(t){var e=m(t.components);return r.createElement(p.Provider,{value:e},t.children)},h="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},d=r.forwardRef((function(t,e){var a=t.components,n=t.mdxType,i=t.originalType,p=t.parentName,s=o(t,["components","mdxType","originalType","parentName"]),h=m(a),d=n,c=h["".concat(p,".").concat(d)]||h[d]||u[d]||i;return a?r.createElement(c,l(l({ref:e},s),{},{components:a})):r.createElement(c,l({ref:e},s))}));function c(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var i=a.length,l=new Array(i);l[0]=d;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[h]="string"==typeof t?t:n,l[1]=o;for(var m=2;m{a.r(e),a.d(e,{contentTitle:()=>p,default:()=>d,frontMatter:()=>o,metadata:()=>m,toc:()=>s});var r=a(87462),n=a(63366),i=(a(67294),a(14137)),l=["components"],o={title:"Apache Druid Community",sectionid:"community",layout:"simple_page",canonical:"https://druid.apache.org/community/"},p=void 0,m={type:"mdx",permalink:"/community/",source:"@site/src/pages/community/index.mdx",title:"Apache Druid Community",description:"Community",frontMatter:{title:"Apache Druid Community",sectionid:"community",layout:"simple_page",canonical:"https://druid.apache.org/community/"}},s=[{value:"Community",id:"community",level:2},{value:"Getting help",id:"getting-help",level:2},{value:"Contributing",id:"contributing",level:2},{value:"What to work on",id:"what-to-work-on",level:3},{value:"Getting your changes accepted",id:"getting-your-changes-accepted",level:3},{value:"Testing",id:"testing",level:3},{value:"Committers",id:"committers",level:3},{value:"Becoming a committer",id:"becoming-a-committer",level:3},{value:"General committer guidelines",id:"general-committer-guidelines",level:3},{value:"Governance",id:"governance",level:2}],h={toc:s},u="wrapper";function d(t){var e=t.components,a=(0,n.Z)(t,l);return(0,i.kt)(u,(0,r.Z)({},h,a,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"community"},"Community"),(0,i.kt)("p",null,"Most discussion about Druid happens over ",(0,i.kt)("a",{parentName:"p",href:"/community/join-slack?v=1"},"Slack"),", ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/apache/druid"},"GitHub"),", and the ",(0,i.kt)("a",{parentName:"p",href:"https://lists.apache.org/list.html?dev@druid.apache.org"},"Apache Dev list"),", but those aren't the only way to interact with the Druid\ncommunity. We also do chat, meetups, and more."),(0,i.kt)("p",null,"Check out the following resources if you're looking for help, to discuss Druid development, or just stay up to date:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Slack:")," Many users and committers are present on Apache Druid Slack. Use this link to join and invite others: ",(0,i.kt)("a",{parentName:"li",href:"/community/join-slack?v=1"},"https://druid.apache.org/community/join-slack"),". This is the perfect place to ask for help if you need it!"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"GitHub:")," Star us at ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/apache/druid"},"apache/druid")," and use this to follow Druid development, raise\nissues, or contribute pull requests. If you're interested in development, please see the ",(0,i.kt)("a",{parentName:"li",href:"#contributing"},"Contributing"),"\nsection below for details on our development process."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Development mailing list:")," ",(0,i.kt)("a",{parentName:"li",href:"https://lists.apache.org/list.html?dev@druid.apache.org"},"dev@druid.apache.org")," for\ndiscussion about project development. To join, send an email ",(0,i.kt)("inlineCode",{parentName:"li"},"dev-subscribe@druid.apache.org"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Twitter:")," Follow us on Twitter at ",(0,i.kt)("a",{parentName:"li",href:"https://twitter.com/druidio"},"@druidio"),".")),(0,i.kt)("p",null,"Also check out:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"User mailing list:")," ",(0,i.kt)("a",{parentName:"li",href:"https://groups.google.com/forum/#!forum/druid-user"},"druid-user@googlegroups.com")," for general\ndiscussion, questions, and announcements."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"LinkedIn")," Connect with other Apache Druid professionals in the ",(0,i.kt)("a",{parentName:"li",href:"https://www.linkedin.com/groups/8791983/"},"LinkedIn group"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Meetups:")," Check out ",(0,i.kt)("a",{parentName:"li",href:"https://www.meetup.com/topics/apache-druid/"},"Apache Druid on meetup.com")," for links to regular\nmeetups in cities all over the world."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"StackOverflow:")," While the user mailing list is the primary resource for asking questions, if you prefer\nStackOverflow, make sure to tag your question with ",(0,i.kt)("inlineCode",{parentName:"li"},"druid")," or ",(0,i.kt)("inlineCode",{parentName:"li"},"apache-druid"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Linen:")," Check out the ",(0,i.kt)("a",{parentName:"li",href:"https://www.linen.dev/s/apache-druid/c/troubleshooting"},"Apache Druid community on Linen")," for a digital archive of Apache Druid Slack threads.\nWhile Slack limits message history to the last 90 days, you can continue to access older threads on Linen."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Struct:")," Check out ",(0,i.kt)("a",{parentName:"li",href:"https://druid.struct.ai/kb"},"Apache Druid on Struct")," for AI-generated knowledge base from Apache Druid Slack threads.\nSimilar to Linen, Struct archives Slack threads so that you can continue to access messages beyond Slack's 90 day retention period.")),(0,i.kt)("h2",{id:"getting-help"},"Getting help"),(0,i.kt)("p",null,"The best place to get a wide variety of help about Druid is via ",(0,i.kt)("inlineCode",{parentName:"p"},"#druid")," on the Apache Slack team. There is also a druid user\ngoogle group ",(0,i.kt)("a",{parentName:"p",href:"https://groups.google.com/forum/#!forum/druid-user"},"druid-user@googlegroups.com")," however slack is the preferred way to get help. You can also report issues and problems, or suggest\nnew features, on ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/apache/druid"},"GitHub"),"."),(0,i.kt)("p",null,"Third party companies also provide commercial support and services for Druid, including:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.cloudera.com/"},"Cloudera")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://datumo.io/"},"Datumo")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.deep.bi/solutions/apache-druid"},"Deep.BI")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://imply.io/"},"Imply")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.rilldata.com/"},"Rill Data"))),(0,i.kt)("h2",{id:"contributing"},"Contributing"),(0,i.kt)("p",null,"Druid is a community-led project and we are delighted to receive contributions\nof anything from minor fixes to big new features."),(0,i.kt)("h3",{id:"what-to-work-on"},"What to work on"),(0,i.kt)("p",null,"If you have an itch to scratch, then by all means do that! Fixing bugs you run\ninto, or adding features you need, are both immensely helpful."),(0,i.kt)("p",null,"If you're looking for some starter projects, we maintain a ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/apache/druid/issues?q=is%3Aopen+is%3Aissue+label%3AStarter"},"list of issues")," suitable\nfor new developers."),(0,i.kt)("p",null,"There are plenty of ways to help outside writing Druid code. ",(0,i.kt)("em",{parentName:"p"},"Code review of pull requests"),"\n(even if you are not a committer), feature suggestions, reporting bugs, ",(0,i.kt)("a",{parentName:"p",href:"/docs/latest/design"},"documentation"),"\nand usability feedback all matter immensely. Another big way to help is\nthrough ",(0,i.kt)("a",{parentName:"p",href:"../libraries"},"client libraries"),", which are\navailable in a variety of languages. If you develop a new one, we'll be happy\nto include it in the list."),(0,i.kt)("h3",{id:"getting-your-changes-accepted"},"Getting your changes accepted"),(0,i.kt)("p",null,"Patches to Druid are done through ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/apache/druid/pulls"},"GitHub pull requests"),"."),(0,i.kt)("p",null,"Pull requests require one approval (+1) from an established committer on code and text (for documentation) levels. The\nexception is major architectural changes or API changes, and/or changes to"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"HTTP requests and responses (e. g. a new HTTP endpoint)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/latest/development/modules"},"Interfaces for extensions")),(0,i.kt)("li",{parentName:"ul"},"Server configuration (e. g. altering the behavior of a config property)"),(0,i.kt)("li",{parentName:"ul"},"Emitted metrics"),(0,i.kt)("li",{parentName:"ul"},"Other major changes, judged by the discretion of Druid committers")),(0,i.kt)("p",null,"warrant additional design and compatibility review. Such pull requests require design approvals from three different\ncommitters (one of them could also be the author of the pull request). For those, it can help to discuss things\non the Druid development list ",(0,i.kt)("a",{parentName:"p",href:"https://lists.apache.org/list.html?dev@druid.apache.org"},"dev@druid.apache.org")," or a github issue beforehand."),(0,i.kt)("p",null,"In general please follow the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/apache/druid/blob/master/CONTRIBUTING.md"},"contributing guidelines"),"\nwhen sending in pull requests. This will help review proceed as quickly as\npossible."),(0,i.kt)("h3",{id:"testing"},"Testing"),(0,i.kt)("p",null,"All Pull Requests are automatically tested through ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/apache/druid/actions"},"GitHub Actions")," on both AMD64 and ARM64 architectures."),(0,i.kt)("h3",{id:"committers"},"Committers"),(0,i.kt)("p",null,"Committers are collectively responsible for Druid's technical management. This involves\nsetting the direction of the project, contributing code, and reviewing code contributed\nby others."),(0,i.kt)("p",null,"You don't need to be a committer to contribute- pull requests are welcome from anyone."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Name"),(0,i.kt)("th",{parentName:"tr",align:null},"Organization"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/abhishekagarwal87"},"Abhishek Agarwal")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/AlexanderSaydakov"},"Alexander Saydakov")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.verizonmedia.com/"},"Verizon Media"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/AmatyaAvadhanula"},"Amatya Avadhanula")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/a2l007"},"Atul Mohan")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.apple.com"},"Apple"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/317brian"},"Brian Le")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/asdf2014"},"Benedict Jin")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.alibaba.com/"},"Alibaba"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/drcrallen"},"Charles Allen")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.snap.com/en-US/"},"Snap"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/techdocsmith"},"Charles Smith")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/ccaominh"},"Chi Cao Minh")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/clintropolis"},"Clint Wylie")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/glasser"},"David Glasser")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://apollographql.com/"},"Apollo GraphQL"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/dclim"},"David Lim")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/gaodayue"},"Daoyue Gao")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"http://www.meituan.com/"},"Meituan"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/Dylan1312"},"Dylan Wylie")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.spotx.tv/"},"SpotX"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/egor-ryashin"},"Egor Rashin")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.rilldata.com/"},"Rill Data"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/cheddar"},"Eric Tschetter")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.splunk.com/"},"Splunk"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/fjy"},"Fangjin Yang")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/Fokko"},"Fokko Driesprong")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://godatadriven.com/"},"GoDataDriven"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/FrankChen021"},"Frank Chen")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://shopee.sg/"},"Shopee"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/kamaci"},"Furkan Kamaci")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://lagom.ai/"},"Lagom"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/gianm"},"Gian Merlino")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/himanshug"},"Himanshu Gupta")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.splunk.com/"},"Splunk"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/jihoonson"},"Jihoon Son")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/jon-wei"},"Jonathan Wei")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/julianhyde"},"Julian Hyde")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://looker.com/"},"Looker"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/junrao"},"Jun Rao")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.confluent.io/"},"Confluent"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/kaijianding"},"Kaijian Ding")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.alibaba.com/"},"Alibaba"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/cryptoe"},"Karan Kumar")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/kfaraz"},"Kashif Faraz")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/kurtyoung"},"Kurt Young")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.alibaba.com/"},"Alibaba"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/LakshSingla"},"Laksh Singla")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/binlijin"},"Lijin Bin")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.alibaba.com/"},"Alibaba"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/capistrant"},"Lucas Capistrant")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.target.com/"},"Target"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/mcbrewster"},"Maggie Brewster")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/mistercrunch"},"Maxime Beauchemin")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"http://preset.io/"},"Preset"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/maytasm"},"Maytas Monsereenusorn")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.netflix.com/"},"Netflix"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/michaelschiff"},"Michael Schiff")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.adobe.com/"},"Adobe"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/QiuMM"},"Mingming Qiu")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://bytedance.com/"},"Bytedance"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/b-slim"},"Mohamed Slim Bouguerra")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.linkedin.com/"},"LinkedIn"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/navis"},"Navis Ryu")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.sktelecom.com/index.html"},"SK Telecom"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/niketh"},"Niketh Sabbineni")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.verizonmedia.com/"},"Verizon Media"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/nishantmonu51"},"Nishant Bangarwa")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.rilldata.com/"},"Rill Data"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/pjain1"},"Parag Jain")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.rilldata.com/"},"Rill Data"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/ptgoetz"},"P. Taylor Goetz")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.epam.com/"},"EPAM"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/paul-rogers"},"Paul Rogers")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/rohangarg"},"Rohan Garg")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/leventov"},"Roman Leventov")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.snap.com/en-US/"},"Snap"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/samarthjain"},"Samarth Jain")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.netflix.com/"},"Netflix"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/sthetland"},"Steve Hetland")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/suneet-s"},"Suneet Saldanha")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/surekhasaharan"},"Surekha Saharan")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/tejaswini-imply"},"Tejaswini Bandlamudi")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/vogievetsky"},"Vadim Ogievetsky")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/vtlim"},"Victoria Lim")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/xvrl"},"Xavier L\xe9aut\xe9")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.confluent.io/"},"Confluent"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/zhangxinyu1"},"Xinyu Zhang")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.360.cn/"},"Qihoo 360"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/zhangyue19921010"},"Yue Zhang")),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/zachjsh"},"Zach Sherman")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://imply.io/"},"Imply"))))),(0,i.kt)("h3",{id:"becoming-a-committer"},"Becoming a committer"),(0,i.kt)("p",null,"If you'd like to become a committer, that's great! Please contact one of the\nexisting committers for a walk through the process. Basically, what we're\nlooking for is an interest in ongoing contributions to Druid."),(0,i.kt)("h3",{id:"general-committer-guidelines"},"General committer guidelines"),(0,i.kt)("p",null,"If you are an official Druid committer then congratulations! You are part of a fantastic group of people. Here are some guidelines to follow to help ensure the Druid project continues to grow and improve:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},'You can merge your own pull request if it fits the rest of the criteria. A common thing to see is "+1 after travis" from other committers.'),(0,i.kt)("li",{parentName:"ol"},'A pull request should have at least one +1 from a committer who is not the author, on the "code/textual" level of review.'),(0,i.kt)("li",{parentName:"ol"},"Pull requests which have just one +1 from a committer couldn't be merged earlier than after 3 working days since PR submission."),(0,i.kt)("li",{parentName:"ol"},"A pull request with just one +1 could be merged only by (or in coordination with) the committer who provided the review. Because the reviewer may think that the PR is complex or risky enough that needs another pair of eyes to look at it. If this is the case, the first reviewer should indicate this in the PR approval message."),(0,i.kt)("li",{parentName:"ol"},"If a pull request has two or more +1's from committers who are not the author, it could be merged immediately and by any committer. But still, enough time since the PR submission should pass to give folks a reasonable chance to indicate a desire to comment on the pull request. AKA: don't merge a pull request that was submitted Friday evening until at least 1~2 regular work days have passed. Use good judgement here."),(0,i.kt)("li",{parentName:"ol"},"Major architectural and backwards incompatible changes, or changes which have long-term maintenance consequences (see examples in ",(0,i.kt)("a",{parentName:"li",href:"#getting-your-changes-accepted"},'the "Getting your changes accepted" section above'),'), should have at least three +1\'s from committers, on the "design" level of review. One approval could be from the author of the PR. The first committer who indicates that a PR needs design review should add the ',(0,i.kt)("inlineCode",{parentName:"li"},"Design Review")," tag to such a pull request."),(0,i.kt)("li",{parentName:"ol"},"Travis-CI should pass or have some ",(0,i.kt)("strong",{parentName:"li"},"very")," good reason why it won't pass for a pull request."),(0,i.kt)("li",{parentName:"ol"},"You reasonably believe that all comments have been addressed."),(0,i.kt)("li",{parentName:"ol"},"You are expected to be the champion for your own pull requests."),(0,i.kt)("li",{parentName:"ol"},"Being a champion on a pull request can be a significant undertaking depending on the size of the code change and what parts of the code it touches. It may require communicating with other developers, reconciling differences, organizing community feedback, and/or following up with people who have commented in a pull request to ensure comments have been addressed."),(0,i.kt)("li",{parentName:"ol"},"Sometimes code is presented as a work-in-progress or as a point of discussion. Use the ",(0,i.kt)("inlineCode",{parentName:"li"},"WIP")," or ",(0,i.kt)("inlineCode",{parentName:"li"},"Discuss")," tags on a pull request in such a case."),(0,i.kt)("li",{parentName:"ol"},"If a pull request you are championing is taking longer than expected to merge, be sure to raise the issue in the developer sync."),(0,i.kt)("li",{parentName:"ol"},"Limit the number of pull requests you are championing at the same time."),(0,i.kt)("li",{parentName:"ol"},"Prioritize code reviews to look at pull requests that are blockers for the next release (see the Milestone marker on the pull request)"),(0,i.kt)("li",{parentName:"ol"},"Help serve as champion for pull requests that originate from new committers."),(0,i.kt)("li",{parentName:"ol"},"If you feel a pull request is required for the next release, mark it as such in the Milestone of the pull request."),(0,i.kt)("li",{parentName:"ol"},"Do not comment on a pull request unless you are willing to follow up on the edits."),(0,i.kt)("li",{parentName:"ol"},"Give priority to getting older pull requests merged. (Either as their champion or as an active commenter)"),(0,i.kt)("li",{parentName:"ol"},"And most importantly.. the PMC desires to ensure a positive and effective developer experience! If you find that things are not functioning to your expectations, please raise the issue.")),(0,i.kt)("p",null,"Remember, we all want to see this project thrive!"),(0,i.kt)("h2",{id:"governance"},"Governance"),(0,i.kt)("p",null,"The PMC (Project Management Committee) is responsible for the administrative\naspects of the Druid project. The responsibilities of the PMC include:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Approving releases"),(0,i.kt)("li",{parentName:"ul"},"Nominating new committers"),(0,i.kt)("li",{parentName:"ul"},"Maintaining the project's shared resources, including the github account,\nmailing lists, websites, social media channels, etc."),(0,i.kt)("li",{parentName:"ul"},"Maintaining guidelines for the project")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8ff86064.225988f1.js b/assets/js/8ff86064.225988f1.js new file mode 100644 index 0000000000..02741a726f --- /dev/null +++ b/assets/js/8ff86064.225988f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2091],{14137:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>g});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=p(n),k=r,g=u["".concat(l,".").concat(k)]||u[k]||m[k]||i;return n?a.createElement(g,s(s({ref:t},d),{},{components:n})):a.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,s=new Array(i);s[0]=k;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:r,s[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>g,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var a=n(87462),r=n(63366),i=(n(67294),n(14137)),s=["components"],o={id:"supervisor",title:"Supervisor",sidebar_label:"Supervisor"},l=void 0,p={unversionedId:"ingestion/supervisor",id:"ingestion/supervisor",title:"Supervisor",description:"\x3c!--",source:"@site/docs/31.0.0/ingestion/supervisor.md",sourceDirName:"ingestion",slug:"/ingestion/supervisor",permalink:"/docs/31.0.0/ingestion/supervisor",draft:!1,tags:[],version:"current",frontMatter:{id:"supervisor",title:"Supervisor",sidebar_label:"Supervisor"},sidebar:"docs",previous:{title:"Streaming ingestion",permalink:"/docs/31.0.0/ingestion/streaming"},next:{title:"Apache Kafka ingestion",permalink:"/docs/31.0.0/ingestion/kafka-ingestion"}},d={},u=[{value:"Supervisor spec",id:"supervisor-spec",level:2},{value:"I/O configuration",id:"io-configuration",level:3},{value:"Task autoscaler",id:"task-autoscaler",level:4},{value:"Autoscaler strategy",id:"autoscaler-strategy",level:5},{value:"Tuning configuration",id:"tuning-configuration",level:3},{value:"Start a supervisor",id:"start-a-supervisor",level:2},{value:"Schema and configuration changes",id:"schema-and-configuration-changes",level:3},{value:"Status report",id:"status-report",level:2},{value:"SUPERVISORS system table",id:"supervisors-system-table",level:2},{value:"Manage a supervisor",id:"manage-a-supervisor",level:2},{value:"Suspend",id:"suspend",level:3},{value:"Set offsets",id:"set-offsets",level:3},{value:"Hard reset",id:"hard-reset",level:3},{value:"Terminate",id:"terminate",level:3},{value:"Capacity planning",id:"capacity-planning",level:2},{value:"Learn more",id:"learn-more",level:2}],m={toc:u},k="wrapper";function g(e){var t=e.components,o=(0,r.Z)(e,s);return(0,i.kt)(k,(0,a.Z)({},m,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Apache Druid uses supervisors to manage streaming ingestion from external streaming sources into Druid.\nSupervisors oversee the state of indexing tasks to coordinate handoffs, manage failures, and ensure that the scalability and replication requirements are maintained. They can also be used to perform ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/data-management/automatic-compaction"},"automatic compaction")," after data has been ingested."),(0,i.kt)("p",null,"This topic uses the Apache Kafka term offset to refer to the identifier for records in a partition. If you are using Amazon Kinesis, the equivalent is sequence number."),(0,i.kt)("h2",{id:"supervisor-spec"},"Supervisor spec"),(0,i.kt)("p",null,"Druid uses a JSON specification, often referred to as the supervisor spec, to define tasks used for streaming ingestion or auto-compaction.\nThe supervisor spec specifies how Druid should consume, process, and index data from an external stream or Druid itself."),(0,i.kt)("p",null,"The following table outlines the high-level configuration options for a supervisor spec:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Type"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor type. For streaming ingestion, this can be either ",(0,i.kt)("inlineCode",{parentName:"td"},"kafka"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"kinesis"),", or ",(0,i.kt)("inlineCode",{parentName:"td"},"rabbit"),". For automatic compaction, set the type to ",(0,i.kt)("inlineCode",{parentName:"td"},"autocompact"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"spec")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"The container object for the supervisor configuration. For automatic compaction, this is the same as the compaction configuration."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"spec.dataSchema")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"The schema for the indexing task to use during ingestion. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/ingestion-spec#dataschema"},(0,i.kt)("inlineCode",{parentName:"a"},"dataSchema"))," for more information."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"spec.ioConfig")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"The I/O configuration object to define the connection and I/O-related settings for the supervisor and indexing tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"spec.tuningConfig")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"The tuning configuration object to define performance-related settings for the supervisor and indexing tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"No")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"suspended")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"Puts the supervisor in a suspended state"),(0,i.kt)("td",{parentName:"tr",align:null},"No")))),(0,i.kt)("h3",{id:"io-configuration"},"I/O configuration"),(0,i.kt)("p",null,"The following table outlines the ",(0,i.kt)("inlineCode",{parentName:"p"},"ioConfig")," configuration properties that apply to both Apache Kafka and Amazon Kinesis ingestion methods.\nFor configuration properties specific to Kafka and Kinesis, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/kafka-ingestion#io-configuration"},"Kafka I/O configuration")," and ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/kinesis-ingestion#io-configuration"},"Kinesis I/O configuration")," respectively."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Type"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"inputFormat")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"The ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/data-formats#input-format"},"input format")," to define input data parsing."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"autoScalerConfig")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"Defines auto scaling behavior for ingestion tasks. See ",(0,i.kt)("a",{parentName:"td",href:"#task-autoscaler"},"Task autoscaler")," for more information."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"null")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"taskCount")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of reading tasks in a replica set. Multiply ",(0,i.kt)("inlineCode",{parentName:"td"},"taskCount")," and replicas to measure the maximum number of reading tasks. The total number of tasks, reading and publishing, is higher than the maximum number of reading tasks. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/supervisor#capacity-planning"},"Capacity planning")," for more details. When ",(0,i.kt)("inlineCode",{parentName:"td"},"taskCount")," is greater than the number of Kafka partitions or Kinesis shards, the actual number of reading tasks is less than the ",(0,i.kt)("inlineCode",{parentName:"td"},"taskCount")," value."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"replicas")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"The number of replica sets, where 1 is a single set of tasks (no replication). Druid always assigns replicate tasks to different workers to provide resiliency against process failure."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"taskDuration")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"The length of time before tasks stop reading and begin publishing segments."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1H"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"startDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"The period to wait before the supervisor starts managing tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"period")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"Determines how often the supervisor executes its management logic. Note that the supervisor also runs in response to certain events, such as tasks succeeding, failing, and reaching their task duration. The ",(0,i.kt)("inlineCode",{parentName:"td"},"period")," value specifies the maximum time between iterations."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT30S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"completionTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"The length of time to wait before declaring a publishing task as failed and terminating it. If the value is too low, tasks may never publish. The publishing clock for a task begins roughly after ",(0,i.kt)("inlineCode",{parentName:"td"},"taskDuration")," elapses."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT30M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"lateMessageRejectionStartDateTime")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 date time"),(0,i.kt)("td",{parentName:"tr",align:null},"Configures tasks to reject messages with timestamps earlier than this date time. For example, if this property is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"2016-01-01T11:00Z")," and the supervisor creates a task at ",(0,i.kt)("inlineCode",{parentName:"td"},"2016-01-01T12:00Z"),", Druid drops messages with timestamps earlier than ",(0,i.kt)("inlineCode",{parentName:"td"},"2016-01-01T11:00Z"),". This can prevent concurrency issues if your data stream has late messages and you have multiple pipelines that need to operate on the same segments, such as a realtime and a nightly batch ingestion pipeline."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"lateMessageRejectionPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"Configures tasks to reject messages with timestamps earlier than this period before the task was created. For example, if this property is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"PT1H")," and the supervisor creates a task at ",(0,i.kt)("inlineCode",{parentName:"td"},"2016-01-01T12:00Z"),", Druid drops messages with timestamps earlier than ",(0,i.kt)("inlineCode",{parentName:"td"},"2016-01-01T11:00Z"),". This may help prevent concurrency issues if your data stream has late messages and you have multiple pipelines that need to operate on the same segments, such as a streaming and a nightly batch ingestion pipeline. You can specify only one of the late message rejection properties."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"earlyMessageRejectionPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"Configures tasks to reject messages with timestamps later than this period after the task reached its task duration. For example, if this property is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"PT1H"),", the task duration is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"PT1H")," and the supervisor creates a task at ",(0,i.kt)("inlineCode",{parentName:"td"},"2016-01-01T12:00Z"),", Druid drops messages with timestamps later than ",(0,i.kt)("inlineCode",{parentName:"td"},"2016-01-01T14:00Z"),". Tasks sometimes run past their task duration, such as in cases of supervisor failover. Setting ",(0,i.kt)("inlineCode",{parentName:"td"},"earlyMessageRejectionPeriod")," too low may cause Druid to drop messages unexpectedly whenever a task runs past its originally configured task duration."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null})))),(0,i.kt)("h4",{id:"task-autoscaler"},"Task autoscaler"),(0,i.kt)("p",null,"You can optionally configure autoscaling behavior for ingestion tasks using the ",(0,i.kt)("inlineCode",{parentName:"p"},"autoScalerConfig")," property of the ",(0,i.kt)("inlineCode",{parentName:"p"},"ioConfig")," object."),(0,i.kt)("p",null,"The following table outlines the configuration properties for ",(0,i.kt)("inlineCode",{parentName:"p"},"autoScalerConfig"),":"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"enableTaskAutoScaler")),(0,i.kt)("td",{parentName:"tr",align:null},"Enables the autoscaler. If not specified, Druid disables the autoscaler even when ",(0,i.kt)("inlineCode",{parentName:"td"},"autoScalerConfig")," is not null."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"taskCountMax")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of ingestion tasks. Must be greater than or equal to ",(0,i.kt)("inlineCode",{parentName:"td"},"taskCountMin"),". If ",(0,i.kt)("inlineCode",{parentName:"td"},"taskCountMax")," is greater than the number of Kafka partitions or Kinesis shards, Druid sets the maximum number of reading tasks to the number of Kafka partitions or Kinesis shards and ignores ",(0,i.kt)("inlineCode",{parentName:"td"},"taskCountMax"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"taskCountMin")),(0,i.kt)("td",{parentName:"tr",align:null},"The minimum number of ingestion tasks. When you enable the autoscaler, Druid ignores the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"taskCount")," in ",(0,i.kt)("inlineCode",{parentName:"td"},"ioConfig")," and starts with the ",(0,i.kt)("inlineCode",{parentName:"td"},"taskCountMin")," number of tasks to launch."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"minTriggerScaleActionFrequencyMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"The minimum time interval between two scale actions."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"600000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"autoScalerStrategy")),(0,i.kt)("td",{parentName:"tr",align:null},"The algorithm of autoscaler. Druid only supports the ",(0,i.kt)("inlineCode",{parentName:"td"},"lagBased")," strategy. See ",(0,i.kt)("a",{parentName:"td",href:"#autoscaler-strategy"},"Autoscaler strategy")," for more information."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"lagBased"))))),(0,i.kt)("h5",{id:"autoscaler-strategy"},"Autoscaler strategy"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Unlike the Kafka indexing service, Kinesis reports lag metrics as the time difference in milliseconds between the current sequence number and the latest sequence number, rather than message count.")),(0,i.kt)("p",null,"The following table outlines the configuration properties related to the ",(0,i.kt)("inlineCode",{parentName:"p"},"lagBased")," autoscaler strategy:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"lagCollectionIntervalMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"The time period during which Druid collects lag metric points."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"30000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"lagCollectionRangeMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"The total time window of lag collection. Use with ",(0,i.kt)("inlineCode",{parentName:"td"},"lagCollectionIntervalMillis")," to specify the intervals at which to collect lag metric points."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"600000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"scaleOutThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"The threshold of scale out action."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"6000000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"triggerScaleOutFractionThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"Enables scale out action if ",(0,i.kt)("inlineCode",{parentName:"td"},"triggerScaleOutFractionThreshold")," percent of lag points is higher than ",(0,i.kt)("inlineCode",{parentName:"td"},"scaleOutThreshold"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"0.3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"scaleInThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"The threshold of scale in action."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"1000000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"triggerScaleInFractionThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"Enables scale in action if ",(0,i.kt)("inlineCode",{parentName:"td"},"triggerScaleInFractionThreshold")," percent of lag points is lower than ",(0,i.kt)("inlineCode",{parentName:"td"},"scaleOutThreshold"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"0.9")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"scaleActionStartDelayMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of milliseconds to delay after the supervisor starts before the first scale logic check."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"300000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"scaleActionPeriodMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"The frequency in milliseconds to check if a scale action is triggered."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"60000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"scaleInStep")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of tasks to reduce at once when scaling down."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"scaleOutStep")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of tasks to add at once when scaling out."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"2")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"lagAggregate")),(0,i.kt)("td",{parentName:"tr",align:null},"The aggregate function used to compute the lag metric for scaling decisions. Possible values are ",(0,i.kt)("inlineCode",{parentName:"td"},"MAX"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"SUM")," and ",(0,i.kt)("inlineCode",{parentName:"td"},"AVERAGE"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"SUM"))))),(0,i.kt)("p",null,"The following example shows a supervisor spec with ",(0,i.kt)("inlineCode",{parentName:"p"},"lagBased")," autoscaler:"),(0,i.kt)("details",null,(0,i.kt)("summary",null,"Click to view the example"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "kinesis",\n "dataSchema": {\n "dataSource": "metrics-kinesis",\n "timestampSpec": {\n "column": "timestamp",\n "format": "auto"\n },\n "dimensionsSpec": {\n "dimensions": [],\n "dimensionExclusions": [\n "timestamp",\n "value"\n ]\n },\n "metricsSpec": [\n {\n "name": "count",\n "type": "count"\n },\n {\n "name": "value_sum",\n "fieldName": "value",\n "type": "doubleSum"\n },\n {\n "name": "value_min",\n "fieldName": "value",\n "type": "doubleMin"\n },\n {\n "name": "value_max",\n "fieldName": "value",\n "type": "doubleMax"\n }\n ],\n "granularitySpec": {\n "type": "uniform",\n "segmentGranularity": "HOUR",\n "queryGranularity": "NONE"\n }\n },\n "ioConfig": {\n "stream": "metrics",\n "autoScalerConfig": {\n "enableTaskAutoScaler": true,\n "taskCountMax": 6,\n "taskCountMin": 2,\n "minTriggerScaleActionFrequencyMillis": 600000,\n "autoScalerStrategy": "lagBased",\n "lagCollectionIntervalMillis": 30000,\n "lagCollectionRangeMillis": 600000,\n "scaleOutThreshold": 600000,\n "triggerScaleOutFractionThreshold": 0.3,\n "scaleInThreshold": 100000,\n "triggerScaleInFractionThreshold": 0.9,\n "scaleActionStartDelayMillis": 300000,\n "scaleActionPeriodMillis": 60000,\n "scaleInStep": 1,\n "scaleOutStep": 2\n },\n "inputFormat": {\n "type": "json"\n },\n "endpoint": "kinesis.us-east-1.amazonaws.com",\n "taskCount": 1,\n "replicas": 1,\n "taskDuration": "PT1H"\n },\n "tuningConfig": {\n "type": "kinesis",\n "maxRowsPerSegment": 5000000\n }\n}\n'))),(0,i.kt)("h3",{id:"tuning-configuration"},"Tuning configuration"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"tuningConfig")," object is optional. If you don't specify the ",(0,i.kt)("inlineCode",{parentName:"p"},"tuningConfig")," object, Druid uses the default configuration settings."),(0,i.kt)("p",null,"The following table outlines the ",(0,i.kt)("inlineCode",{parentName:"p"},"tuningConfig")," configuration properties that apply to both Kafka and Kinesis ingestion methods.\nFor configuration properties specific to Kafka and Kinesis, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/kafka-ingestion#tuning-configuration"},"Kafka tuning configuration")," and ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/kinesis-ingestion#tuning-configuration"},"Kinesis tuning configuration")," respectively."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Type"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},"The tuning type code for the ingestion method. One of ",(0,i.kt)("inlineCode",{parentName:"td"},"kafka")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"kinesis"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsInMemory")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"The number of rows to accumulate before persisting. This number represents the post-aggregation rows. It is not equivalent to the number of input events, but the resulting number of aggregated rows. Druid uses ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsInMemory")," to manage the required JVM heap size. The maximum heap memory usage for indexing scales is ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsInMemory * (2 + maxPendingPersists)"),". Normally, you don't need to set this, but depending on the nature of data, if rows are short in terms of bytes, you may not want to store a million rows in memory and this value should be set."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"150000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxBytesInMemory")),(0,i.kt)("td",{parentName:"tr",align:null},"Long"),(0,i.kt)("td",{parentName:"tr",align:null},"The number of bytes to accumulate in heap memory before persisting. The value is based on a rough estimate of memory usage and not actual usage. Normally, Druid computes the value internally. The maximum heap memory usage for indexing is ",(0,i.kt)("inlineCode",{parentName:"td"},"maxBytesInMemory * (2 + maxPendingPersists)"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"One-sixth of max JVM memory")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"skipBytesInMemoryOverheadCheck")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"The calculation of ",(0,i.kt)("inlineCode",{parentName:"td"},"maxBytesInMemory")," takes into account overhead objects created during ingestion and each intermediate persist. To exclude the bytes of these overhead objects from the ",(0,i.kt)("inlineCode",{parentName:"td"},"maxBytesInMemory")," check, set ",(0,i.kt)("inlineCode",{parentName:"td"},"skipBytesInMemoryOverheadCheck")," to ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsPerSegment")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"The number of rows to store in a segment. This number is post-aggregation rows. Handoff occurs when ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsPerSegment")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"maxTotalRows")," is reached or every ",(0,i.kt)("inlineCode",{parentName:"td"},"intermediateHandoffPeriod"),", whichever happens first."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"5000000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxTotalRows")),(0,i.kt)("td",{parentName:"tr",align:null},"Long"),(0,i.kt)("td",{parentName:"tr",align:null},"The number of rows to aggregate across all segments; this number is post-aggregation rows. Handoff happens either if ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsPerSegment")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"maxTotalRows")," is reached or every ",(0,i.kt)("inlineCode",{parentName:"td"},"intermediateHandoffPeriod"),", whichever happens earlier."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"20000000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"intermediateHandoffPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"The period that determines how often tasks hand off segments. Handoff occurs if ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsPerSegment")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"maxTotalRows")," is reached or every ",(0,i.kt)("inlineCode",{parentName:"td"},"intermediateHandoffPeriod"),", whichever happens first."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P2147483647D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"intermediatePersistPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"The period that determines the rate at which intermediate persists occur."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT10M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxPendingPersists")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of persists that can be pending but not started. If a new intermediate persist exceeds this limit, Druid blocks ingestion until the currently running persist finishes. One persist can be running concurrently with ingestion, and none can be queued up. The maximum heap memory usage for indexing scales is ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsInMemory * (2 + maxPendingPersists)"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"indexSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"Defines segment storage format options to use at indexing time. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/ingestion-spec#indexspec"},"IndexSpec")," for more information."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"indexSpecForIntermediatePersists")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"Defines segment storage format options to use at indexing time for intermediate persisted temporary segments. You can use ",(0,i.kt)("inlineCode",{parentName:"td"},"indexSpecForIntermediatePersists")," to disable dimension/metric compression on intermediate segments to reduce memory required for final merging. However, disabling compression on intermediate segments might increase page cache use while they are used before getting merged into final segment published."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"reportParseExceptions")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"DEPRECATED. If ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", Druid throws exceptions encountered during parsing causing ingestion to halt. If ",(0,i.kt)("inlineCode",{parentName:"td"},"false"),", Druid skips unparseable rows and fields. Setting ",(0,i.kt)("inlineCode",{parentName:"td"},"reportParseExceptions")," to ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," overrides existing configurations for ",(0,i.kt)("inlineCode",{parentName:"td"},"maxParseExceptions")," and ",(0,i.kt)("inlineCode",{parentName:"td"},"maxSavedParseExceptions"),", setting ",(0,i.kt)("inlineCode",{parentName:"td"},"maxParseExceptions")," to 0 and limiting ",(0,i.kt)("inlineCode",{parentName:"td"},"maxSavedParseExceptions")," to not more than 1."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"handoffConditionTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Long"),(0,i.kt)("td",{parentName:"tr",align:null},"Number of milliseconds to wait for segment handoff. Set to a value >= 0, where 0 means to wait indefinitely."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"900000 (15 minutes) for Kafka. 0 for Kinesis.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"resetOffsetAutomatically")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"Resets partitions when the sequence number is unavailable. If set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", Druid resets partitions to the earliest or latest offset, based on the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"useEarliestSequenceNumber")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"useEarliestOffset")," (earliest if ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", latest if ",(0,i.kt)("inlineCode",{parentName:"td"},"false"),"). If set to ",(0,i.kt)("inlineCode",{parentName:"td"},"false"),", Druid surfaces the exception causing tasks to fail and ingestion to halt. If this occurs, manual intervention is required to correct the situation, potentially through ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/api-reference/supervisor-api#reset-a-supervisor"},"resetting the supervisor"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"workerThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"The number of threads that the supervisor uses to handle requests/responses for worker tasks, along with any other internal asynchronous operation."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"min(10, taskCount)"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"chatRetries")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"The number of times Druid retries HTTP requests to indexing tasks before considering tasks unresponsive."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"8")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"httpTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"The period of time to wait for a HTTP response from an indexing task."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT10S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"shutdownTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"The period of time to wait for the supervisor to attempt a graceful shutdown of tasks before exiting."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT80S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"offsetFetchPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO 8601 period"),(0,i.kt)("td",{parentName:"tr",align:null},"Determines how often the supervisor queries the streaming source and the indexing tasks to fetch current offsets and calculate lag. If the user-specified value is below the minimum value of ",(0,i.kt)("inlineCode",{parentName:"td"},"PT5S"),", the supervisor ignores the value and uses the minimum value instead."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT30S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"segmentWriteOutMediumFactory")),(0,i.kt)("td",{parentName:"tr",align:null},"Object"),(0,i.kt)("td",{parentName:"tr",align:null},"The segment write-out medium to use when creating segments. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/#segmentwriteoutmediumfactory"},"Additional Peon configuration: SegmentWriteOutMediumFactory")," for explanation and available options."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"If not specified, Druid uses the value from ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.defaultSegmentWriteOutMediumFactory.type"),".")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"logParseExceptions")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"If ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", Druid logs an error message when a parsing exception occurs, containing information about the row where the error occurred."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxParseExceptions")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of parse exceptions that can occur before the task halts ingestion and fails. Setting ",(0,i.kt)("inlineCode",{parentName:"td"},"reportParseExceptions")," overrides this limit."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"unlimited")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxSavedParseExceptions")),(0,i.kt)("td",{parentName:"tr",align:null},"Integer"),(0,i.kt)("td",{parentName:"tr",align:null},"When a parse exception occurs, Druid keeps track of the most recent parse exceptions. ",(0,i.kt)("inlineCode",{parentName:"td"},"maxSavedParseExceptions")," limits the number of saved exception instances. These saved exceptions are available after the task finishes in the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#task-reports"},"task completion report"),". Setting ",(0,i.kt)("inlineCode",{parentName:"td"},"reportParseExceptions")," overrides this limit."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"0")))),(0,i.kt)("h2",{id:"start-a-supervisor"},"Start a supervisor"),(0,i.kt)("p",null,"Druid starts a new supervisor when you submit a supervisor spec.\nYou can submit the supervisor spec in the Druid web console ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/web-console#data-loader"},"data loader")," or with the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/supervisor-api"},"Supervisor API"),"."),(0,i.kt)("p",null,"The following screenshot shows the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/web-console#supervisors"},"Supervisors")," view of the web console for a cluster with two supervisors:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Supervisors view",src:n(70254).Z,width:"1250",height:"640"})),(0,i.kt)("p",null,"Once started, the supervisor persists in the configured metadata database. There can only be one supervisor per datasource. Submitting a second supervisor spec for the same datasource overwrites the previous one."),(0,i.kt)("p",null,"When an Overlord gains leadership, either by being started or as a result of another Overlord failing, it spawns a supervisor for each supervisor spec in the metadata database. The supervisor then discovers running indexing tasks and attempts to adopt them if they are compatible with the supervisor's configuration. If they are not compatible, the tasks are terminated and the supervisor creates a new set of tasks. This way, the supervisor ingestion tasks persist across Overlord restarts and failovers."),(0,i.kt)("h3",{id:"schema-and-configuration-changes"},"Schema and configuration changes"),(0,i.kt)("p",null,"To make schema or configuration changes, you must submit a new supervisor spec. The Overlord initiates a graceful shutdown of the existing supervisor. The running supervisor signals its tasks to stop reading and begin publishing, exiting itself. Druid then uses the new configuration to create a new supervisor. Druid submits the updated schema while retaining existing publishing tasks. It also starts new tasks at the previous task offsets.\nThis way, configuration changes can be applied without requiring any pause in ingestion."),(0,i.kt)("h2",{id:"status-report"},"Status report"),(0,i.kt)("p",null,"The supervisor status report contains the state of the supervisor tasks and an array of recently thrown exceptions reported as ",(0,i.kt)("inlineCode",{parentName:"p"},"recentErrors"),".\nYou can control the maximum size of the exceptions using the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.supervisor.maxStoredExceptionEvents")," configuration."),(0,i.kt)("p",null,"To view the supervisor status in the web console, navigate to the ",(0,i.kt)("strong",{parentName:"p"},"Supervisors")," view and click the supervisor ID to open the ",(0,i.kt)("strong",{parentName:"p"},"Supervisor")," dialog.\nClick ",(0,i.kt)("strong",{parentName:"p"},"Status")," in the left navigation pane to display the status:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Supervisors info dialog",src:n(88561).Z,width:"1250",height:"640"})),(0,i.kt)("p",null,"The following example shows the status of a supervisor with the name ",(0,i.kt)("inlineCode",{parentName:"p"},"social_media"),":"),(0,i.kt)("details",null,(0,i.kt)("summary",null,"Click to view the example"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "dataSource": "social_media",\n "stream": "social_media",\n "partitions": 1,\n "replicas": 1,\n "durationSeconds": 3600,\n "activeTasks": [\n {\n "id": "index_kafka_social_media_8ff3096f21fe448_jajnddno",\n "startingOffsets": {\n "0": 0\n },\n "startTime": "2024-01-30T21:21:41.696Z",\n "remainingSeconds": 479,\n "type": "ACTIVE",\n "currentOffsets": {\n "0": 50000\n },\n "lag": {\n "0": 0\n }\n }\n ],\n "publishingTasks": [],\n "latestOffsets": {\n "0": 50000\n },\n "minimumLag": {\n "0": 0\n },\n "aggregateLag": 0,\n "offsetsLastUpdated": "2024-01-30T22:13:19.335Z",\n "suspended": false,\n "healthy": true,\n "state": "RUNNING",\n "detailedState": "RUNNING",\n "recentErrors": []\n}\n'))),(0,i.kt)("p",null,"The status report contains two properties that correspond to the state of the supervisor: ",(0,i.kt)("inlineCode",{parentName:"p"},"state")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"detailedState"),". The ",(0,i.kt)("inlineCode",{parentName:"p"},"state")," property contains a small number of generic states that apply to any type of supervisor. The ",(0,i.kt)("inlineCode",{parentName:"p"},"detailedState")," property contains a more descriptive, implementation-specific state that may provide more insight into the supervisor's activities."),(0,i.kt)("p",null,"Possible ",(0,i.kt)("inlineCode",{parentName:"p"},"state")," values are ",(0,i.kt)("inlineCode",{parentName:"p"},"PENDING"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"RUNNING"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"SUSPENDED"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"STOPPING"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"UNHEALTHY_SUPERVISOR"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"UNHEALTHY_TASKS"),"."),(0,i.kt)("p",null,"The following table lists ",(0,i.kt)("inlineCode",{parentName:"p"},"detailedState")," values and their corresponding ",(0,i.kt)("inlineCode",{parentName:"p"},"state")," mapping:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"th"},"detailedState")),(0,i.kt)("th",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"th"},"state")),(0,i.kt)("th",{parentName:"tr",align:null},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"UNHEALTHY_SUPERVISOR")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"UNHEALTHY_SUPERVISOR")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor encountered errors on previous ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.unhealthinessThreshold")," iterations.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"UNHEALTHY_TASKS")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"UNHEALTHY_TASKS")),(0,i.kt)("td",{parentName:"tr",align:null},"The last ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.taskUnhealthinessThreshold")," tasks all failed.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"UNABLE_TO_CONNECT_TO_STREAM")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"UNHEALTHY_SUPERVISOR")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor is encountering connectivity issues with the stream and hasn't successfully connected in the past.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"LOST_CONTACT_WITH_STREAM")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"UNHEALTHY_SUPERVISOR")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor is encountering connectivity issues with the stream but has successfully connected in the past.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PENDING")," (first iteration only)"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PENDING")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor has been initialized but hasn't started connecting to the stream.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"CONNECTING_TO_STREAM")," (first iteration only)"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"RUNNING")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor is trying to connect to the stream and update partition data.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"DISCOVERING_INITIAL_TASKS")," (first iteration only)"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"RUNNING")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor is discovering already-running tasks.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"CREATING_TASKS")," (first iteration only)"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"RUNNING")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor is creating tasks and discovering state.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"RUNNING")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"RUNNING")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor has started tasks and is waiting for ",(0,i.kt)("inlineCode",{parentName:"td"},"taskDuration")," to elapse.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"IDLE")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"IDLE")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor is not creating tasks since the input stream has not received any new data and all the existing data is read.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"SUSPENDED")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"SUSPENDED")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor is suspended.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"STOPPING")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"STOPPING")),(0,i.kt)("td",{parentName:"tr",align:null},"The supervisor is stopping.")))),(0,i.kt)("p",null,"On each iteration of the supervisor's run loop, the supervisor completes the following tasks in sequence:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Retrieve the list of partitions and determine the starting offset for each partition. If continuing, Druid uses the last processed offset. For new streams, Druid starts from either the beginning or end of the stream, depending on the ",(0,i.kt)("inlineCode",{parentName:"li"},"useEarliestOffset")," property."),(0,i.kt)("li",{parentName:"ol"},"Discover any running indexing tasks that are writing to the supervisor's datasource and adopt them if they match the supervisor's configuration, else signal them to stop."),(0,i.kt)("li",{parentName:"ol"},"Send a status request to each supervised task to update the view of the state of the tasks under supervision."),(0,i.kt)("li",{parentName:"ol"},"Handle tasks that have exceeded ",(0,i.kt)("inlineCode",{parentName:"li"},"taskDuration")," and should transition from reading to publishing."),(0,i.kt)("li",{parentName:"ol"},"Handle tasks that have finished publishing and signal redundant replica tasks to stop."),(0,i.kt)("li",{parentName:"ol"},"Handle tasks that have failed and clean up the supervisor's internal state."),(0,i.kt)("li",{parentName:"ol"},"Compare the list of healthy tasks to the requested ",(0,i.kt)("inlineCode",{parentName:"li"},"taskCount")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"replicas")," configurations and create additional tasks if required.")),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"detailedState")," property shows additional values (marked with \"first iteration only\" in the preceding table) the first time the\nsupervisor executes this run loop after startup or after resuming from a suspension. This is intended to surface\ninitialization-type issues, where the supervisor is unable to reach a stable state. For example, if the supervisor can't connect to\nthe stream, if it's unable to read from the stream, or if it can't communicate with existing tasks. Once the supervisor is stable;\nthat is, once it has completed a full execution without encountering any issues, ",(0,i.kt)("inlineCode",{parentName:"p"},"detailedState")," will show a ",(0,i.kt)("inlineCode",{parentName:"p"},"RUNNING"),"\nstate until it is stopped, suspended, or hits a failure threshold and transitions to an unhealthy state."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For the Kafka indexing service, Druid may report the consumer lag per partition as a negative value if the supervisor hasn't received the latest offset response from Kafka. The aggregate lag value is always >= 0.")),(0,i.kt)("h2",{id:"supervisors-system-table"},"SUPERVISORS system table"),(0,i.kt)("p",null,"Druid exposes system information through special system schemas. You can query the ",(0,i.kt)("inlineCode",{parentName:"p"},"sys.supervisors")," table to retrieve information about the supervisor internals.\nThe following example shows how to retrieve supervisor tasks information filtered by health status:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sql"},"SELECT * FROM sys.supervisors WHERE healthy=0;\n")),(0,i.kt)("p",null,"For more information on the supervisors system table, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/sql-metadata-tables#supervisors-table"},"SUPERVISORS table"),"."),(0,i.kt)("h2",{id:"manage-a-supervisor"},"Manage a supervisor"),(0,i.kt)("p",null,"You can manage a supervisor from the web console or with the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/supervisor-api"},"Supervisor API"),".\nIn the web console, navigate to the ",(0,i.kt)("strong",{parentName:"p"},"Supervisors")," view and click the ellipsis in the ",(0,i.kt)("strong",{parentName:"p"},"Actions")," column. Select the desired action from the menu that appears."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Actions menu",src:n(9591).Z,width:"1250",height:"640"})),(0,i.kt)("p",null,"The supervisor must be running for some of these actions to be available."),(0,i.kt)("h3",{id:"suspend"},"Suspend"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Suspend")," pauses a running supervisor.\nThe suspended supervisor continues to emit logs and metrics.\nIndexing tasks remain suspended until you resume the supervisor.\nFor information on how to suspend a supervisor by API, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/supervisor-api#suspend-a-running-supervisor"},"Supervisors: Suspend a running supervisor"),"."),(0,i.kt)("h3",{id:"set-offsets"},"Set offsets"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Perform this action with caution as it may result in skipped messages and lead to data loss or duplicate data.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Set offsets")," resets the offsets for supervisor partitions.\nThis action clears the stored offsets and instructs the supervisor to resume reading data from the specified offsets. If there are no stored offsets, Druid saves the specified offsets in the metadata store.\n",(0,i.kt)("strong",{parentName:"p"},"Set offsets")," terminates and recreates active tasks for the specified partitions to begin reading from the reset offsets.\nFor partitions not specified in this operation, the supervisor resumes from the last stored offset."),(0,i.kt)("p",null,"For information on how to reset offsets by API, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/supervisor-api#reset-offsets-for-a-supervisor"},"Supervisors: Reset offsets for a supervisor"),"."),(0,i.kt)("h3",{id:"hard-reset"},"Hard reset"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Perform this action with caution as it may result in skipped messages and lead to data loss or duplicate data.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Hard reset")," clears supervisor metadata, causing the supervisor to resume data reading from either the earliest or latest available position, depending on the ",(0,i.kt)("inlineCode",{parentName:"p"},"useEarliestOffset")," setting. ",(0,i.kt)("strong",{parentName:"p"},"Hard reset")," terminates and recreates active tasks, so that tasks begin reading from valid positions."),(0,i.kt)("p",null,"Use this action to recover from a stopped state due to missing offsets."),(0,i.kt)("p",null,"For information on how to reset a supervisor by API, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/supervisor-api#reset-a-supervisor"},"Supervisors: Reset a supervisor"),"."),(0,i.kt)("h3",{id:"terminate"},"Terminate"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Terminate")," stops a supervisor and its indexing tasks, triggering the publishing of their segments. When you terminate a supervisor, Druid places a tombstone marker in the metadata store to prevent reloading on restart.\nThe terminated supervisor still exists in the metadata store and its history can be retrieved."),(0,i.kt)("p",null,"For information on how to terminate a supervisor by API, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/supervisor-api#terminate-a-supervisor"},"Supervisors: Terminate a supervisor"),"."),(0,i.kt)("h2",{id:"capacity-planning"},"Capacity planning"),(0,i.kt)("p",null,"Indexing tasks run on Middle Managers and are limited by the resources available in the Middle Manager cluster. In particular, you should make sure that you have sufficient worker capacity, configured using the\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.worker.capacity")," property, to handle the configuration in the supervisor spec. Note that worker capacity is\nshared across all types of indexing tasks, so you should plan your worker capacity to handle your total indexing load, such as batch processing, streaming tasks, and merging tasks. If your workers run out of capacity, indexing tasks queue and wait for the next available worker. This may cause queries to return partial results but will not result in data loss, assuming the tasks run before the stream purges those sequence numbers."),(0,i.kt)("p",null,"A running task can be in one of two states: reading or publishing. A task remains in reading state for the period defined in ",(0,i.kt)("inlineCode",{parentName:"p"},"taskDuration"),", at which point it transitions to publishing state. A task remains in publishing state for as long as it takes to generate segments, push segments to deep storage, and have them loaded and served by a Historical service or until ",(0,i.kt)("inlineCode",{parentName:"p"},"completionTimeout")," elapses."),(0,i.kt)("p",null,"The number of reading tasks is controlled by ",(0,i.kt)("inlineCode",{parentName:"p"},"replicas")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"taskCount"),". In general, there are ",(0,i.kt)("inlineCode",{parentName:"p"},"replicas * taskCount")," reading tasks. An exception occurs if ",(0,i.kt)("inlineCode",{parentName:"p"},"taskCount")," is over the number of shards in Kinesis or partitions in Kafka, in which case Druid uses the number of shards or partitions. When ",(0,i.kt)("inlineCode",{parentName:"p"},"taskDuration")," elapses, these tasks transition to publishing state and ",(0,i.kt)("inlineCode",{parentName:"p"},"replicas * taskCount")," new reading tasks are created. To allow for reading tasks and publishing tasks to run concurrently, there should be a minimum capacity of:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-text"},"workerCapacity = 2 * replicas * taskCount\n")),(0,i.kt)("p",null,"This value is for the ideal situation in which there is at most one set of tasks publishing while another set is reading.\nIn some circumstances, it is possible to have multiple sets of tasks publishing simultaneously. This would happen if the\ntime-to-publish (generate segment, push to deep storage, load on Historical) is greater than ",(0,i.kt)("inlineCode",{parentName:"p"},"taskDuration"),". This is a valid and correct scenario but requires additional worker capacity to support. In general, it is a good idea to have ",(0,i.kt)("inlineCode",{parentName:"p"},"taskDuration")," be large enough that the previous set of tasks finishes publishing before the current set begins."),(0,i.kt)("h2",{id:"learn-more"},"Learn more"),(0,i.kt)("p",null,"See the following topics for more information:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/31.0.0/api-reference/supervisor-api"},"Supervisor API")," for how to manage and monitor supervisors using the API."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/31.0.0/ingestion/kafka-ingestion"},"Apache Kafka ingestion")," to learn about ingesting data from an Apache Kafka stream."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/31.0.0/ingestion/kinesis-ingestion"},"Amazon Kinesis ingestion")," to learn about ingesting data from an Amazon Kinesis stream.")))}g.isMDXComponent=!0},9591:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/supervisor-actions-7ac02856cc2f02bfb04ffeacd1c0beeb.png"},88561:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/supervisor-info-dialog-300a1e58533b10622fd945eca74911e4.png"},70254:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/supervisor-view-83f761c82cf23094ae3d37c91371b655.png"}}]); \ No newline at end of file diff --git a/assets/js/9f3a9cd1.c7edbd8b.js b/assets/js/9f3a9cd1.c7edbd8b.js new file mode 100644 index 0000000000..1a97aa5760 --- /dev/null +++ b/assets/js/9f3a9cd1.c7edbd8b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1737],{14137:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>k});var n=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var u=n.createContext({}),s=function(e){var t=n.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=s(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,i=e.originalType,u=e.parentName,p=r(e,["components","mdxType","originalType","parentName"]),c=s(a),d=o,k=c["".concat(u,".").concat(d)]||c[d]||m[d]||i;return a?n.createElement(k,l(l({ref:t},p),{},{components:a})):n.createElement(k,l({ref:t},p))}));function k(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=a.length,l=new Array(i);l[0]=d;var r={};for(var u in t)hasOwnProperty.call(t,u)&&(r[u]=t[u]);r.originalType=e,r[c]="string"==typeof e?e:o,l[1]=r;for(var s=2;s{a.d(t,{Z:()=>l});var n=a(67294),o=a(86010);const i={tabItem:"tabItem_Ymn6"};function l(e){var t=e.children,a=e.hidden,l=e.className;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(i.tabItem,l),hidden:a},t)}},74866:(e,t,a)=>{a.d(t,{Z:()=>N});var n=a(87462),o=a(67294),i=a(86010),l=a(12466),r=a(16550),u=a(91980),s=a(67392),p=a(50012);function c(e){return function(e){var t,a;return null!=(t=null==(a=o.Children.map(e,(function(e){if(!e||(0,o.isValidElement)(e)&&(t=e.props)&&"object"==typeof t&&"value"in t)return e;var t;throw new Error("Docusaurus error: Bad child <"+("string"==typeof e.type?e.type:e.type.name)+'>: all children of the component should be , and every should have a unique "value" prop.')})))?void 0:a.filter(Boolean))?t:[]}(e).map((function(e){var t=e.props;return{value:t.value,label:t.label,attributes:t.attributes,default:t.default}}))}function m(e){var t=e.values,a=e.children;return(0,o.useMemo)((function(){var e=null!=t?t:c(a);return function(e){var t=(0,s.l)(e,(function(e,t){return e.value===t.value}));if(t.length>0)throw new Error('Docusaurus error: Duplicate values "'+t.map((function(e){return e.value})).join(", ")+'" found in . Every value needs to be unique.')}(e),e}),[t,a])}function d(e){var t=e.value;return e.tabValues.some((function(e){return e.value===t}))}function k(e){var t=e.queryString,a=void 0!==t&&t,n=e.groupId,i=(0,r.k6)(),l=function(e){var t=e.queryString,a=void 0!==t&&t,n=e.groupId;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return null!=n?n:null}({queryString:a,groupId:n});return[(0,u._X)(l),(0,o.useCallback)((function(e){if(l){var t=new URLSearchParams(i.location.search);t.set(l,e),i.replace(Object.assign({},i.location,{search:t.toString()}))}}),[l,i])]}function f(e){var t,a,n,i,l=e.defaultValue,r=e.queryString,u=void 0!==r&&r,s=e.groupId,c=m(e),f=(0,o.useState)((function(){return function(e){var t,a=e.defaultValue,n=e.tabValues;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!d({value:a,tabValues:n}))throw new Error('Docusaurus error: The has a defaultValue "'+a+'" but none of its children has the corresponding value. Available values are: '+n.map((function(e){return e.value})).join(", ")+". If you intend to show no default tab, use defaultValue={null} instead.");return a}var o=null!=(t=n.find((function(e){return e.default})))?t:n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:l,tabValues:c})})),g=f[0],h=f[1],T=k({queryString:u,groupId:s}),v=T[0],y=T[1],N=(t=function(e){return e?"docusaurus.tab."+e:null}({groupId:s}.groupId),a=(0,p.Nk)(t),n=a[0],i=a[1],[n,(0,o.useCallback)((function(e){t&&i.set(e)}),[t,i])]),b=N[0],S=N[1],C=function(){var e=null!=v?v:b;return d({value:e,tabValues:c})?e:null}();return(0,o.useLayoutEffect)((function(){C&&h(C)}),[C]),{selectedValue:g,selectValue:(0,o.useCallback)((function(e){if(!d({value:e,tabValues:c}))throw new Error("Can't select invalid tab value="+e);h(e),y(e),S(e)}),[y,S,c]),tabValues:c}}var g=a(72389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function T(e){var t=e.className,a=e.block,r=e.selectedValue,u=e.selectValue,s=e.tabValues,p=[],c=(0,l.o5)().blockElementScrollPositionUntilNextRender,m=function(e){var t=e.currentTarget,a=p.indexOf(t),n=s[a].value;n!==r&&(c(t),u(n))},d=function(e){var t,a=null;switch(e.key){case"Enter":m(e);break;case"ArrowRight":var n,o=p.indexOf(e.currentTarget)+1;a=null!=(n=p[o])?n:p[0];break;case"ArrowLeft":var i,l=p.indexOf(e.currentTarget)-1;a=null!=(i=p[l])?i:p[p.length-1]}null==(t=a)||t.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":a},t)},s.map((function(e){var t=e.value,a=e.label,l=e.attributes;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,key:t,ref:function(e){return p.push(e)},onKeyDown:d,onClick:m},l,{className:(0,i.Z)("tabs__item",h.tabItem,null==l?void 0:l.className,{"tabs__item--active":r===t})}),null!=a?a:t)})))}function v(e){var t=e.lazy,a=e.children,n=e.selectedValue,i=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){var l=i.find((function(e){return e.props.value===n}));return l?(0,o.cloneElement)(l,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},i.map((function(e,t){return(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n})})))}function y(e){var t=f(e);return o.createElement("div",{className:(0,i.Z)("tabs-container",h.tabList)},o.createElement(T,(0,n.Z)({},e,t)),o.createElement(v,(0,n.Z)({},e,t)))}function N(e){var t=(0,g.Z)();return o.createElement(y,(0,n.Z)({key:String(t)},e))}},26996:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>m,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=a(87462),o=a(63366),i=(a(67294),a(14137)),l=a(74866),r=a(85162),u=["components"],s={id:"automatic-compaction-api",title:"Automatic compaction API",sidebar_label:"Automatic compaction"},p=void 0,c={unversionedId:"api-reference/automatic-compaction-api",id:"api-reference/automatic-compaction-api",title:"Automatic compaction API",description:"\x3c!--",source:"@site/docs/31.0.0/api-reference/automatic-compaction-api.md",sourceDirName:"api-reference",slug:"/api-reference/automatic-compaction-api",permalink:"/docs/31.0.0/api-reference/automatic-compaction-api",draft:!1,tags:[],version:"current",frontMatter:{id:"automatic-compaction-api",title:"Automatic compaction API",sidebar_label:"Automatic compaction"},sidebar:"docs",previous:{title:"Data management",permalink:"/docs/31.0.0/api-reference/data-management-api"},next:{title:"Lookups",permalink:"/docs/31.0.0/api-reference/lookups-api"}},m={},d=[{value:"Manage automatic compaction",id:"manage-automatic-compaction",level:2},{value:"Create or update automatic compaction configuration",id:"create-or-update-automatic-compaction-configuration",level:3},{value:"URL",id:"url",level:4},{value:"Responses",id:"responses",level:4},{value:"Sample request",id:"sample-request",level:4},{value:"Sample response",id:"sample-response",level:4},{value:"Remove automatic compaction configuration",id:"remove-automatic-compaction-configuration",level:3},{value:"URL",id:"url-1",level:4},{value:"Responses",id:"responses-1",level:4},{value:"Sample request",id:"sample-request-1",level:4},{value:"Sample response",id:"sample-response-1",level:4},{value:"Update capacity for compaction tasks",id:"update-capacity-for-compaction-tasks",level:3},{value:"URL",id:"url-2",level:4},{value:"Query parameters",id:"query-parameters",level:4},{value:"Responses",id:"responses-2",level:4},{value:"Sample request",id:"sample-request-2",level:4},{value:"Sample response",id:"sample-response-2",level:4},{value:"View automatic compaction configuration",id:"view-automatic-compaction-configuration",level:2},{value:"Get all automatic compaction configurations",id:"get-all-automatic-compaction-configurations",level:3},{value:"URL",id:"url-3",level:4},{value:"Responses",id:"responses-3",level:4},{value:"Sample request",id:"sample-request-3",level:4},{value:"Sample response",id:"sample-response-3",level:4},{value:"Get automatic compaction configuration",id:"get-automatic-compaction-configuration",level:3},{value:"URL",id:"url-4",level:4},{value:"Responses",id:"responses-4",level:4},{value:"Sample request",id:"sample-request-4",level:4},{value:"Sample response",id:"sample-response-4",level:4},{value:"Get automatic compaction configuration history",id:"get-automatic-compaction-configuration-history",level:3},{value:"URL",id:"url-5",level:4},{value:"Query parameters",id:"query-parameters-1",level:4},{value:"Responses",id:"responses-5",level:4},{value:"Sample request",id:"sample-request-5",level:4},{value:"Sample response",id:"sample-response-5",level:4},{value:"View automatic compaction status",id:"view-automatic-compaction-status",level:2},{value:"Get segments awaiting compaction",id:"get-segments-awaiting-compaction",level:3},{value:"URL",id:"url-6",level:4},{value:"Query parameter",id:"query-parameter",level:4},{value:"Responses",id:"responses-6",level:4},{value:"Sample request",id:"sample-request-6",level:4},{value:"Sample response",id:"sample-response-6",level:4},{value:"Get compaction status and statistics",id:"get-compaction-status-and-statistics",level:3},{value:"URL",id:"url-7",level:4},{value:"Query parameters",id:"query-parameters-2",level:4},{value:"Responses",id:"responses-7",level:4},{value:"Sample request",id:"sample-request-7",level:4},{value:"Sample response",id:"sample-response-7",level:4}],k={toc:d},f="wrapper";function g(e){var t=e.components,a=(0,o.Z)(e,u);return(0,i.kt)(f,(0,n.Z)({},k,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This topic describes the status and configuration API endpoints for ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/data-management/automatic-compaction#auto-compaction-using-coordinator-duties"},"automatic compaction using Coordinator duties")," in Apache Druid. You can configure automatic compaction in the Druid web console or API."),(0,i.kt)("admonition",{title:"Experimental",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Instead of the automatic compaction API, you can use the supervisor API to submit auto-compaction jobs using compaction supervisors. For more information, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/data-management/automatic-compaction#auto-compaction-using-compaction-supervisors"},"Auto-compaction using compaction supervisors"),".")),(0,i.kt)("p",null,"In this topic, ",(0,i.kt)("inlineCode",{parentName:"p"},"http://ROUTER_IP:ROUTER_PORT")," is a placeholder for your Router service address and port. Replace it with the information for your deployment. For example, use ",(0,i.kt)("inlineCode",{parentName:"p"},"http://localhost:8888")," for quickstart deployments."),(0,i.kt)("h2",{id:"manage-automatic-compaction"},"Manage automatic compaction"),(0,i.kt)("h3",{id:"create-or-update-automatic-compaction-configuration"},"Create or update automatic compaction configuration"),(0,i.kt)("p",null,"Creates or updates the automatic compaction configuration for a datasource. Pass the automatic compaction as a JSON object in the request body."),(0,i.kt)("p",null,"The automatic compaction configuration requires only the ",(0,i.kt)("inlineCode",{parentName:"p"},"dataSource")," property. Druid fills all other properties with default values if not specified. See ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/configuration/#automatic-compaction-dynamic-configuration"},"Automatic compaction dynamic configuration")," for configuration details."),(0,i.kt)("p",null,"Note that this endpoint returns an HTTP ",(0,i.kt)("inlineCode",{parentName:"p"},"200 OK")," message code even if the datasource name does not exist."),(0,i.kt)("h4",{id:"url"},"URL"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"POST")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid/coordinator/v1/config/compaction")),(0,i.kt)("h4",{id:"responses"},"Responses"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"1",label:"200 SUCCESS",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Successfully submitted auto compaction configuration")))),(0,i.kt)("hr",null),(0,i.kt)("h4",{id:"sample-request"},"Sample request"),(0,i.kt)("p",null,"The following example creates an automatic compaction configuration for the datasource ",(0,i.kt)("inlineCode",{parentName:"p"},"wikipedia_hour"),", which was ingested with ",(0,i.kt)("inlineCode",{parentName:"p"},"HOUR")," segment granularity. This automatic compaction configuration performs compaction on ",(0,i.kt)("inlineCode",{parentName:"p"},"wikipedia_hour"),", resulting in compacted segments that represent a day interval of data."),(0,i.kt)("p",null,"In this example:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"wikipedia_hour")," is a datasource with ",(0,i.kt)("inlineCode",{parentName:"li"},"HOUR")," segment granularity."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"skipOffsetFromLatest")," is set to ",(0,i.kt)("inlineCode",{parentName:"li"},"PT0S"),", meaning that no data is skipped."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"partitionsSpec")," is set to the default ",(0,i.kt)("inlineCode",{parentName:"li"},"dynamic"),", allowing Druid to dynamically determine the optimal partitioning strategy."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"type")," is set to ",(0,i.kt)("inlineCode",{parentName:"li"},"index_parallel"),", meaning that parallel indexing is used."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"segmentGranularity")," is set to ",(0,i.kt)("inlineCode",{parentName:"li"},"DAY"),", meaning that each compacted segment is a day of data.")),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"2",label:"cURL",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-shell"},'curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction"\\\n--header \'Content-Type: application/json\' \\\n--data \'{\n "dataSource": "wikipedia_hour",\n "skipOffsetFromLatest": "PT0S",\n "tuningConfig": {\n "partitionsSpec": {\n "type": "dynamic"\n },\n "type": "index_parallel"\n },\n "granularitySpec": {\n "segmentGranularity": "DAY"\n }\n}\'\n'))),(0,i.kt)(r.Z,{value:"3",label:"HTTP",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-HTTP"},'POST /druid/coordinator/v1/config/compaction HTTP/1.1\nHost: http://ROUTER_IP:ROUTER_PORT\nContent-Type: application/json\nContent-Length: 281\n\n{\n "dataSource": "wikipedia_hour",\n "skipOffsetFromLatest": "PT0S",\n "tuningConfig": {\n "partitionsSpec": {\n "type": "dynamic"\n },\n "type": "index_parallel"\n },\n "granularitySpec": {\n "segmentGranularity": "DAY"\n }\n}\n')))),(0,i.kt)("h4",{id:"sample-response"},"Sample response"),(0,i.kt)("p",null,"A successful request returns an HTTP ",(0,i.kt)("inlineCode",{parentName:"p"},"200 OK")," message code and an empty response body."),(0,i.kt)("h3",{id:"remove-automatic-compaction-configuration"},"Remove automatic compaction configuration"),(0,i.kt)("p",null,'Removes the automatic compaction configuration for a datasource. This updates the compaction status of the datasource to "Not enabled."'),(0,i.kt)("h4",{id:"url-1"},"URL"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"DELETE")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid/coordinator/v1/config/compaction/{dataSource}")),(0,i.kt)("h4",{id:"responses-1"},"Responses"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"4",label:"200 SUCCESS",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Successfully deleted automatic compaction configuration"))),(0,i.kt)(r.Z,{value:"5",label:"404 NOT FOUND",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Datasource does not have automatic compaction or invalid datasource name")))),(0,i.kt)("hr",null),(0,i.kt)("h4",{id:"sample-request-1"},"Sample request"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"6",label:"cURL",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-shell"},'curl --request DELETE "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/wikipedia_hour"\n'))),(0,i.kt)(r.Z,{value:"7",label:"HTTP",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-HTTP"},"DELETE /druid/coordinator/v1/config/compaction/wikipedia_hour HTTP/1.1\nHost: http://ROUTER_IP:ROUTER_PORT\n")))),(0,i.kt)("h4",{id:"sample-response-1"},"Sample response"),(0,i.kt)("p",null,"A successful request returns an HTTP ",(0,i.kt)("inlineCode",{parentName:"p"},"200 OK")," message code and an empty response body."),(0,i.kt)("h3",{id:"update-capacity-for-compaction-tasks"},"Update capacity for compaction tasks"),(0,i.kt)("p",null,"Updates the capacity for compaction tasks. The minimum number of compaction tasks is 1 and the maximum is 2147483647."),(0,i.kt)("p",null,"Note that while the max compaction tasks can theoretically be set to 2147483647, the practical limit is determined by the available cluster capacity and is capped at 10% of the cluster's total capacity."),(0,i.kt)("h4",{id:"url-2"},"URL"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"POST")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid/coordinator/v1/config/compaction/taskslots")),(0,i.kt)("h4",{id:"query-parameters"},"Query parameters"),(0,i.kt)("p",null,"To limit the maximum number of compaction tasks, use the optional query parameters ",(0,i.kt)("inlineCode",{parentName:"p"},"ratio")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"max"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ratio")," (optional)",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Type: Float"),(0,i.kt)("li",{parentName:"ul"},"Default: 0.1"),(0,i.kt)("li",{parentName:"ul"},"Limits the ratio of the total task slots to compaction task slots."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"max")," (optional)",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Type: Int"),(0,i.kt)("li",{parentName:"ul"},"Default: 2147483647"),(0,i.kt)("li",{parentName:"ul"},"Limits the maximum number of task slots for compaction tasks.")))),(0,i.kt)("h4",{id:"responses-2"},"Responses"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"8",label:"200 SUCCESS",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Successfully updated compaction configuration"))),(0,i.kt)(r.Z,{value:"9",label:"404 NOT FOUND",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Invalid ",(0,i.kt)("inlineCode",{parentName:"em"},"max")," value")))),(0,i.kt)("hr",null),(0,i.kt)("h4",{id:"sample-request-2"},"Sample request"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"10",label:"cURL",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-shell"},'curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/taskslots?ratio=0.2&max=250000"\n'))),(0,i.kt)(r.Z,{value:"11",label:"HTTP",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-HTTP"},"POST /druid/coordinator/v1/config/compaction/taskslots?ratio=0.2&max=250000 HTTP/1.1\nHost: http://ROUTER_IP:ROUTER_PORT\n")))),(0,i.kt)("h4",{id:"sample-response-2"},"Sample response"),(0,i.kt)("p",null,"A successful request returns an HTTP ",(0,i.kt)("inlineCode",{parentName:"p"},"200 OK")," message code and an empty response body."),(0,i.kt)("h2",{id:"view-automatic-compaction-configuration"},"View automatic compaction configuration"),(0,i.kt)("h3",{id:"get-all-automatic-compaction-configurations"},"Get all automatic compaction configurations"),(0,i.kt)("p",null,"Retrieves all automatic compaction configurations. Returns a ",(0,i.kt)("inlineCode",{parentName:"p"},"compactionConfigs")," object containing the active automatic compaction configurations of all datasources."),(0,i.kt)("p",null,"You can use this endpoint to retrieve ",(0,i.kt)("inlineCode",{parentName:"p"},"compactionTaskSlotRatio")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"maxCompactionTaskSlots")," values for managing resource allocation of compaction tasks."),(0,i.kt)("h4",{id:"url-3"},"URL"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"GET")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid/coordinator/v1/config/compaction")),(0,i.kt)("h4",{id:"responses-3"},"Responses"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"12",label:"200 SUCCESS",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Successfully retrieved automatic compaction configurations")))),(0,i.kt)("hr",null),(0,i.kt)("h4",{id:"sample-request-3"},"Sample request"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"13",label:"cURL",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-shell"},'curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction"\n'))),(0,i.kt)(r.Z,{value:"14",label:"HTTP",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-HTTP"},"GET /druid/coordinator/v1/config/compaction HTTP/1.1\nHost: http://ROUTER_IP:ROUTER_PORT\n")))),(0,i.kt)("h4",{id:"sample-response-3"},"Sample response"),(0,i.kt)("details",null,(0,i.kt)("summary",null,"View the response"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "compactionConfigs": [\n {\n "dataSource": "wikipedia_hour",\n "taskPriority": 25,\n "inputSegmentSizeBytes": 100000000000000,\n "maxRowsPerSegment": null,\n "skipOffsetFromLatest": "PT0S",\n "tuningConfig": {\n "maxRowsInMemory": null,\n "appendableIndexSpec": null,\n "maxBytesInMemory": null,\n "maxTotalRows": null,\n "splitHintSpec": null,\n "partitionsSpec": {\n "type": "dynamic",\n "maxRowsPerSegment": 5000000,\n "maxTotalRows": null\n },\n "indexSpec": null,\n "indexSpecForIntermediatePersists": null,\n "maxPendingPersists": null,\n "pushTimeout": null,\n "segmentWriteOutMediumFactory": null,\n "maxNumConcurrentSubTasks": null,\n "maxRetry": null,\n "taskStatusCheckPeriodMs": null,\n "chatHandlerTimeout": null,\n "chatHandlerNumRetries": null,\n "maxNumSegmentsToMerge": null,\n "totalNumMergeTasks": null,\n "maxColumnsToMerge": null,\n "type": "index_parallel",\n "forceGuaranteedRollup": false\n },\n "granularitySpec": {\n "segmentGranularity": "DAY",\n "queryGranularity": null,\n "rollup": null\n },\n "dimensionsSpec": null,\n "metricsSpec": null,\n "transformSpec": null,\n "ioConfig": null,\n "taskContext": null\n },\n {\n "dataSource": "wikipedia",\n "taskPriority": 25,\n "inputSegmentSizeBytes": 100000000000000,\n "maxRowsPerSegment": null,\n "skipOffsetFromLatest": "PT0S",\n "tuningConfig": {\n "maxRowsInMemory": null,\n "appendableIndexSpec": null,\n "maxBytesInMemory": null,\n "maxTotalRows": null,\n "splitHintSpec": null,\n "partitionsSpec": {\n "type": "dynamic",\n "maxRowsPerSegment": 5000000,\n "maxTotalRows": null\n },\n "indexSpec": null,\n "indexSpecForIntermediatePersists": null,\n "maxPendingPersists": null,\n "pushTimeout": null,\n "segmentWriteOutMediumFactory": null,\n "maxNumConcurrentSubTasks": null,\n "maxRetry": null,\n "taskStatusCheckPeriodMs": null,\n "chatHandlerTimeout": null,\n "chatHandlerNumRetries": null,\n "maxNumSegmentsToMerge": null,\n "totalNumMergeTasks": null,\n "maxColumnsToMerge": null,\n "type": "index_parallel",\n "forceGuaranteedRollup": false\n },\n "granularitySpec": {\n "segmentGranularity": "DAY",\n "queryGranularity": null,\n "rollup": null\n },\n "dimensionsSpec": null,\n "metricsSpec": null,\n "transformSpec": null,\n "ioConfig": null,\n "taskContext": null\n }\n ],\n "compactionTaskSlotRatio": 0.1,\n "maxCompactionTaskSlots": 2147483647,\n "useAutoScaleSlots": false\n}\n'))),(0,i.kt)("h3",{id:"get-automatic-compaction-configuration"},"Get automatic compaction configuration"),(0,i.kt)("p",null,"Retrieves the automatic compaction configuration for a datasource."),(0,i.kt)("h4",{id:"url-4"},"URL"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"GET")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid/coordinator/v1/config/compaction/{dataSource}")),(0,i.kt)("h4",{id:"responses-4"},"Responses"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"15",label:"200 SUCCESS",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Successfully retrieved configuration for datasource"))),(0,i.kt)(r.Z,{value:"16",label:"404 NOT FOUND",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Invalid datasource or datasource does not have automatic compaction enabled")))),(0,i.kt)("hr",null),(0,i.kt)("h4",{id:"sample-request-4"},"Sample request"),(0,i.kt)("p",null,"The following example retrieves the automatic compaction configuration for datasource ",(0,i.kt)("inlineCode",{parentName:"p"},"wikipedia_hour"),"."),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"17",label:"cURL",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-shell"},'curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/wikipedia_hour"\n'))),(0,i.kt)(r.Z,{value:"18",label:"HTTP",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-HTTP"},"GET /druid/coordinator/v1/config/compaction/wikipedia_hour HTTP/1.1\nHost: http://ROUTER_IP:ROUTER_PORT\n")))),(0,i.kt)("h4",{id:"sample-response-4"},"Sample response"),(0,i.kt)("details",null,(0,i.kt)("summary",null,"View the response"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "dataSource": "wikipedia_hour",\n "taskPriority": 25,\n "inputSegmentSizeBytes": 100000000000000,\n "maxRowsPerSegment": null,\n "skipOffsetFromLatest": "PT0S",\n "tuningConfig": {\n "maxRowsInMemory": null,\n "appendableIndexSpec": null,\n "maxBytesInMemory": null,\n "maxTotalRows": null,\n "splitHintSpec": null,\n "partitionsSpec": {\n "type": "dynamic",\n "maxRowsPerSegment": 5000000,\n "maxTotalRows": null\n },\n "indexSpec": null,\n "indexSpecForIntermediatePersists": null,\n "maxPendingPersists": null,\n "pushTimeout": null,\n "segmentWriteOutMediumFactory": null,\n "maxNumConcurrentSubTasks": null,\n "maxRetry": null,\n "taskStatusCheckPeriodMs": null,\n "chatHandlerTimeout": null,\n "chatHandlerNumRetries": null,\n "maxNumSegmentsToMerge": null,\n "totalNumMergeTasks": null,\n "maxColumnsToMerge": null,\n "type": "index_parallel",\n "forceGuaranteedRollup": false\n },\n "granularitySpec": {\n "segmentGranularity": "DAY",\n "queryGranularity": null,\n "rollup": null\n },\n "dimensionsSpec": null,\n "metricsSpec": null,\n "transformSpec": null,\n "ioConfig": null,\n "taskContext": null\n}\n'))),(0,i.kt)("h3",{id:"get-automatic-compaction-configuration-history"},"Get automatic compaction configuration history"),(0,i.kt)("p",null,"Retrieves the history of the automatic compaction configuration for a datasource. Returns an empty list if the datasource does not exist or there is no compaction history for the datasource."),(0,i.kt)("p",null,"The response contains a list of objects with the following keys:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"globalConfig"),": A JSON object containing automatic compaction configuration that applies to the entire cluster."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"compactionConfig"),": A JSON object containing the automatic compaction configuration for the datasource."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"auditInfo"),": A JSON object containing information about the change made, such as ",(0,i.kt)("inlineCode",{parentName:"li"},"author"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"comment")," or ",(0,i.kt)("inlineCode",{parentName:"li"},"ip"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"auditTime"),": The date and time when the change was made.")),(0,i.kt)("h4",{id:"url-5"},"URL"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"GET")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid/coordinator/v1/config/compaction/{dataSource}/history")),(0,i.kt)("h4",{id:"query-parameters-1"},"Query parameters"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"interval")," (optional)",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Type: ISO-8601"),(0,i.kt)("li",{parentName:"ul"},"Limits the results within a specified interval. Use ",(0,i.kt)("inlineCode",{parentName:"li"},"/")," as the delimiter for the interval string."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"count")," (optional)",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Type: Int"),(0,i.kt)("li",{parentName:"ul"},"Limits the number of results.")))),(0,i.kt)("h4",{id:"responses-5"},"Responses"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"19",label:"200 SUCCESS",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Successfully retrieved configuration history"))),(0,i.kt)(r.Z,{value:"20",label:"400 BAD REQUEST",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Invalid ",(0,i.kt)("inlineCode",{parentName:"em"},"count")," value")))),(0,i.kt)("hr",null),(0,i.kt)("h4",{id:"sample-request-5"},"Sample request"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"21",label:"cURL",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-shell"},'curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/wikipedia_hour/history"\n'))),(0,i.kt)(r.Z,{value:"22",label:"HTTP",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-HTTP"},"GET /druid/coordinator/v1/config/compaction/wikipedia_hour/history HTTP/1.1\nHost: http://ROUTER_IP:ROUTER_PORT\n")))),(0,i.kt)("h4",{id:"sample-response-5"},"Sample response"),(0,i.kt)("details",null,(0,i.kt)("summary",null,"View the response"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "globalConfig": {\n "compactionTaskSlotRatio": 0.1,\n "maxCompactionTaskSlots": 2147483647,\n "useAutoScaleSlots": false\n },\n "compactionConfig": {\n "dataSource": "wikipedia_hour",\n "taskPriority": 25,\n "inputSegmentSizeBytes": 100000000000000,\n "maxRowsPerSegment": null,\n "skipOffsetFromLatest": "P1D",\n "tuningConfig": null,\n "granularitySpec": {\n "segmentGranularity": "DAY",\n "queryGranularity": null,\n "rollup": null\n },\n "dimensionsSpec": null,\n "metricsSpec": null,\n "transformSpec": null,\n "ioConfig": null,\n "taskContext": null\n },\n "auditInfo": {\n "author": "",\n "comment": "",\n "ip": "127.0.0.1"\n },\n "auditTime": "2023-07-31T18:15:19.302Z"\n },\n {\n "globalConfig": {\n "compactionTaskSlotRatio": 0.1,\n "maxCompactionTaskSlots": 2147483647,\n "useAutoScaleSlots": false\n },\n "compactionConfig": {\n "dataSource": "wikipedia_hour",\n "taskPriority": 25,\n "inputSegmentSizeBytes": 100000000000000,\n "maxRowsPerSegment": null,\n "skipOffsetFromLatest": "PT0S",\n "tuningConfig": {\n "maxRowsInMemory": null,\n "appendableIndexSpec": null,\n "maxBytesInMemory": null,\n "maxTotalRows": null,\n "splitHintSpec": null,\n "partitionsSpec": {\n "type": "dynamic",\n "maxRowsPerSegment": 5000000,\n "maxTotalRows": null\n },\n "indexSpec": null,\n "indexSpecForIntermediatePersists": null,\n "maxPendingPersists": null,\n "pushTimeout": null,\n "segmentWriteOutMediumFactory": null,\n "maxNumConcurrentSubTasks": null,\n "maxRetry": null,\n "taskStatusCheckPeriodMs": null,\n "chatHandlerTimeout": null,\n "chatHandlerNumRetries": null,\n "maxNumSegmentsToMerge": null,\n "totalNumMergeTasks": null,\n "maxColumnsToMerge": null,\n "type": "index_parallel",\n "forceGuaranteedRollup": false\n },\n "granularitySpec": {\n "segmentGranularity": "DAY",\n "queryGranularity": null,\n "rollup": null\n },\n "dimensionsSpec": null,\n "metricsSpec": null,\n "transformSpec": null,\n "ioConfig": null,\n "taskContext": null\n },\n "auditInfo": {\n "author": "",\n "comment": "",\n "ip": "127.0.0.1"\n },\n "auditTime": "2023-07-31T18:16:16.362Z"\n }\n]\n'))),(0,i.kt)("h2",{id:"view-automatic-compaction-status"},"View automatic compaction status"),(0,i.kt)("h3",{id:"get-segments-awaiting-compaction"},"Get segments awaiting compaction"),(0,i.kt)("p",null,"Returns the total size of segments awaiting compaction for a given datasource. Returns a 404 response if a datasource does not have automatic compaction enabled."),(0,i.kt)("h4",{id:"url-6"},"URL"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"GET")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid/coordinator/v1/compaction/progress?dataSource={dataSource}")),(0,i.kt)("h4",{id:"query-parameter"},"Query parameter"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"dataSource")," (required)",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Type: String"),(0,i.kt)("li",{parentName:"ul"},"Name of the datasource for this status information.")))),(0,i.kt)("h4",{id:"responses-6"},"Responses"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"23",label:"200 SUCCESS",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Successfully retrieved segment size awaiting compaction"))),(0,i.kt)(r.Z,{value:"24",label:"404 NOT FOUND",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Unknown datasource name or datasource does not have automatic compaction enabled")))),(0,i.kt)("hr",null),(0,i.kt)("h4",{id:"sample-request-6"},"Sample request"),(0,i.kt)("p",null,"The following example retrieves the remaining segments to be compacted for datasource ",(0,i.kt)("inlineCode",{parentName:"p"},"wikipedia_hour"),"."),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"25",label:"cURL",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-shell"},'curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/compaction/progress?dataSource=wikipedia_hour"\n'))),(0,i.kt)(r.Z,{value:"26",label:"HTTP",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-HTTP"},"GET /druid/coordinator/v1/compaction/progress?dataSource=wikipedia_hour HTTP/1.1\nHost: http://ROUTER_IP:ROUTER_PORT\n")))),(0,i.kt)("h4",{id:"sample-response-6"},"Sample response"),(0,i.kt)("details",null,(0,i.kt)("summary",null,"View the response"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "remainingSegmentSize": 7615837\n}\n'))),(0,i.kt)("h3",{id:"get-compaction-status-and-statistics"},"Get compaction status and statistics"),(0,i.kt)("p",null,"Retrieves an array of ",(0,i.kt)("inlineCode",{parentName:"p"},"latestStatus")," objects representing the status and statistics from the latest automatic compaction run for all datasources with automatic compaction enabled."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"latestStatus")," object has the following properties:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"dataSource"),": Name of the datasource for this status information."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"scheduleStatus"),": Automatic compaction scheduling status. Possible values are ",(0,i.kt)("inlineCode",{parentName:"li"},"NOT_ENABLED")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"RUNNING"),". Returns ",(0,i.kt)("inlineCode",{parentName:"li"},"RUNNING ")," if the datasource has an active automatic compaction configuration submitted. Otherwise, returns ",(0,i.kt)("inlineCode",{parentName:"li"},"NOT_ENABLED"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"bytesAwaitingCompaction"),": Total bytes of this datasource waiting to be compacted by the automatic compaction (only consider intervals/segments that are eligible for automatic compaction)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"bytesCompacted"),": Total bytes of this datasource that are already compacted with the spec set in the automatic compaction configuration."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"bytesSkipped"),": Total bytes of this datasource that are skipped (not eligible for automatic compaction) by the automatic compaction."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"segmentCountAwaitingCompaction"),": Total number of segments of this datasource waiting to be compacted by the automatic compaction (only consider intervals/segments that are eligible for automatic compaction)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"segmentCountCompacted"),": Total number of segments of this datasource that are already compacted with the spec set in the automatic compaction configuration."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"segmentCountSkipped"),": Total number of segments of this datasource that are skipped (not eligible for automatic compaction) by the automatic compaction."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"intervalCountAwaitingCompaction"),": Total number of intervals of this datasource waiting to be compacted by the automatic compaction (only consider intervals/segments that are eligible for automatic compaction)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"intervalCountCompacted"),": Total number of intervals of this datasource that are already compacted with the spec set in the automatic compaction configuration."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"intervalCountSkipped"),": Total number of intervals of this datasource that are skipped (not eligible for automatic compaction) by the automatic compaction.")),(0,i.kt)("h4",{id:"url-7"},"URL"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"GET")," ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid/coordinator/v1/compaction/status")),(0,i.kt)("h4",{id:"query-parameters-2"},"Query parameters"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"dataSource")," (optional)",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Type: String"),(0,i.kt)("li",{parentName:"ul"},"Filter the result by name of a specific datasource.")))),(0,i.kt)("h4",{id:"responses-7"},"Responses"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"27",label:"200 SUCCESS",mdxType:"TabItem"},(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Successfully retrieved ",(0,i.kt)("inlineCode",{parentName:"em"},"latestStatus")," object")))),(0,i.kt)("hr",null),(0,i.kt)("h4",{id:"sample-request-7"},"Sample request"),(0,i.kt)(l.Z,{mdxType:"Tabs"},(0,i.kt)(r.Z,{value:"28",label:"cURL",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-shell"},'curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/compaction/status"\n'))),(0,i.kt)(r.Z,{value:"29",label:"HTTP",mdxType:"TabItem"},(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-HTTP"},"GET /druid/coordinator/v1/compaction/status HTTP/1.1\nHost: http://ROUTER_IP:ROUTER_PORT\n")))),(0,i.kt)("h4",{id:"sample-response-7"},"Sample response"),(0,i.kt)("details",null,(0,i.kt)("summary",null,"View the response"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "latestStatus": [\n {\n "dataSource": "wikipedia_api",\n "scheduleStatus": "RUNNING",\n "bytesAwaitingCompaction": 0,\n "bytesCompacted": 0,\n "bytesSkipped": 64133616,\n "segmentCountAwaitingCompaction": 0,\n "segmentCountCompacted": 0,\n "segmentCountSkipped": 8,\n "intervalCountAwaitingCompaction": 0,\n "intervalCountCompacted": 0,\n "intervalCountSkipped": 1\n },\n {\n "dataSource": "wikipedia_hour",\n "scheduleStatus": "RUNNING",\n "bytesAwaitingCompaction": 0,\n "bytesCompacted": 5998634,\n "bytesSkipped": 0,\n "segmentCountAwaitingCompaction": 0,\n "segmentCountCompacted": 1,\n "segmentCountSkipped": 0,\n "intervalCountAwaitingCompaction": 0,\n "intervalCountCompacted": 1,\n "intervalCountSkipped": 0\n }\n ]\n}\n'))))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b48c8f19.13064628.js b/assets/js/b48c8f19.13064628.js new file mode 100644 index 0000000000..bf8a221cf3 --- /dev/null +++ b/assets/js/b48c8f19.13064628.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5585],{14137:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>g});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var d=n.createContext({}),s=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=s(e.components);return n.createElement(d.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,d=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=s(a),k=r,g=u["".concat(d,".").concat(k)]||u[k]||m[k]||i;return a?n.createElement(g,l(l({ref:t},p),{},{components:a})):n.createElement(g,l({ref:t},p))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=k;var o={};for(var d in t)hasOwnProperty.call(t,d)&&(o[d]=t[d]);o.originalType=e,o[u]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>d,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var n=a(87462),r=a(63366),i=(a(67294),a(14137)),l=["components"],o={id:"index",title:"Configuration reference"},d=void 0,s={unversionedId:"configuration/index",id:"configuration/index",title:"Configuration reference",description:"\x3c!--",source:"@site/docs/31.0.0/configuration/index.md",sourceDirName:"configuration",slug:"/configuration/",permalink:"/docs/31.0.0/configuration/",draft:!1,tags:[],version:"current",frontMatter:{id:"index",title:"Configuration reference"},sidebar:"docs",previous:{title:"SQL JDBC driver",permalink:"/docs/31.0.0/api-reference/sql-jdbc"},next:{title:"Extensions",permalink:"/docs/31.0.0/configuration/extensions"}},p={},u=[{value:"Recommended configuration file organization",id:"recommended-configuration-file-organization",level:2},{value:"Configuration interpolation",id:"configuration-interpolation",level:2},{value:"Common configurations",id:"common-configurations",level:2},{value:"JVM configuration best practices",id:"jvm-configuration-best-practices",level:3},{value:"Extensions",id:"extensions",level:3},{value:"Modules",id:"modules",level:3},{value:"ZooKeeper",id:"zookeeper",level:3},{value:"ZooKeeper behavior",id:"zookeeper-behavior",level:4},{value:"Path configuration",id:"path-configuration",level:4},{value:"TLS",id:"tls",level:3},{value:"General configuration",id:"general-configuration",level:4},{value:"Jetty server TLS configuration",id:"jetty-server-tls-configuration",level:4},{value:"Internal client TLS configuration (requires simple-client-sslcontext extension)",id:"internal-client-tls-configuration-requires-simple-client-sslcontext-extension",level:4},{value:"Authentication and authorization",id:"authentication-and-authorization",level:3},{value:"Startup logging",id:"startup-logging",level:3},{value:"Request logging",id:"request-logging",level:3},{value:"File request logging",id:"file-request-logging",level:4},{value:"Emitter request logging",id:"emitter-request-logging",level:4},{value:"SLF4J request logging",id:"slf4j-request-logging",level:4},{value:"Filtered request logging",id:"filtered-request-logging",level:4},{value:"Composing request logging",id:"composing-request-logging",level:4},{value:"Switching request logging",id:"switching-request-logging",level:4},{value:"Audit logging",id:"audit-logging",level:3},{value:"Enabling metrics",id:"enabling-metrics",level:3},{value:"Metrics monitors",id:"metrics-monitors",level:4},{value:"Metrics emitters",id:"metrics-emitters",level:4},{value:"Logging emitter module",id:"logging-emitter-module",level:5},{value:"HTTP emitter module",id:"http-emitter-module",level:5},{value:"HTTP emitter module TLS overrides",id:"http-emitter-module-tls-overrides",level:5},{value:"Parametrized HTTP emitter module",id:"parametrized-http-emitter-module",level:5},{value:"Composing emitter module",id:"composing-emitter-module",level:5},{value:"Graphite emitter",id:"graphite-emitter",level:5},{value:"Switching emitter",id:"switching-emitter",level:5},{value:"Metadata storage",id:"metadata-storage",level:3},{value:"Deep storage",id:"deep-storage",level:3},{value:"Local deep storage",id:"local-deep-storage",level:4},{value:"Noop deep storage",id:"noop-deep-storage",level:4},{value:"S3 deep storage",id:"s3-deep-storage",level:4},{value:"HDFS deep storage",id:"hdfs-deep-storage",level:4},{value:"Cassandra deep storage",id:"cassandra-deep-storage",level:4},{value:"Centralized datasource schema",id:"centralized-datasource-schema",level:4},{value:"Ingestion security configuration",id:"ingestion-security-configuration",level:3},{value:"HDFS input source",id:"hdfs-input-source",level:4},{value:"HTTP input source",id:"http-input-source",level:4},{value:"External data access security configuration",id:"external-data-access-security-configuration",level:3},{value:"JDBC connections to external databases",id:"jdbc-connections-to-external-databases",level:4},{value:"Task logging",id:"task-logging",level:3},{value:"Log long-term storage",id:"log-long-term-storage",level:4},{value:"File task logs",id:"file-task-logs",level:5},{value:"S3 task logs",id:"s3-task-logs",level:5},{value:"Azure Blob Store task logs",id:"azure-blob-store-task-logs",level:5},{value:"Google Cloud Storage task logs",id:"google-cloud-storage-task-logs",level:5},{value:"HDFS task logs",id:"hdfs-task-logs",level:5},{value:"Log retention policy",id:"log-retention-policy",level:4},{value:"API error response",id:"api-error-response",level:3},{value:"Error response transform strategy",id:"error-response-transform-strategy",level:4},{value:"No error response transform strategy",id:"no-error-response-transform-strategy",level:5},{value:"Allowed regular expression error response transform strategy",id:"allowed-regular-expression-error-response-transform-strategy",level:5},{value:"Overlord discovery",id:"overlord-discovery",level:3},{value:"Coordinator discovery",id:"coordinator-discovery",level:3},{value:"Announcing segments",id:"announcing-segments",level:3},{value:"Batch data segment announcer",id:"batch-data-segment-announcer",level:4},{value:"JavaScript",id:"javascript",level:3},{value:"Double column storage",id:"double-column-storage",level:3},{value:"SQL compatible null handling",id:"sql-compatible-null-handling",level:3},{value:"HTTP client",id:"http-client",level:3},{value:"Common endpoints configuration",id:"common-endpoints-configuration",level:3},{value:"Master server",id:"master-server",level:2},{value:"Coordinator",id:"coordinator",level:3},{value:"Static Configuration",id:"static-configuration",level:4},{value:"Coordinator service config",id:"coordinator-service-config",level:5},{value:"Coordinator operation",id:"coordinator-operation",level:5},{value:"Metadata management",id:"metadata-management",level:5},{value:"Segment management",id:"segment-management",level:5},{value:"Metadata retrieval",id:"metadata-retrieval",level:5},{value:"Dynamic configuration",id:"dynamic-configuration",level:4},{value:"Smart segment loading",id:"smart-segment-loading",level:5},{value:"Lookups dynamic configuration",id:"lookups-dynamic-configuration",level:5},{value:"Automatic compaction dynamic configuration",id:"automatic-compaction-dynamic-configuration",level:5},{value:"Automatic compaction tuningConfig",id:"automatic-compaction-tuningconfig",level:6},{value:"Automatic compaction granularitySpec",id:"automatic-compaction-granularityspec",level:6},{value:"Automatic compaction dimensionsSpec",id:"automatic-compaction-dimensionsspec",level:6},{value:"Automatic compaction transformSpec",id:"automatic-compaction-transformspec",level:6},{value:"Automatic compaction ioConfig",id:"automatic-compaction-ioconfig",level:6},{value:"Overlord",id:"overlord",level:3},{value:"Overlord static configuration",id:"overlord-static-configuration",level:4},{value:"Overlord service configs",id:"overlord-service-configs",level:5},{value:"Overlord operations",id:"overlord-operations",level:5},{value:"Supervisors",id:"supervisors",level:5},{value:"Overlord dynamic configuration",id:"overlord-dynamic-configuration",level:4},{value:"Worker select strategy",id:"worker-select-strategy",level:5},{value:"equalDistribution",id:"equaldistribution",level:6},{value:"equalDistributionWithCategorySpec",id:"equaldistributionwithcategoryspec",level:6},{value:"fillCapacity",id:"fillcapacity",level:6},{value:"fillCapacityWithCategorySpec",id:"fillcapacitywithcategoryspec",level:6},{value:"javascript",id:"javascript-1",level:6},{value:"affinityConfig",id:"affinityconfig",level:6},{value:"workerCategorySpec",id:"workercategoryspec",level:6},{value:"CategoryConfig",id:"categoryconfig",level:6},{value:"Autoscaler",id:"autoscaler",level:5},{value:"Data server",id:"data-server",level:2},{value:"Middle Manager and Peon",id:"middle-manager-and-peon",level:3},{value:"Middle Manager service config",id:"middle-manager-service-config",level:4},{value:"Middle Manager configuration",id:"middle-manager-configuration",level:4},{value:"Peon processing",id:"peon-processing",level:4},{value:"Peon query configuration",id:"peon-query-configuration",level:4},{value:"Peon caching",id:"peon-caching",level:4},{value:"Additional Peon configuration",id:"additional-peon-configuration",level:4},{value:"SegmentWriteOutMediumFactory",id:"segmentwriteoutmediumfactory",level:5},{value:"Indexer",id:"indexer",level:3},{value:"Indexer process configuration",id:"indexer-process-configuration",level:4},{value:"Indexer general configuration",id:"indexer-general-configuration",level:4},{value:"Indexer concurrent requests",id:"indexer-concurrent-requests",level:4},{value:"Indexer processing resources",id:"indexer-processing-resources",level:4},{value:"Query configurations",id:"query-configurations",level:4},{value:"Indexer caching",id:"indexer-caching",level:4},{value:"Historical",id:"historical",level:3},{value:"Historical service configuration",id:"historical-service-configuration",level:4},{value:"Historical general configuration",id:"historical-general-configuration",level:4},{value:"Storing segments",id:"storing-segments",level:4},{value:"Historical query configs",id:"historical-query-configs",level:4},{value:"Concurrent requests",id:"concurrent-requests",level:5},{value:"Processing",id:"processing",level:5},{value:"Historical query configuration",id:"historical-query-configuration",level:5},{value:"Historical caching",id:"historical-caching",level:4},{value:"Query server",id:"query-server",level:2},{value:"Broker",id:"broker",level:3},{value:"Broker process configs",id:"broker-process-configs",level:4},{value:"Query configuration",id:"query-configuration",level:4},{value:"Query routing",id:"query-routing",level:5},{value:"Query prioritization and laning",id:"query-prioritization-and-laning",level:5},{value:"Prioritization strategies",id:"prioritization-strategies",level:5},{value:"Manual prioritization strategy",id:"manual-prioritization-strategy",level:6},{value:"Threshold prioritization strategy",id:"threshold-prioritization-strategy",level:6},{value:"Laning strategies",id:"laning-strategies",level:5},{value:"No laning strategy",id:"no-laning-strategy",level:6},{value:"'High/Low' laning strategy",id:"highlow-laning-strategy",level:6},{value:"Guardrails for materialization of subqueries",id:"guardrails-for-materialization-of-subqueries",level:5},{value:"Manual laning strategy",id:"manual-laning-strategy",level:6},{value:"Server configuration",id:"server-configuration",level:5},{value:"Client configuration",id:"client-configuration",level:5},{value:"Retry policy",id:"retry-policy",level:5},{value:"Processing",id:"processing-1",level:5},{value:"Broker query configuration",id:"broker-query-configuration",level:5},{value:"Broker generated query configuration supplementation",id:"broker-generated-query-configuration-supplementation",level:6},{value:"SQL",id:"sql",level:4},{value:"Broker caching",id:"broker-caching",level:4},{value:"Segment discovery",id:"segment-discovery",level:4},{value:"Cache configuration",id:"cache-configuration",level:2},{value:"Cache type",id:"cache-type",level:3},{value:"Local cache",id:"local-cache",level:4},{value:"Caffeine cache",id:"caffeine-cache",level:4},{value:"Configuration",id:"configuration",level:5},{value:"druid.cache.cacheExecutorFactory",id:"druidcachecacheexecutorfactory",level:5},{value:"Metrics",id:"metrics",level:5},{value:"Memcached",id:"memcached",level:5},{value:"Hybrid",id:"hybrid",level:4},{value:"General query configuration",id:"general-query-configuration",level:2},{value:"Overriding default query context values",id:"overriding-default-query-context-values",level:3},{value:"TopN query config",id:"topn-query-config",level:3},{value:"Search query config",id:"search-query-config",level:3},{value:"SegmentMetadata query config",id:"segmentmetadata-query-config",level:3},{value:"GroupBy query config",id:"groupby-query-config",level:3},{value:"Advanced configurations",id:"advanced-configurations",level:3},{value:"Expression processing configurations",id:"expression-processing-configurations",level:4},{value:"Router",id:"router",level:3},{value:"Router process configs",id:"router-process-configs",level:4},{value:"Runtime configuration",id:"runtime-configuration",level:4}],m={toc:u},k="wrapper";function g(e){var t=e.components,a=(0,r.Z)(e,l);return(0,i.kt)(k,(0,n.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This page documents all of the configuration properties for each Druid service type."),(0,i.kt)("h2",{id:"recommended-configuration-file-organization"},"Recommended configuration file organization"),(0,i.kt)("p",null,"A recommended way of organizing Druid configuration files can be seen in the ",(0,i.kt)("inlineCode",{parentName:"p"},"conf")," directory in the Druid package root, shown below:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"$ ls -R conf\ndruid\n\nconf/druid:\n_common broker coordinator historical middleManager overlord\n\nconf/druid/_common:\ncommon.runtime.properties log4j2.xml\n\nconf/druid/broker:\njvm.config runtime.properties\n\nconf/druid/coordinator:\njvm.config runtime.properties\n\nconf/druid/historical:\njvm.config runtime.properties\n\nconf/druid/middleManager:\njvm.config runtime.properties\n\nconf/druid/overlord:\njvm.config runtime.properties\n")),(0,i.kt)("p",null,"Each directory has a ",(0,i.kt)("inlineCode",{parentName:"p"},"runtime.properties")," file containing configuration properties for the specific Druid service corresponding to the directory, such as ",(0,i.kt)("inlineCode",{parentName:"p"},"historical"),"."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"jvm.config")," files contain JVM flags such as heap sizing properties for each service."),(0,i.kt)("p",null,"Common properties shared by all services are placed in ",(0,i.kt)("inlineCode",{parentName:"p"},"_common/common.runtime.properties"),"."),(0,i.kt)("h2",{id:"configuration-interpolation"},"Configuration interpolation"),(0,i.kt)("p",null,"Configuration values can be interpolated from System Properties, Environment Variables, or local files. Below is an example of how this can be used:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-properties"},"druid.metadata.storage.type=${env:METADATA_STORAGE_TYPE}\ndruid.processing.tmpDir=${sys:java.io.tmpdir}\ndruid.segmentCache.locations=${file:UTF-8:/config/segment-cache-def.json}\n")),(0,i.kt)("p",null,"Interpolation is also recursive so you can do:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-properties"},"druid.segmentCache.locations=${file:UTF-8:${env:SEGMENT_DEF_LOCATION}}\n")),(0,i.kt)("p",null,"If the property is not set, an exception will be thrown on startup, but a default can be provided if desired. Setting a default value will not work with file interpolation as an exception will be thrown if the file does not exist."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-properties"},"druid.metadata.storage.type=${env:METADATA_STORAGE_TYPE:-mysql}\ndruid.processing.tmpDir=${sys:java.io.tmpdir:-/tmp}\n")),(0,i.kt)("p",null,"If you need to set a variable that is wrapped by ",(0,i.kt)("inlineCode",{parentName:"p"},"${...}")," but do not want it to be interpolated, you can escape it by adding another ",(0,i.kt)("inlineCode",{parentName:"p"},"$"),". For example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-properties"},"config.name=$${value}\n")),(0,i.kt)("h2",{id:"common-configurations"},"Common configurations"),(0,i.kt)("p",null,"The properties under this section are common configurations that should be shared across all Druid services in a cluster."),(0,i.kt)("h3",{id:"jvm-configuration-best-practices"},"JVM configuration best practices"),(0,i.kt)("p",null,"There are four JVM parameters that we set on all of our services:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-Duser.timezone=UTC"),": This sets the default timezone of the JVM to UTC. We always set this and do not test with other default timezones, so local timezones might work, but they also might uncover weird and interesting bugs. To issue queries in a non-UTC timezone, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/granularities#period-granularities"},"query granularities"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-Dfile.encoding=UTF-8")," This is similar to timezone, we test assuming UTF-8. Local encodings might work, but they also might result in weird and interesting bugs.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-Djava.io.tmpdir=")," Various parts of Druid use temporary files to interact with the file system. These files can become quite large. This means that systems that have small ",(0,i.kt)("inlineCode",{parentName:"p"},"/tmp")," directories can cause problems for Druid. Therefore, set the JVM tmp directory to a location with ample space."),(0,i.kt)("p",{parentName:"li"}," Also consider the following when configuring the JVM tmp directory:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"The temp directory should not be volatile tmpfs."),(0,i.kt)("li",{parentName:"ul"},"This directory should also have good read and write speed."),(0,i.kt)("li",{parentName:"ul"},"Avoid NFS mount."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("inlineCode",{parentName:"li"},"org.apache.druid.java.util.metrics.SysMonitor")," requires execute privileges on files in ",(0,i.kt)("inlineCode",{parentName:"li"},"java.io.tmpdir"),". If you are using the system monitor, do not set ",(0,i.kt)("inlineCode",{parentName:"li"},"java.io.tmpdir")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"noexec"),"."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager")," This allows log4j2 to handle logs for non-log4j2 components (like jetty) which use standard java logging."))),(0,i.kt)("h3",{id:"extensions"},"Extensions"),(0,i.kt)("p",null,"Many of Druid's external dependencies can be plugged in as modules. Extensions can be provided using the following configs:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.directory")),(0,i.kt)("td",{parentName:"tr",align:null},"The root extension directory where user can put extensions related files. Druid will load extensions stored under this directory."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"extensions")," (This is a relative path to Druid's working directory)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.hadoopDependenciesDir")),(0,i.kt)("td",{parentName:"tr",align:null},"The root Hadoop dependencies directory where user can put Hadoop related dependencies files. Druid will load the dependencies based on the Hadoop coordinate specified in the Hadoop index task."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"hadoop-dependencies")," (This is a relative path to Druid's working directory")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.loadList")),(0,i.kt)("td",{parentName:"tr",align:null},"A JSON array of extensions to load from extension directories by Druid. If it is not specified, its value will be ",(0,i.kt)("inlineCode",{parentName:"td"},"null")," and Druid will load all the extensions under ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.directory"),". If its value is empty list ",(0,i.kt)("inlineCode",{parentName:"td"},"[]"),", then no extensions will be loaded at all. It is also allowed to specify absolute path of other custom extensions not stored in the common extensions directory."),(0,i.kt)("td",{parentName:"tr",align:null},"null")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.searchCurrentClassloader")),(0,i.kt)("td",{parentName:"tr",align:null},"This is a boolean flag that determines if Druid will search the main classloader for extensions. It defaults to true but can be turned off if you have reason to not automatically add all modules on the classpath."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.useExtensionClassloaderFirst")),(0,i.kt)("td",{parentName:"tr",align:null},"This is a boolean flag that determines if Druid extensions should prefer loading classes from their own jars rather than jars bundled with Druid. If false, extensions must be compatible with classes provided by any jars bundled with Druid. If true, extensions may depend on conflicting versions."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.hadoopContainerDruidClasspath")),(0,i.kt)("td",{parentName:"tr",align:null},"Hadoop Indexing launches Hadoop jobs and this configuration provides way to explicitly set the user classpath for the Hadoop job. By default, this is computed automatically by Druid based on the Druid service classpath and set of extensions. However, sometimes you might want to be explicit to resolve dependency conflicts between Druid and Hadoop."),(0,i.kt)("td",{parentName:"tr",align:null},"null")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.addExtensionsToHadoopContainer")),(0,i.kt)("td",{parentName:"tr",align:null},"Only applicable if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.hadoopContainerDruidClasspath")," is provided. If set to true, then extensions specified in the loadList are added to Hadoop container classpath. Note that when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.hadoopContainerDruidClasspath")," is not provided then extensions are always added to Hadoop container classpath."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h3",{id:"modules"},"Modules"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.modules.excludeList")),(0,i.kt)("td",{parentName:"tr",align:null},"A JSON array of canonical class names (e.g., ",(0,i.kt)("inlineCode",{parentName:"td"},'"org.apache.druid.somepackage.SomeModule"'),") of module classes which shouldn't be loaded, even if they are found in extensions specified by ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.extensions.loadList"),", or in the list of core modules specified to be loaded on a particular Druid service type. Useful when some useful extension contains some module, which shouldn't be loaded on some Druid service type because some dependencies of that module couldn't be satisfied."),(0,i.kt)("td",{parentName:"tr",align:null},"[]")))),(0,i.kt)("h3",{id:"zookeeper"},"ZooKeeper"),(0,i.kt)("p",null,"We recommend just setting the base ZK path and the ZK service host, but all ZK paths that Druid uses can be overwritten to absolute paths."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.base")),(0,i.kt)("td",{parentName:"tr",align:null},"Base ZooKeeper path."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"/druid"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.service.host")),(0,i.kt)("td",{parentName:"tr",align:null},"The ZooKeeper hosts to connect to. This is a REQUIRED property and therefore a host address must be supplied."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.service.user")),(0,i.kt)("td",{parentName:"tr",align:null},"The username to authenticate with ZooKeeper. This is an optional property."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.service.pwd")),(0,i.kt)("td",{parentName:"tr",align:null},"The ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/password-provider"},"Password Provider")," or the string password to authenticate with ZooKeeper. This is an optional property."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.service.authScheme")),(0,i.kt)("td",{parentName:"tr",align:null},"digest is the only authentication scheme supported."),(0,i.kt)("td",{parentName:"tr",align:null},"digest")))),(0,i.kt)("h4",{id:"zookeeper-behavior"},"ZooKeeper behavior"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.service.sessionTimeoutMs")),(0,i.kt)("td",{parentName:"tr",align:null},"ZooKeeper session timeout, in milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"30000"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.service.connectionTimeoutMs")),(0,i.kt)("td",{parentName:"tr",align:null},"ZooKeeper connection timeout, in milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"15000"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.service.compress")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for whether or not created Znodes should be compressed."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.service.acl")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for whether or not to enable ACL security for ZooKeeper. If ACL is enabled, zNode creators will have all permissions."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))))),(0,i.kt)("h4",{id:"path-configuration"},"Path configuration"),(0,i.kt)("p",null,"Druid interacts with ZooKeeper through a set of standard path configurations. We recommend just setting the base ZooKeeper path, but all ZooKeeper paths that Druid uses can be overwritten to absolute paths."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.base")),(0,i.kt)("td",{parentName:"tr",align:null},"Base ZooKeeper path."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"/druid"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.propertiesPath")),(0,i.kt)("td",{parentName:"tr",align:null},"ZooKeeper properties path."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.zk.paths.base}/properties"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.announcementsPath")),(0,i.kt)("td",{parentName:"tr",align:null},"Druid service announcement path."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.zk.paths.base}/announcements"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.liveSegmentsPath")),(0,i.kt)("td",{parentName:"tr",align:null},"Current path for where Druid services announce their segments."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.zk.paths.base}/segments"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.coordinatorPath")),(0,i.kt)("td",{parentName:"tr",align:null},"Used by the Coordinator for leader election."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.zk.paths.base}/coordinator"))))),(0,i.kt)("p",null,"The indexing service also uses its own set of paths. These configs can be included in the common configuration."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.indexer.base")),(0,i.kt)("td",{parentName:"tr",align:null},"Base ZooKeeper path for"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.zk.paths.base}/indexer"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.indexer.announcementsPath")),(0,i.kt)("td",{parentName:"tr",align:null},"Middle Managers announce themselves here."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.zk.paths.indexer.base}/announcements"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.indexer.tasksPath")),(0,i.kt)("td",{parentName:"tr",align:null},"Used to assign tasks to Middle Managers."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.zk.paths.indexer.base}/tasks"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.zk.paths.indexer.statusPath")),(0,i.kt)("td",{parentName:"tr",align:null},"Parent path for announcement of task statuses."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.zk.paths.indexer.base}/status"))))),(0,i.kt)("p",null,"If ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.base")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.indexer.base")," are both set, and none of the other ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.*")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.indexer.*")," values are set, then the other properties will be evaluated relative to their respective ",(0,i.kt)("inlineCode",{parentName:"p"},"base"),".\nFor example, if ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.base")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid1")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.indexer.base")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid2")," then ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.announcementsPath")," will default to ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid1/announcements")," while ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.indexer.announcementsPath")," will default to ",(0,i.kt)("inlineCode",{parentName:"p"},"/druid2/announcements"),"."),(0,i.kt)("p",null,"The following path is used for service discovery. It is ",(0,i.kt)("strong",{parentName:"p"},"not")," affected by ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.zk.paths.base")," and ",(0,i.kt)("strong",{parentName:"p"},"must")," be specified separately."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.discovery.curator.path")),(0,i.kt)("td",{parentName:"tr",align:null},"Services announce themselves under this ZooKeeper path."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"/druid/discovery"))))),(0,i.kt)("h3",{id:"tls"},"TLS"),(0,i.kt)("h4",{id:"general-configuration"},"General configuration"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.enablePlaintextPort")),(0,i.kt)("td",{parentName:"tr",align:null},"Enable/Disable HTTP connector."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.enableTlsPort")),(0,i.kt)("td",{parentName:"tr",align:null},"Enable/Disable HTTPS connector."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))))),(0,i.kt)("p",null,"Although not recommended but both HTTP and HTTPS connectors can be enabled at a time and respective ports are configurable using ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.plaintextPort"),"\nand ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.tlsPort")," properties on each service. Please see ",(0,i.kt)("inlineCode",{parentName:"p"},"Configuration")," section of individual services to check the valid and default values for these ports."),(0,i.kt)("h4",{id:"jetty-server-tls-configuration"},"Jetty server TLS configuration"),(0,i.kt)("p",null,'Druid uses Jetty as an embedded web server. To learn more about TLS/SSL, certificates, and related concepts in Jetty, including explanations of the configuration settings below, see "Configuring SSL/TLS KeyStores" in the ',(0,i.kt)("a",{parentName:"p",href:"https://www.eclipse.org/jetty/documentation.php"},"Jetty Operations Guide"),"."),(0,i.kt)("p",null,"For information about TLS/SSL support in Java in general, see the ",(0,i.kt)("a",{parentName:"p",href:"http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html"},"Java Secure Socket Extension (JSSE) Reference Guide"),".\nThe ",(0,i.kt)("a",{parentName:"p",href:"http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html"},"Java Cryptography Architecture\nStandard Algorithm Name Documentation for JDK 8")," lists all possible\nvalues for the following properties, among others provided by the Java implementation."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.keyStorePath")),(0,i.kt)("td",{parentName:"tr",align:null},"The file path or URL of the TLS/SSL KeyStore."),(0,i.kt)("td",{parentName:"tr",align:null},"none"),(0,i.kt)("td",{parentName:"tr",align:null},"yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.keyStoreType")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of the KeyStore."),(0,i.kt)("td",{parentName:"tr",align:null},"none"),(0,i.kt)("td",{parentName:"tr",align:null},"yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.certAlias")),(0,i.kt)("td",{parentName:"tr",align:null},"Alias of TLS/SSL certificate for the connector."),(0,i.kt)("td",{parentName:"tr",align:null},"none"),(0,i.kt)("td",{parentName:"tr",align:null},"yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.keyStorePassword")),(0,i.kt)("td",{parentName:"tr",align:null},"The ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/password-provider"},"Password Provider")," or String password for the KeyStore."),(0,i.kt)("td",{parentName:"tr",align:null},"none"),(0,i.kt)("td",{parentName:"tr",align:null},"yes")))),(0,i.kt)("p",null,"Following table contains non-mandatory advanced configuration options, use caution."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.keyManagerFactoryAlgorithm")),(0,i.kt)("td",{parentName:"tr",align:null},"Algorithm to use for creating KeyManager, more details ",(0,i.kt)("a",{parentName:"td",href:"https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#KeyManager"},"here"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm()")),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.keyManagerPassword")),(0,i.kt)("td",{parentName:"tr",align:null},"The ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/password-provider"},"Password Provider")," or String password for the Key Manager."),(0,i.kt)("td",{parentName:"tr",align:null},"none"),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.includeCipherSuites")),(0,i.kt)("td",{parentName:"tr",align:null},"List of cipher suite names to include. You can either use the exact cipher suite name or a regular expression."),(0,i.kt)("td",{parentName:"tr",align:null},"Jetty's default include cipher list"),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.excludeCipherSuites")),(0,i.kt)("td",{parentName:"tr",align:null},"List of cipher suite names to exclude. You can either use the exact cipher suite name or a regular expression."),(0,i.kt)("td",{parentName:"tr",align:null},"Jetty's default exclude cipher list"),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.includeProtocols")),(0,i.kt)("td",{parentName:"tr",align:null},"List of exact protocols names to include."),(0,i.kt)("td",{parentName:"tr",align:null},"Jetty's default include protocol list"),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.https.excludeProtocols")),(0,i.kt)("td",{parentName:"tr",align:null},"List of exact protocols names to exclude."),(0,i.kt)("td",{parentName:"tr",align:null},"Jetty's default exclude protocol list"),(0,i.kt)("td",{parentName:"tr",align:null},"no")))),(0,i.kt)("h4",{id:"internal-client-tls-configuration-requires-simple-client-sslcontext-extension"},"Internal client TLS configuration (requires ",(0,i.kt)("inlineCode",{parentName:"h4"},"simple-client-sslcontext")," extension)"),(0,i.kt)("p",null,"These properties apply to the SSLContext that will be provided to the internal HTTP client that Druid services use to communicate with each other. These properties require the ",(0,i.kt)("inlineCode",{parentName:"p"},"simple-client-sslcontext")," extension to be loaded. Without it, Druid services will be unable to communicate with each other when TLS is enabled."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.client.https.protocol")),(0,i.kt)("td",{parentName:"tr",align:null},"SSL protocol to use."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"TLSv1.2")),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.client.https.trustStoreType")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of the key store where trusted root certificates are stored."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"java.security.KeyStore.getDefaultType()")),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.client.https.trustStorePath")),(0,i.kt)("td",{parentName:"tr",align:null},"The file path or URL of the TLS/SSL Key store where trusted root certificates are stored."),(0,i.kt)("td",{parentName:"tr",align:null},"none"),(0,i.kt)("td",{parentName:"tr",align:null},"yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.client.https.trustStoreAlgorithm")),(0,i.kt)("td",{parentName:"tr",align:null},"Algorithm to be used by TrustManager to validate certificate chains"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm()")),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.client.https.trustStorePassword")),(0,i.kt)("td",{parentName:"tr",align:null},"The ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/password-provider"},"Password Provider")," or String password for the Trust Store."),(0,i.kt)("td",{parentName:"tr",align:null},"none"),(0,i.kt)("td",{parentName:"tr",align:null},"yes")))),(0,i.kt)("p",null,"This ",(0,i.kt)("a",{parentName:"p",href:"http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html"},"document")," lists all the possible\nvalues for the above mentioned configs among others provided by Java implementation."),(0,i.kt)("h3",{id:"authentication-and-authorization"},"Authentication and authorization"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Type"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.auth.authenticatorChain")),(0,i.kt)("td",{parentName:"tr",align:null},"JSON List of Strings"),(0,i.kt)("td",{parentName:"tr",align:null},"List of Authenticator type names"),(0,i.kt)("td",{parentName:"tr",align:null},'["allowAll"]'),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.escalator.type")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},"Type of the Escalator that should be used for internal Druid communications. This Escalator must use an authentication scheme that is supported by an Authenticator in ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.auth.authenticatorChain"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"noop")),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.auth.authorizers")),(0,i.kt)("td",{parentName:"tr",align:null},"JSON List of Strings"),(0,i.kt)("td",{parentName:"tr",align:null},"List of Authorizer type names"),(0,i.kt)("td",{parentName:"tr",align:null},'["allowAll"]'),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.auth.unsecuredPaths")),(0,i.kt)("td",{parentName:"tr",align:null},"List of Strings"),(0,i.kt)("td",{parentName:"tr",align:null},"List of paths for which security checks will not be performed. All requests to these paths will be allowed."),(0,i.kt)("td",{parentName:"tr",align:null},"[]"),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.auth.allowUnauthenticatedHttpOptions")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"If true, skip authentication checks for HTTP OPTIONS requests. This is needed for certain use cases, such as supporting CORS pre-flight requests. Note that disabling authentication checks for OPTIONS requests will allow unauthenticated users to determine what Druid endpoints are valid (by checking if the OPTIONS request returns a 200 instead of 404), so enabling this option may reveal information about server configuration, including information about what extensions are loaded (if those extensions add endpoints)."),(0,i.kt)("td",{parentName:"tr",align:null},"false"),(0,i.kt)("td",{parentName:"tr",align:null},"no")))),(0,i.kt)("p",null,"For more information, please see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/auth"},"Authentication and Authorization"),"."),(0,i.kt)("p",null,"For configuration options for specific auth extensions, please refer to the extension documentation."),(0,i.kt)("h3",{id:"startup-logging"},"Startup logging"),(0,i.kt)("p",null,"All services can log debugging information on startup."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.startup.logging.logProperties")),(0,i.kt)("td",{parentName:"tr",align:null},"Log all properties on startup (from common.runtime.properties, runtime.properties, and the JVM command line)."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.startup.logging.maskProperties")),(0,i.kt)("td",{parentName:"tr",align:null},"Masks sensitive properties (passwords, for example) containing theses words."),(0,i.kt)("td",{parentName:"tr",align:null},'["password"]')))),(0,i.kt)("p",null,"Note that some sensitive information may be logged if these settings are enabled."),(0,i.kt)("h3",{id:"request-logging"},"Request logging"),(0,i.kt)("p",null,"All services that can serve queries can also log the query requests they see. Broker services can additionally log the SQL requests (both from HTTP and JDBC) they see.\nFor an example of setting up request logging, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/request-logging"},"Request logging"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.type")),(0,i.kt)("td",{parentName:"tr",align:null},"How to log every query request. Choices: ",(0,i.kt)("inlineCode",{parentName:"td"},"noop"),", ",(0,i.kt)("a",{parentName:"td",href:"#file-request-logging"},(0,i.kt)("inlineCode",{parentName:"a"},"file")),", ",(0,i.kt)("a",{parentName:"td",href:"#emitter-request-logging"},(0,i.kt)("inlineCode",{parentName:"a"},"emitter")),", ",(0,i.kt)("a",{parentName:"td",href:"#slf4j-request-logging"},(0,i.kt)("inlineCode",{parentName:"a"},"slf4j")),", ",(0,i.kt)("a",{parentName:"td",href:"#filtered-request-logging"},(0,i.kt)("inlineCode",{parentName:"a"},"filtered")),", ",(0,i.kt)("a",{parentName:"td",href:"#composing-request-logging"},(0,i.kt)("inlineCode",{parentName:"a"},"composing")),", ",(0,i.kt)("a",{parentName:"td",href:"#switching-request-logging"},(0,i.kt)("inlineCode",{parentName:"a"},"switching"))),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"noop")," (request logging disabled by default)")))),(0,i.kt)("p",null,"To enable sending all the HTTP requests to a log, set ",(0,i.kt)("inlineCode",{parentName:"p"},"org.apache.druid.jetty.RequestLog")," to the ",(0,i.kt)("inlineCode",{parentName:"p"},"DEBUG")," level. See ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/configuration/logging"},"Logging")," for more information."),(0,i.kt)("h4",{id:"file-request-logging"},"File request logging"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"file")," request logger stores daily request logs on disk."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.dir")),(0,i.kt)("td",{parentName:"tr",align:null},"Historical, Realtime, and Broker services maintain request logs of all of the requests they get (interaction is via POST, so normal request logs don\u2019t generally capture information about the actual query), this specifies the directory to store the request logs in"),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.filePattern")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html"},"Joda datetime format")," for each file"),(0,i.kt)("td",{parentName:"tr",align:null},"\"yyyy-MM-dd'.log'\"")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.durationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"Period to retain the request logs on disk. The period should be at least longer than ",(0,i.kt)("inlineCode",{parentName:"td"},"P1D"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("p",null,"The format of request logs is TSV, one line per requests, with five fields: timestamp, remote","_","addr, native","_","query, query","_","context, sql","_","query."),(0,i.kt)("p",null,"For native JSON request, the ",(0,i.kt)("inlineCode",{parentName:"p"},"sql_query")," field is empty. For example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-txt"},'2019-01-14T10:00:00.000Z 127.0.0.1 {"queryType":"topN","dataSource":{"type":"table","name":"wikiticker"},"virtualColumns":[],"dimension":{"type":"LegacyDimensionSpec","dimension":"page","outputName":"page","outputType":"STRING"},"metric":{"type":"LegacyTopNMetricSpec","metric":"count"},"threshold":10,"intervals":{"type":"LegacySegmentSpec","intervals":["2015-09-12T00:00:00.000Z/2015-09-13T00:00:00.000Z"]},"filter":null,"granularity":{"type":"all"},"aggregations":[{"type":"count","name":"count"}],"postAggregations":[],"context":{"queryId":"74c2d540-d700-4ebd-b4a9-3d02397976aa"},"descending":false} {"query/time":100,"query/bytes":800,"success":true,"identity":"user1"}\n')),(0,i.kt)("p",null,"For SQL query request, the ",(0,i.kt)("inlineCode",{parentName:"p"},"native_query")," field is empty. For example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-txt"},'2019-01-14T10:00:00.000Z 127.0.0.1 {"sqlQuery/time":100, "sqlQuery/planningTimeMs":10, "sqlQuery/bytes":600, "success":true, "identity":"user1"} {"query":"SELECT page, COUNT(*) AS Edits FROM wikiticker WHERE TIME_IN_INTERVAL(\\"__time\\", \'2015-09-12/2015-09-13\') GROUP BY page ORDER BY Edits DESC LIMIT 10","context":{"sqlQueryId":"c9d035a0-5ffd-4a79-a865-3ffdadbb5fdd","nativeQueryIds":"[490978e4-f5c7-4cf6-b174-346e63cf8863]"}}\n')),(0,i.kt)("h4",{id:"emitter-request-logging"},"Emitter request logging"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"emitter")," request logger emits every request to the external location specified in the ",(0,i.kt)("a",{parentName:"p",href:"#enabling-metrics"},"emitter")," configuration."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.feed")),(0,i.kt)("td",{parentName:"tr",align:null},"Feed name for requests."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h4",{id:"slf4j-request-logging"},"SLF4J request logging"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"slf4j")," request logger logs every request using SLF4J. It serializes native queries into JSON in the log message regardless of the SLF4J format specification. Requests are logged under the class ",(0,i.kt)("inlineCode",{parentName:"p"},"org.apache.druid.server.log.LoggingRequestLogger"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.setMDC")),(0,i.kt)("td",{parentName:"tr",align:null},"If you want to set MDC entries within the log entry, set this value to ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),". Your logging system must be configured to support MDC in order to format this data."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.setContextMDC")),(0,i.kt)("td",{parentName:"tr",align:null},'Set to "true" to add the Druid query ',(0,i.kt)("inlineCode",{parentName:"td"},"context")," to the MDC entries. Only applies when ",(0,i.kt)("inlineCode",{parentName:"td"},"setMDC")," is ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("p",null,"For a native query, the following MDC fields are populated when ",(0,i.kt)("inlineCode",{parentName:"p"},"setMDC")," is ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),":"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"MDC field"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"queryId")),(0,i.kt)("td",{parentName:"tr",align:null},"The query ID")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"sqlQueryId")),(0,i.kt)("td",{parentName:"tr",align:null},"The SQL query ID if this query is part of a SQL request")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"dataSource")),(0,i.kt)("td",{parentName:"tr",align:null},"The datasource the query was against")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"queryType")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of the query")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"hasFilters")),(0,i.kt)("td",{parentName:"tr",align:null},"If the query has any filters")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"remoteAddr")),(0,i.kt)("td",{parentName:"tr",align:null},"The remote address of the requesting client")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"duration")),(0,i.kt)("td",{parentName:"tr",align:null},"The duration of the query interval")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"resultOrdering")),(0,i.kt)("td",{parentName:"tr",align:null},"The ordering of results")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"descending")),(0,i.kt)("td",{parentName:"tr",align:null},"If the query is a descending query")))),(0,i.kt)("h4",{id:"filtered-request-logging"},"Filtered request logging"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"filtered")," request logger filters requests based on the query type or how long a query takes to complete.\nFor native queries, the logger only logs requests when the ",(0,i.kt)("inlineCode",{parentName:"p"},"query/time")," metric exceeds the threshold provided in ",(0,i.kt)("inlineCode",{parentName:"p"},"queryTimeThresholdMs"),".\nFor SQL queries, it only logs requests when the ",(0,i.kt)("inlineCode",{parentName:"p"},"sqlQuery/time")," metric exceeds threshold provided in ",(0,i.kt)("inlineCode",{parentName:"p"},"sqlQueryTimeThresholdMs"),".\nSee ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/metrics"},"Metrics")," for more details on query metrics."),(0,i.kt)("p",null,"Requests that meet the threshold are logged using the request logger type set in ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.request.logging.delegate.type"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.queryTimeThresholdMs")),(0,i.kt)("td",{parentName:"tr",align:null},"Threshold value for the ",(0,i.kt)("inlineCode",{parentName:"td"},"query/time")," metric in milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},"0, i.e., no filtering")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.sqlQueryTimeThresholdMs")),(0,i.kt)("td",{parentName:"tr",align:null},"Threshold value for the ",(0,i.kt)("inlineCode",{parentName:"td"},"sqlQuery/time")," metric in milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},"0, i.e., no filtering")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.mutedQueryTypes")),(0,i.kt)("td",{parentName:"tr",align:null},'Query requests of these types are not logged. Query types are defined as string objects corresponding to the "queryType" value for the specified query in the Druid\'s ',(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/"},"native JSON query API"),". Misspelled query types will be ignored. Example to ignore scan and timeBoundary queries: ",(0,i.kt)("inlineCode",{parentName:"td"},'["scan", "timeBoundary"]')),(0,i.kt)("td",{parentName:"tr",align:null},"[]")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.delegate.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Type of delegate request logger to log requests."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h4",{id:"composing-request-logging"},"Composing request logging"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"composing")," request logger emits request logs to multiple request loggers."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.loggerProviders")),(0,i.kt)("td",{parentName:"tr",align:null},"List of request loggers for emitting request logs."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h4",{id:"switching-request-logging"},"Switching request logging"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"switching")," request logger routes native query request logs to one request logger and SQL query request logs to another request logger."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.nativeQueryLogger")),(0,i.kt)("td",{parentName:"tr",align:null},"Request logger for emitting native query request logs."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.request.logging.sqlQueryLogger")),(0,i.kt)("td",{parentName:"tr",align:null},"Request logger for emitting SQL query request logs."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h3",{id:"audit-logging"},"Audit logging"),(0,i.kt)("p",null,"Coordinator and Overlord log changes to lookups, segment load/drop rules, and dynamic configuration changes for auditing."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.audit.manager.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Type of audit manager used for handling audited events. Audited events are logged when set to ",(0,i.kt)("inlineCode",{parentName:"td"},"log")," or persisted in metadata store when set to ",(0,i.kt)("inlineCode",{parentName:"td"},"sql"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"sql")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.audit.manager.logLevel")),(0,i.kt)("td",{parentName:"tr",align:null},"Log level of audit events with possible values DEBUG, INFO, WARN. This property is used only when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.audit.manager.type")," is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"log"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"INFO")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.audit.manager.auditHistoryMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"Default duration for querying audit history."),(0,i.kt)("td",{parentName:"tr",align:null},"1 week")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.audit.manager.includePayloadAsDimensionInMetric")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag on whether to add ",(0,i.kt)("inlineCode",{parentName:"td"},"payload")," column in service metric."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.audit.manager.maxPayloadSizeBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum size of audit payload to store in Druid's metadata store audit table. If the size of audit payload exceeds this value, the audit log would be stored with a message indicating that the payload was omitted instead. Setting ",(0,i.kt)("inlineCode",{parentName:"td"},"maxPayloadSizeBytes")," to -1 (default value) disables this check, meaning Druid will always store audit payload regardless of it's size. Setting to any negative number other than ",(0,i.kt)("inlineCode",{parentName:"td"},"-1")," is invalid. Human-readable format is supported, see ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"here"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.audit.manager.skipNullField")),(0,i.kt)("td",{parentName:"tr",align:null},"If true, the audit payload stored in metadata store will exclude any field with null value."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h3",{id:"enabling-metrics"},"Enabling metrics"),(0,i.kt)("p",null,"You can configure Druid services to emit ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/metrics"},"metrics")," regularly from a number of ",(0,i.kt)("a",{parentName:"p",href:"#metrics-monitors"},"monitors")," via ",(0,i.kt)("a",{parentName:"p",href:"#metrics-emitters"},"emitters"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.monitoring.emissionPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"Frequency that Druid emits metrics."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"#metrics-monitors"},(0,i.kt)("inlineCode",{parentName:"a"},"druid.monitoring.monitors"))),(0,i.kt)("td",{parentName:"tr",align:null},"Sets list of Druid monitors used by a service.",(0,i.kt)("br",null),(0,i.kt)("br",null),"Because individual monitors sometimes only work on specific process types, it is best to set this property for each process type individually in e.g. ",(0,i.kt)("inlineCode",{parentName:"td"},"historical/runtime.properties")," rather than ",(0,i.kt)("inlineCode",{parentName:"td"},"_common/common.runtime.properties"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"none (no monitors)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"#metrics-emitters"},(0,i.kt)("inlineCode",{parentName:"a"},"druid.emitter"))),(0,i.kt)("td",{parentName:"tr",align:null},"Setting this value initializes one of the emitter modules."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"noop")," (metric emission disabled by default)")))),(0,i.kt)("h4",{id:"metrics-monitors"},"Metrics monitors"),(0,i.kt)("p",null,"Metric monitoring is an essential part of Druid operations. The following monitors are available:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Name"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.client.cache.CacheMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Emits metrics (to logs) about the segment results cache for Historical and Broker services. Reports typical cache statistics include hits, misses, rates, and size (bytes and number of entries), as well as timeouts and and errors.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.SysMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports on various system activities and statuses using the ",(0,i.kt)("a",{parentName:"td",href:"https://github.com/hyperic/sigar"},"SIGAR library"),". Requires execute privileges on files in ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir"),". Do not set ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir")," to ",(0,i.kt)("inlineCode",{parentName:"td"},"noexec")," when using ",(0,i.kt)("inlineCode",{parentName:"td"},"SysMonitor"),".")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.JvmMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports various JVM-related statistics.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.JvmCpuMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports statistics of CPU consumption by the JVM.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.CpuAcctDeltaMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports consumed CPU as per the cpuacct cgroup.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.JvmThreadsMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports Thread statistics in the JVM, like numbers of total, daemon, started, died threads.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.CgroupCpuMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports CPU shares and quotas as per the ",(0,i.kt)("inlineCode",{parentName:"td"},"cpu")," cgroup.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.CgroupCpuSetMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports CPU core/HT and memory node allocations as per the ",(0,i.kt)("inlineCode",{parentName:"td"},"cpuset")," cgroup.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.CgroupDiskMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports disk statistic as per the blkio cgroup.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.metrics.CgroupMemoryMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports memory statistic as per the memory cgroup.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.metrics.HistoricalMetricsMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports statistics on Historical services. Available only on Historical services.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.metrics.SegmentStatsMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"EXPERIMENTAL")," Reports statistics about segments on Historical services. Available only on Historical services. Not to be used when lazy loading is configured.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.metrics.QueryCountStatsMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports how many queries have been successful/failed/interrupted.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.metrics.SubqueryCountStatsMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports how many subqueries have been materialized as rows or bytes and various other statistics related to the subquery execution")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.emitter.HttpEmittingMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports internal metrics of ",(0,i.kt)("inlineCode",{parentName:"td"},"http")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"parametrized")," emitter (see below). Must not be used with another emitter type. See the description of the metrics here: ",(0,i.kt)("a",{parentName:"td",href:"https://github.com/apache/druid/pull/4973"},"https://github.com/apache/druid/pull/4973"),".")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.metrics.TaskCountStatsMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports how many ingestion tasks are currently running/pending/waiting and also the number of successful/failed tasks per emission period.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.metrics.TaskSlotCountStatsMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports metrics about task slot usage per emission period.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.metrics.WorkerTaskCountStatsMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports how many ingestion tasks are currently running/pending/waiting, the number of successful/failed tasks, and metrics about task slot usage for the reporting worker, per emission period. Only supported by Middle Manager node types.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.server.metrics.ServiceStatusMonitor")),(0,i.kt)("td",{parentName:"tr",align:null},"Reports a heartbeat for the service.")))),(0,i.kt)("p",null,"For example, you might configure monitors on all services for system and JVM information within ",(0,i.kt)("inlineCode",{parentName:"p"},"common.runtime.properties")," as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-properties"},'druid.monitoring.monitors=["org.apache.druid.java.util.metrics.SysMonitor","org.apache.druid.java.util.metrics.JvmMonitor"]\n')),(0,i.kt)("p",null,"You can override cluster-wide configuration by amending the ",(0,i.kt)("inlineCode",{parentName:"p"},"runtime.properties")," of individual services."),(0,i.kt)("h4",{id:"metrics-emitters"},"Metrics emitters"),(0,i.kt)("p",null,"There are several emitters available:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"noop")," (default) disables metric emission."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#logging-emitter-module"},(0,i.kt)("inlineCode",{parentName:"a"},"logging"))," emits logs using Log4j2."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#http-emitter-module"},(0,i.kt)("inlineCode",{parentName:"a"},"http"))," sends ",(0,i.kt)("inlineCode",{parentName:"li"},"POST")," requests of JSON events."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#parametrized-http-emitter-module"},(0,i.kt)("inlineCode",{parentName:"a"},"parametrized"))," operates like the ",(0,i.kt)("inlineCode",{parentName:"li"},"http")," emitter but fine-tunes the recipient URL based on the event feed."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#composing-emitter-module"},(0,i.kt)("inlineCode",{parentName:"a"},"composing"))," initializes multiple emitter modules."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#graphite-emitter"},(0,i.kt)("inlineCode",{parentName:"a"},"graphite"))," emits metrics to a ",(0,i.kt)("a",{parentName:"li",href:"https://graphiteapp.org/"},"Graphite")," Carbon service."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#switching-emitter"},(0,i.kt)("inlineCode",{parentName:"a"},"switching"))," initializes and emits to multiple emitter modules based on the event feed.")),(0,i.kt)("h5",{id:"logging-emitter-module"},"Logging emitter module"),(0,i.kt)("p",null,"The use this emitter module, set ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.emitter=logging"),". The ",(0,i.kt)("inlineCode",{parentName:"p"},"logging")," emitter uses a Log4j2 logger named\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.emitter.logging.loggerClass")," to emit events. Each event is logged as a single ",(0,i.kt)("inlineCode",{parentName:"p"},"json")," object with a\n",(0,i.kt)("a",{parentName:"p",href:"https://logging.apache.org/log4j/2.x/manual/markers.html"},"Marker")," as the feed of the event. Users may wish to edit the\nlog4j config to route these logs to different sources based on the feed of the event."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.logging.loggerClass")),(0,i.kt)("td",{parentName:"tr",align:null},"The class used for logging."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid.java.util.emitter.core.LoggingEmitter"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.logging.logLevel")),(0,i.kt)("td",{parentName:"tr",align:null},"Choices: debug, info, warn, error. The log level at which message are logged."),(0,i.kt)("td",{parentName:"tr",align:null},"info")))),(0,i.kt)("h5",{id:"http-emitter-module"},"HTTP emitter module"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.flushMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"How often the internal message buffer is flushed (data is sent)."),(0,i.kt)("td",{parentName:"tr",align:null},"60000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.flushCount")),(0,i.kt)("td",{parentName:"tr",align:null},"How many messages the internal message buffer can hold before flushing (sending)."),(0,i.kt)("td",{parentName:"tr",align:null},"500")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.basicAuthentication")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/password-provider"},"Password Provider")," for providing login and password for authentication in ",(0,i.kt)("inlineCode",{parentName:"td"},'"login:password"')," form. For example, ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.basicAuthentication=admin:adminpassword")," uses Default Password Provider which allows plain text passwords."),(0,i.kt)("td",{parentName:"tr",align:null},"not specified = no authentication")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.flushTimeOut")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout after which an event should be sent to the endpoint, even if internal buffers are not filled, in milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},"not specified = no timeout")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.batchingStrategy")),(0,i.kt)("td",{parentName:"tr",align:null},'The strategy of how the batch is formatted. "ARRAY" means ',(0,i.kt)("inlineCode",{parentName:"td"},"[event1,event2]"),', "NEWLINES" means ',(0,i.kt)("inlineCode",{parentName:"td"},"event1\\nevent2"),", ONLY_EVENTS means ",(0,i.kt)("inlineCode",{parentName:"td"},"event1event2"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"ARRAY")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.maxBatchSize")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum batch size, in bytes."),(0,i.kt)("td",{parentName:"tr",align:null},"the minimum of (10% of JVM heap size divided by 2) or (5242880 (i. e. 5 MiB))")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.batchQueueSizeLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of batches in emitter queue, if there are problems with emitting."),(0,i.kt)("td",{parentName:"tr",align:null},"the maximum of (2) or (10% of the JVM heap size divided by 5MiB)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.minHttpTimeoutMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"If the speed of filling batches imposes timeout smaller than that, not even trying to send batch to endpoint, because it will likely fail, not being able to send the data that fast. Configure this depending based on emitter/successfulSending/minTimeMs metric. Reasonable values are 10ms..100ms."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.recipientBaseUrl")),(0,i.kt)("td",{parentName:"tr",align:null},"The base URL to emit messages to. Druid will POST JSON to be consumed at the HTTP endpoint specified by this property."),(0,i.kt)("td",{parentName:"tr",align:null},"none, required config")))),(0,i.kt)("h5",{id:"http-emitter-module-tls-overrides"},"HTTP emitter module TLS overrides"),(0,i.kt)("p",null,"By default, when sending events to a TLS-enabled receiver, the HTTP Emitter uses an SSLContext obtained from the service described at ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/tls-support"},"Druid's internal communication over TLS"),", that is the same SSLContext that would be used for internal communications between Druid services."),(0,i.kt)("p",null,"In some use cases it may be desirable to have the HTTP Emitter use its own separate truststore configuration. For example, there may be organizational policies that prevent the TLS-enabled metrics receiver's certificate from being added to the same truststore used by Druid's internal HTTP client."),(0,i.kt)("p",null,"The following properties allow the HTTP Emitter to use its own truststore configuration when building its SSLContext."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.ssl.useDefaultJavaContext")),(0,i.kt)("td",{parentName:"tr",align:null},"If set to true, the HttpEmitter will use ",(0,i.kt)("inlineCode",{parentName:"td"},"SSLContext.getDefault()"),", the default Java SSLContext, and all other properties below are ignored."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.ssl.trustStorePath")),(0,i.kt)("td",{parentName:"tr",align:null},"The file path or URL of the TLS/SSL Key store where trusted root certificates are stored. If this is unspecified, the HTTP Emitter will use the same SSLContext as Druid's internal HTTP client, as described in the beginning of this section, and all other properties below are ignored."),(0,i.kt)("td",{parentName:"tr",align:null},"null")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.ssl.trustStoreType")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of the key store where trusted root certificates are stored."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"java.security.KeyStore.getDefaultType()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.ssl.trustStoreAlgorithm")),(0,i.kt)("td",{parentName:"tr",align:null},"Algorithm to be used by TrustManager to validate certificate chains"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.ssl.trustStorePassword")),(0,i.kt)("td",{parentName:"tr",align:null},"The ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/password-provider"},"Password Provider")," or String password for the Trust Store."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.http.ssl.protocol")),(0,i.kt)("td",{parentName:"tr",align:null},"TLS protocol to use."),(0,i.kt)("td",{parentName:"tr",align:null},'"TLSv1.2"')))),(0,i.kt)("h5",{id:"parametrized-http-emitter-module"},"Parametrized HTTP emitter module"),(0,i.kt)("p",null,"The parametrized emitter takes the same configs as the ",(0,i.kt)("a",{parentName:"p",href:"#http-emitter-module"},(0,i.kt)("inlineCode",{parentName:"a"},"http")," emitter")," using the prefix ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.emitter.parametrized.httpEmitting."),".\nFor example:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"druid.emitter.parametrized.httpEmitting.flushMillis")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"druid.emitter.parametrized.httpEmitting.flushCount")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"druid.emitter.parametrized.httpEmitting.ssl.trustStorePath"))),(0,i.kt)("p",null,"Do not specify ",(0,i.kt)("inlineCode",{parentName:"p"},"recipientBaseUrl")," with the parametrized emitter.\nInstead use ",(0,i.kt)("inlineCode",{parentName:"p"},"recipientBaseUrlPattern")," described in the table below."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.parametrized.recipientBaseUrlPattern")),(0,i.kt)("td",{parentName:"tr",align:null},"The URL pattern to send an event to, based on the event's feed. For example, ",(0,i.kt)("inlineCode",{parentName:"td"},"http://foo.bar/{feed}"),", that will send event to ",(0,i.kt)("inlineCode",{parentName:"td"},"http://foo.bar/metrics"),' if the event\'s feed is "metrics".'),(0,i.kt)("td",{parentName:"tr",align:null},"none, required config")))),(0,i.kt)("h5",{id:"composing-emitter-module"},"Composing emitter module"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.composing.emitters")),(0,i.kt)("td",{parentName:"tr",align:null},"List of emitter modules to load, such as ",'["logging","http"]',"."),(0,i.kt)("td",{parentName:"tr",align:null},"[]")))),(0,i.kt)("h5",{id:"graphite-emitter"},"Graphite emitter"),(0,i.kt)("p",null,"To use graphite as emitter set ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.emitter=graphite"),". For configuration details, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/development/extensions-contrib/graphite"},"Graphite emitter")," for the Graphite emitter Druid extension."),(0,i.kt)("h5",{id:"switching-emitter"},"Switching emitter"),(0,i.kt)("p",null,"To use switching as emitter set ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.emitter=switching"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.switching.emitters")),(0,i.kt)("td",{parentName:"tr",align:null},"JSON map of feed to list of emitter modules that will be used for the mapped feed, such as ",(0,i.kt)("inlineCode",{parentName:"td"},'{"metrics":["http"], "alerts":["logging"]}')),(0,i.kt)("td",{parentName:"tr",align:null},"{}")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.emitter.switching.defaultEmitters")),(0,i.kt)("td",{parentName:"tr",align:null},"JSON list of emitter modules to load that will be used if there is no emitter specifically designated for that event's feed, such as ",(0,i.kt)("inlineCode",{parentName:"td"},'["logging","http"]'),"."),(0,i.kt)("td",{parentName:"tr",align:null},"[]")))),(0,i.kt)("h3",{id:"metadata-storage"},"Metadata storage"),(0,i.kt)("p",null,"These properties specify the JDBC connection and other configuration around the metadata storage. The only services that connect to the metadata storage with these properties are the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/coordinator"},"Coordinator")," and ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/overlord"},"Overlord"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.type")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of metadata storage to use. One of ",(0,i.kt)("inlineCode",{parentName:"td"},"mysql"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"postgresql"),", or ",(0,i.kt)("inlineCode",{parentName:"td"},"derby"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"derby"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.connector.connectURI")),(0,i.kt)("td",{parentName:"tr",align:null},"The JDBC URI for the database to connect to"),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.connector.user")),(0,i.kt)("td",{parentName:"tr",align:null},"The username to connect with."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.connector.password")),(0,i.kt)("td",{parentName:"tr",align:null},"The ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/password-provider"},"Password Provider")," or String password used to connect with."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.connector.createTables")),(0,i.kt)("td",{parentName:"tr",align:null},"If Druid requires a table and it doesn't exist, create it?"),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.base")),(0,i.kt)("td",{parentName:"tr",align:null},"The base name for tables."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.dataSource")),(0,i.kt)("td",{parentName:"tr",align:null},"The table to use to look for datasources created by ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/kafka-ingestion"},"Kafka Indexing Service"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_dataSource"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.pendingSegments")),(0,i.kt)("td",{parentName:"tr",align:null},"The table to use to look for pending segments."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_pendingSegments"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.segments")),(0,i.kt)("td",{parentName:"tr",align:null},"The table to use to look for segments."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_segments"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.rules")),(0,i.kt)("td",{parentName:"tr",align:null},"The table to use to look for segment load/drop rules."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_rules"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.config")),(0,i.kt)("td",{parentName:"tr",align:null},"The table to use to look for configs."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_config"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.tasks")),(0,i.kt)("td",{parentName:"tr",align:null},"Used by the indexing service to store tasks."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_tasks"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.taskLog")),(0,i.kt)("td",{parentName:"tr",align:null},"Used by the indexing service to store task logs."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_tasklogs"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.taskLock")),(0,i.kt)("td",{parentName:"tr",align:null},"Used by the indexing service to store task locks."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_tasklocks"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.supervisors")),(0,i.kt)("td",{parentName:"tr",align:null},"Used by the indexing service to store supervisor configurations."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_supervisors"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.metadata.storage.tables.audit")),(0,i.kt)("td",{parentName:"tr",align:null},"The table to use for audit history of configuration changes, such as Coordinator rules."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid_audit"))))),(0,i.kt)("h3",{id:"deep-storage"},"Deep storage"),(0,i.kt)("p",null,"The configurations concern how to push and pull ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/segments"},"Segments")," from deep storage."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.type")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of deep storage to use. One of ",(0,i.kt)("inlineCode",{parentName:"td"},"local"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"noop"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"s3"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"hdfs"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"c*"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"local")))),(0,i.kt)("h4",{id:"local-deep-storage"},"Local deep storage"),(0,i.kt)("p",null,"Local deep storage uses the local filesystem."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.storageDirectory")),(0,i.kt)("td",{parentName:"tr",align:null},"Directory on disk to use as deep storage."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"/tmp/druid/localStorage"))))),(0,i.kt)("h4",{id:"noop-deep-storage"},"Noop deep storage"),(0,i.kt)("p",null,"This deep storage doesn't do anything. There are no configs."),(0,i.kt)("h4",{id:"s3-deep-storage"},"S3 deep storage"),(0,i.kt)("p",null,"This deep storage is used to interface with Amazon's S3. Note that the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid-s3-extensions")," extension must be loaded.\nThe below table shows some important configurations for S3. See ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/development/extensions-core/s3"},"S3 Deep Storage")," for full configurations."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.bucket")),(0,i.kt)("td",{parentName:"tr",align:null},"S3 bucket name."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.baseKey")),(0,i.kt)("td",{parentName:"tr",align:null},"S3 object key prefix for storage."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.disableAcl")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for ACL. If this is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"false"),", the full control would be granted to the bucket owner. This may require to set additional permissions. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/development/extensions-core/s3#s3-permissions-settings"},"S3 permissions settings"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.archiveBucket")),(0,i.kt)("td",{parentName:"tr",align:null},"S3 bucket name for archiving when running the ",(0,i.kt)("em",{parentName:"td"},"archive task"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.archiveBaseKey")),(0,i.kt)("td",{parentName:"tr",align:null},"S3 object key prefix for archiving."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.sse.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Server-side encryption type. Should be one of ",(0,i.kt)("inlineCode",{parentName:"td"},"s3"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"kms"),", and ",(0,i.kt)("inlineCode",{parentName:"td"},"custom"),". See the below ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/development/extensions-core/s3#server-side-encryption"},"Server-side encryption section")," for more details."),(0,i.kt)("td",{parentName:"tr",align:null},"None")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.sse.kms.keyId")),(0,i.kt)("td",{parentName:"tr",align:null},"AWS KMS key ID. This is used only when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.sse.type")," is ",(0,i.kt)("inlineCode",{parentName:"td"},"kms")," and can be empty to use the default key ID."),(0,i.kt)("td",{parentName:"tr",align:null},"None")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.sse.custom.base64EncodedKey")),(0,i.kt)("td",{parentName:"tr",align:null},"Base64-encoded key. Should be specified if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.sse.type")," is ",(0,i.kt)("inlineCode",{parentName:"td"},"custom"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"None")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.useS3aSchema")),(0,i.kt)("td",{parentName:"tr",align:null},'If true, use the "s3a" filesystem when using Hadoop-based ingestion. If false, the "s3n" filesystem will be used. Only affects Hadoop-based ingestion.'),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h4",{id:"hdfs-deep-storage"},"HDFS deep storage"),(0,i.kt)("p",null,"This deep storage is used to interface with HDFS. You must load the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid-hdfs-storage")," extension."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.storageDirectory")),(0,i.kt)("td",{parentName:"tr",align:null},"HDFS directory to use as deep storage."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h4",{id:"cassandra-deep-storage"},"Cassandra deep storage"),(0,i.kt)("p",null,"This deep storage is used to interface with Cassandra. You must load the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid-cassandra-storage")," extension."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.host")),(0,i.kt)("td",{parentName:"tr",align:null},"Cassandra host."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.storage.keyspace")),(0,i.kt)("td",{parentName:"tr",align:null},"Cassandra key space."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h4",{id:"centralized-datasource-schema"},"Centralized datasource schema"),(0,i.kt)("p",null,"Centralized datasource schema is an ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/development/experimental"},"experimental feature")," to centralized datasource schema building within the Coordinator.\nTraditionally, the datasource schema is built in the Brokers by combining schema for all the available segments of a datasource.\nBrokers issue segment metadata query to data nodes and tasks to fetch segment schema.\nIn the new arrangement, tasks publish segment schema along with segment metadata to the database and schema for realtime segments is periodically pushed to the Coordinator in the segment announcement flow.\nThis enables Coordinator to cache segment schemas and build datasource schema by combining segment schema.\nBrokers query the datasource schema from the Coordinator, while retaining the ability to build table schema if the\nneed arises."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.centralizedDatasourceSchema.enabled")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for enabling datasource schema building in the Coordinator, this should be specified in the common runtime properties."),(0,i.kt)("td",{parentName:"tr",align:null},"false"),(0,i.kt)("td",{parentName:"tr",align:null},"No.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.fork.property.druid.centralizedDatasourceSchema.enabled")),(0,i.kt)("td",{parentName:"tr",align:null},"This config should be set when CentralizedDatasourceSchema feature is enabled. This should be specified in the Middle Manager runtime properties."),(0,i.kt)("td",{parentName:"tr",align:null},"false"),(0,i.kt)("td",{parentName:"tr",align:null},"No.")))),(0,i.kt)("p",null,"If you enable this feature, you can query datasources that are only stored in deep storage and are not loaded on a Historical. For more information, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/query-deep-storage"},"Query from deep storage"),"."),(0,i.kt)("p",null,"For stale schema cleanup configs, refer to properties with the prefix ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.coordinator.kill.segmentSchema")," in ",(0,i.kt)("a",{parentName:"p",href:"#metadata-management"},"Metadata Management"),". "),(0,i.kt)("h3",{id:"ingestion-security-configuration"},"Ingestion security configuration"),(0,i.kt)("h4",{id:"hdfs-input-source"},"HDFS input source"),(0,i.kt)("p",null,"You can set the following property to specify permissible protocols for\nthe ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/input-sources#hdfs-input-source"},"HDFS input source"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.ingestion.hdfs.allowedProtocols")),(0,i.kt)("td",{parentName:"tr",align:null},"List of protocols"),(0,i.kt)("td",{parentName:"tr",align:null},"Allowed protocols for the HDFS input source."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'["hdfs"]'))))),(0,i.kt)("h4",{id:"http-input-source"},"HTTP input source"),(0,i.kt)("p",null,"You can set the following property to specify permissible protocols for\nthe ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/input-sources#http-input-source"},"HTTP input source"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.ingestion.http.allowedProtocols")),(0,i.kt)("td",{parentName:"tr",align:null},"List of protocols"),(0,i.kt)("td",{parentName:"tr",align:null},"Allowed protocols for the HTTP input source."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'["http", "https"]'))))),(0,i.kt)("h3",{id:"external-data-access-security-configuration"},"External data access security configuration"),(0,i.kt)("h4",{id:"jdbc-connections-to-external-databases"},"JDBC connections to external databases"),(0,i.kt)("p",null,"You can use the following properties to specify permissible JDBC options for:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/31.0.0/ingestion/input-sources#sql-input-source"},"SQL input source")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/31.0.0/querying/lookups-cached-global#jdbc-lookup"},"globally cached JDBC lookups")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/31.0.0/development/extensions-core/druid-lookups#data-fetcher-layer"},"JDBC Data Fetcher for per-lookup caching"),".")),(0,i.kt)("p",null,"These properties do not apply to metadata storage connections."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.access.jdbc.enforceAllowedProperties")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"When true, Druid applies ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.access.jdbc.allowedProperties")," to JDBC connections starting with ",(0,i.kt)("inlineCode",{parentName:"td"},"jdbc:postgresql:"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"jdbc:mysql:"),", or ",(0,i.kt)("inlineCode",{parentName:"td"},"jdbc:mariadb:"),". When false, Druid allows any kind of JDBC connections without JDBC property validation. This config is for backward compatibility especially during upgrades since enforcing allow list can break existing ingestion jobs or lookups based on JDBC. This config is deprecated and will be removed in a future release."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.access.jdbc.allowedProperties")),(0,i.kt)("td",{parentName:"tr",align:null},"List of JDBC properties"),(0,i.kt)("td",{parentName:"tr",align:null},"Defines a list of allowed JDBC properties. Druid always enforces the list for all JDBC connections starting with ",(0,i.kt)("inlineCode",{parentName:"td"},"jdbc:postgresql:"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"jdbc:mysql:"),", and ",(0,i.kt)("inlineCode",{parentName:"td"},"jdbc:mariadb:")," if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.access.jdbc.enforceAllowedProperties")," is set to true.",(0,i.kt)("br",null),(0,i.kt)("br",null),"This option is tested against MySQL connector 8.2.0, MariaDB connector 2.7.4, and PostgreSQL connector 42.2.14. Other connector versions might not work."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'["useSSL", "requireSSL", "ssl", "sslmode"]'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.access.jdbc.allowUnknownJdbcUrlFormat")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"When false, Druid only accepts JDBC connections starting with ",(0,i.kt)("inlineCode",{parentName:"td"},"jdbc:postgresql:")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"jdbc:mysql:"),". When true, Druid allows JDBC connections to any kind of database, but only enforces ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.access.jdbc.allowedProperties")," for PostgreSQL and MySQL/MariaDB."),(0,i.kt)("td",{parentName:"tr",align:null},"true")))),(0,i.kt)("h3",{id:"task-logging"},"Task logging"),(0,i.kt)("p",null,"You can use the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.indexer")," configuration to set a ",(0,i.kt)("a",{parentName:"p",href:"#log-long-term-storage"},"long-term storage")," location for task log files, and to set a ",(0,i.kt)("a",{parentName:"p",href:"#log-retention-policy"},"retention policy"),"."),(0,i.kt)("p",null,"For more information about ingestion tasks and the services of generating logs, see the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/tasks"},"task reference"),"."),(0,i.kt)("h4",{id:"log-long-term-storage"},"Log long-term storage"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Where to store task logs. ",(0,i.kt)("inlineCode",{parentName:"td"},"noop"),", ",(0,i.kt)("a",{parentName:"td",href:"#s3-task-logs"},(0,i.kt)("inlineCode",{parentName:"a"},"s3")),", ",(0,i.kt)("a",{parentName:"td",href:"#azure-blob-store-task-logs"},(0,i.kt)("inlineCode",{parentName:"a"},"azure")),", ",(0,i.kt)("a",{parentName:"td",href:"#google-cloud-storage-task-logs"},(0,i.kt)("inlineCode",{parentName:"a"},"google")),", ",(0,i.kt)("a",{parentName:"td",href:"#hdfs-task-logs"},(0,i.kt)("inlineCode",{parentName:"a"},"hdfs")),", ",(0,i.kt)("a",{parentName:"td",href:"#file-task-logs"},(0,i.kt)("inlineCode",{parentName:"a"},"file"))),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"file"))))),(0,i.kt)("h5",{id:"file-task-logs"},"File task logs"),(0,i.kt)("p",null,"Store task logs in the local filesystem."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.directory")),(0,i.kt)("td",{parentName:"tr",align:null},"Local filesystem path."),(0,i.kt)("td",{parentName:"tr",align:null},"log")))),(0,i.kt)("h5",{id:"s3-task-logs"},"S3 task logs"),(0,i.kt)("p",null,"Store task logs in S3. Note that the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid-s3-extensions")," extension must be loaded."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.s3Bucket")),(0,i.kt)("td",{parentName:"tr",align:null},"S3 bucket name."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.s3Prefix")),(0,i.kt)("td",{parentName:"tr",align:null},"S3 key prefix."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.disableAcl")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for ACL. If this is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"false"),", the full control would be granted to the bucket owner. If the task logs bucket is the same as the deep storage (S3) bucket, then the value of this property will need to be set to true if druid.storage.disableAcl has been set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h5",{id:"azure-blob-store-task-logs"},"Azure Blob Store task logs"),(0,i.kt)("p",null,"Store task logs in Azure Blob Store. To enable this feature, load the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid-azure-extensions")," extension, and configure deep storage for Azure. Druid uses the same authentication method configured for deep storage and stores task logs in the same storage account (set in ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.azure.account"),")."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.container")),(0,i.kt)("td",{parentName:"tr",align:null},"The Azure Blob Store container to write logs to."),(0,i.kt)("td",{parentName:"tr",align:null},"Must be set.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.prefix")),(0,i.kt)("td",{parentName:"tr",align:null},"The path to prepend to logs."),(0,i.kt)("td",{parentName:"tr",align:null},"Must be set.")))),(0,i.kt)("h5",{id:"google-cloud-storage-task-logs"},"Google Cloud Storage task logs"),(0,i.kt)("p",null,"Store task logs in Google Cloud Storage."),(0,i.kt)("p",null,"Note: The ",(0,i.kt)("inlineCode",{parentName:"p"},"druid-google-extensions")," extension must be loaded, and this uses the same storage settings as the deep storage module for google."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.bucket")),(0,i.kt)("td",{parentName:"tr",align:null},"The Google Cloud Storage bucket to write logs to"),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.prefix")),(0,i.kt)("td",{parentName:"tr",align:null},"The path to prepend to logs"),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h5",{id:"hdfs-task-logs"},"HDFS task logs"),(0,i.kt)("p",null,"Store task logs in HDFS. Note that the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid-hdfs-storage")," extension must be loaded."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.directory")),(0,i.kt)("td",{parentName:"tr",align:null},"The directory to store logs."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h4",{id:"log-retention-policy"},"Log retention policy"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.kill.enabled")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether to enable deletion of old task logs. If set to true, Overlord will submit kill tasks periodically based on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.kill.delay")," specified, which will delete task logs from the log directory as well as tasks and tasklogs table entries in metadata storage except for tasks created in the last ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.kill.durationToRetain")," period."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.kill.durationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"Required if kill is enabled. In milliseconds, task logs and entries in task-related metadata storage tables to be retained created in last x milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},"None")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.kill.initialDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"Optional. Number of milliseconds after Overlord start when first auto kill is run."),(0,i.kt)("td",{parentName:"tr",align:null},"random value less than 300000 (5 mins)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.logs.kill.delay")),(0,i.kt)("td",{parentName:"tr",align:null},"Optional. Number of milliseconds of delay between successive executions of auto kill run."),(0,i.kt)("td",{parentName:"tr",align:null},"21600000 (6 hours)")))),(0,i.kt)("h3",{id:"api-error-response"},"API error response"),(0,i.kt)("p",null,"You can configure Druid API error responses to hide internal information like the Druid class name, stack trace, thread name, servlet name, code, line/column number, host, or IP address."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.showDetailedJettyErrors")),(0,i.kt)("td",{parentName:"tr",align:null},"When set to true, any error from the Jetty layer / Jetty filter includes the following fields in the JSON response: ",(0,i.kt)("inlineCode",{parentName:"td"},"servlet"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"message"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"url"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"status"),", and ",(0,i.kt)("inlineCode",{parentName:"td"},"cause"),", if it exists. When set to false, the JSON response only includes ",(0,i.kt)("inlineCode",{parentName:"td"},"message"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"url"),", and ",(0,i.kt)("inlineCode",{parentName:"td"},"status"),". The field values remain unchanged."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.errorResponseTransform.strategy")),(0,i.kt)("td",{parentName:"tr",align:null},"Error response transform strategy. The strategy controls how Druid transforms error responses from Druid services. When unset or set to ",(0,i.kt)("inlineCode",{parentName:"td"},"none"),", Druid leaves error responses unchanged."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"none"))))),(0,i.kt)("h4",{id:"error-response-transform-strategy"},"Error response transform strategy"),(0,i.kt)("p",null,"You can use an error response transform strategy to transform error responses from within Druid services to hide internal information.\nWhen you specify an error response transform strategy other than ",(0,i.kt)("inlineCode",{parentName:"p"},"none"),", Druid transforms the error responses from Druid services as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"For any query API that fails in the Router service, Druid sets the fields ",(0,i.kt)("inlineCode",{parentName:"li"},"errorClass")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"host")," to null. Druid applies the transformation strategy to the ",(0,i.kt)("inlineCode",{parentName:"li"},"errorMessage")," field."),(0,i.kt)("li",{parentName:"ul"},"For any SQL query API that fails, for example ",(0,i.kt)("inlineCode",{parentName:"li"},"POST /druid/v2/sql/..."),", Druid sets the fields ",(0,i.kt)("inlineCode",{parentName:"li"},"errorClass")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"host")," to null. Druid applies the transformation strategy to the ",(0,i.kt)("inlineCode",{parentName:"li"},"errorMessage")," field."),(0,i.kt)("li",{parentName:"ul"},"For any JDBC related exceptions, Druid will turn all checked exceptions into ",(0,i.kt)("inlineCode",{parentName:"li"},"QueryInterruptedException")," otherwise druid will attempt to keep the exception as the same type. For example if the original exception isn't owned by Druid it will become ",(0,i.kt)("inlineCode",{parentName:"li"},"QueryInterruptedException"),". Druid applies the transformation strategy to the ",(0,i.kt)("inlineCode",{parentName:"li"},"errorMessage")," field.")),(0,i.kt)("h5",{id:"no-error-response-transform-strategy"},"No error response transform strategy"),(0,i.kt)("p",null,"In this mode, Druid leaves error responses from underlying services unchanged and returns the unchanged errors to the API client.\nThis is the default Druid error response mode. To explicitly enable this strategy, set ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.server.http.errorResponseTransform.strategy")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"none"),"."),(0,i.kt)("h5",{id:"allowed-regular-expression-error-response-transform-strategy"},"Allowed regular expression error response transform strategy"),(0,i.kt)("p",null,"In this mode, Druid validates the error responses from underlying services against a list of regular expressions. Only error messages that match a configured regular expression are returned. To enable this strategy, set ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.server.http.errorResponseTransform.strategy")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"allowedRegex"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.errorResponseTransform.allowedRegex")),(0,i.kt)("td",{parentName:"tr",align:null},"The list of regular expressions Druid uses to validate error messages. If the error message matches any of the regular expressions, then Druid includes it in the response unchanged. If the error message does not match any of the regular expressions, Druid replaces the error message with null or with a default message depending on the type of underlying Exception."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"[]"))))),(0,i.kt)("p",null,"For example, consider the following error response:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{"error":"Plan validation failed","errorMessage":"org.apache.calcite.runtime.CalciteContextException: From line 1, column 15 to line 1, column 38: Object \'nonexistent-datasource\' not found","errorClass":"org.apache.calcite.tools.ValidationException","host":null}\n')),(0,i.kt)("p",null,"If ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.server.http.errorResponseTransform.allowedRegex")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"[]"),", Druid transforms the query error response to the following:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{"error":"Plan validation failed","errorMessage":null,"errorClass":null,"host":null}\n')),(0,i.kt)("p",null,"On the other hand, if ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.server.http.errorResponseTransform.allowedRegex")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},'[".*CalciteContextException.*"]')," then Druid transforms the query error response to the following:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{"error":"Plan validation failed","errorMessage":"org.apache.calcite.runtime.CalciteContextException: From line 1, column 15 to line 1, column 38: Object \'nonexistent-datasource\' not found","errorClass":null,"host":null}\n')),(0,i.kt)("h3",{id:"overlord-discovery"},"Overlord discovery"),(0,i.kt)("p",null,"This config is used to find the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/overlord"},"Overlord")," using Curator service discovery. Only required if you are actually running an Overlord."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.selectors.indexing.serviceName")),(0,i.kt)("td",{parentName:"tr",align:null},"The druid.service name of the Overlord service. To start the Overlord with a different name, set it with this property."),(0,i.kt)("td",{parentName:"tr",align:null},"druid/overlord")))),(0,i.kt)("h3",{id:"coordinator-discovery"},"Coordinator discovery"),(0,i.kt)("p",null,"This config is used to find the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/coordinator"},"Coordinator")," using Curator service discovery. This config is used by the realtime indexing services to get information about the segments loaded in the cluster."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.selectors.coordinator.serviceName")),(0,i.kt)("td",{parentName:"tr",align:null},"The druid.service name of the Coordinator service. To start the Coordinator with a different name, set it with this property."),(0,i.kt)("td",{parentName:"tr",align:null},"druid/coordinator")))),(0,i.kt)("h3",{id:"announcing-segments"},"Announcing segments"),(0,i.kt)("p",null,"You can configure how to announce and unannounce Znodes in ZooKeeper (using Curator). For normal operations you do not need to override any of these configs."),(0,i.kt)("h4",{id:"batch-data-segment-announcer"},"Batch data segment announcer"),(0,i.kt)("p",null,"In current Druid, multiple data segments may be announced under the same Znode."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.announcer.segmentsPerNode")),(0,i.kt)("td",{parentName:"tr",align:null},"Each Znode contains info for up to this many segments."),(0,i.kt)("td",{parentName:"tr",align:null},"50")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.announcer.maxBytesPerNode")),(0,i.kt)("td",{parentName:"tr",align:null},"Max byte size for Znode. Allowed range is ","[1024, 1048576]","."),(0,i.kt)("td",{parentName:"tr",align:null},"524288")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.announcer.skipDimensionsAndMetrics")),(0,i.kt)("td",{parentName:"tr",align:null},"Skip Dimensions and Metrics list from segment announcements. NOTE: Enabling this will also remove the dimensions and metrics list from Coordinator and Broker endpoints."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.announcer.skipLoadSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Skip segment LoadSpec from segment announcements. NOTE: Enabling this will also remove the loadspec from Coordinator and Broker endpoints."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("p",null,"If you want to turn off the batch data segment announcer, you can add a property to skip announcing segments. ",(0,i.kt)("strong",{parentName:"p"},"You do not want to enable this config if you have any services using ",(0,i.kt)("inlineCode",{parentName:"strong"},"batch")," for ",(0,i.kt)("inlineCode",{parentName:"strong"},"druid.serverview.type"))),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.announcer.skipSegmentAnnouncementOnZk")),(0,i.kt)("td",{parentName:"tr",align:null},"Skip announcing segments to ZooKeeper. Note that the batch server view will not work if this is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h3",{id:"javascript"},"JavaScript"),(0,i.kt)("p",null,"Druid supports dynamic runtime extension through JavaScript functions. This functionality can be configured through\nthe following properties."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.javascript.enabled")),(0,i.kt)("td",{parentName:"tr",align:null},'Set to "true" to enable JavaScript functionality. This affects the JavaScript parser, filter, extractionFn, aggregator, post-aggregator, router strategy, and worker selection strategy.'),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"}," JavaScript-based functionality is disabled by default. Please refer to the Druid ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/development/javascript"},"JavaScript programming guide")," for guidelines about using Druid's JavaScript functionality, including instructions on how to enable it.")),(0,i.kt)("h3",{id:"double-column-storage"},"Double column storage"),(0,i.kt)("p",null,"Prior to version 0.13.0, Druid's storage layer used a 32-bit float representation to store columns created by the\ndoubleSum, doubleMin, and doubleMax aggregators at indexing time.\nStarting from version 0.13.0 the default will be 64-bit floats for Double columns.\nUsing 64-bit representation for double column will lead to avoid precision loss at the cost of doubling the storage size of such columns.\nTo keep the old format set the system-wide property ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.indexing.doubleStorage=float"),".\nYou can also use ",(0,i.kt)("inlineCode",{parentName:"p"},"floatSum"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"floatMin"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"floatMax")," to use 32-bit float representation.\nSupport for 64-bit floating point columns was released in Druid 0.11.0, so if you use this feature then older versions of Druid will not be able to read your data segments."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexing.doubleStorage")),(0,i.kt)("td",{parentName:"tr",align:null},'Set to "float" to use 32-bit double representation for double columns.'),(0,i.kt)("td",{parentName:"tr",align:null},"double")))),(0,i.kt)("h3",{id:"sql-compatible-null-handling"},"SQL compatible null handling"),(0,i.kt)("p",null,"These configurations are deprecated and will be removed in a future release at which point Druid will always have SQl compatible null handling."),(0,i.kt)("p",null,"Prior to version 0.13.0, Druid string columns treated ",(0,i.kt)("inlineCode",{parentName:"p"},"''")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"null")," values as interchangeable, and numeric columns were unable to represent ",(0,i.kt)("inlineCode",{parentName:"p"},"null")," values, coercing ",(0,i.kt)("inlineCode",{parentName:"p"},"null")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),". Druid 0.13.0 introduced a mode which enabled SQL compatible null handling, allowing string columns to distinguish empty strings from nulls, and numeric columns to contain null rows."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.generic.useDefaultValueForNull")),(0,i.kt)("td",{parentName:"tr",align:null},"Set to ",(0,i.kt)("inlineCode",{parentName:"td"},"false")," to store and query data in SQL compatible mode. This configuration has been deprecated and will be removed in a future release, taking on the ",(0,i.kt)("inlineCode",{parentName:"td"},"false")," behavior. When set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," (deprecated legacy mode), ",(0,i.kt)("inlineCode",{parentName:"td"},"null")," values will be stored as ",(0,i.kt)("inlineCode",{parentName:"td"},"''")," for string columns and ",(0,i.kt)("inlineCode",{parentName:"td"},"0")," for numeric columns."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.generic.useThreeValueLogicForNativeFilters")),(0,i.kt)("td",{parentName:"tr",align:null},"Set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," to use SQL compatible three-value logic when processing native Druid filters when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.generic.useDefaultValueForNull=false")," and ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.expressions.useStrictBooleans=true"),". This configuration has been deprecated and will be removed in a future release, taking on the ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," behavior. When set to ",(0,i.kt)("inlineCode",{parentName:"td"},"false")," Druid uses 2 value logic for filter processing, even when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.generic.useDefaultValueForNull=false")," and ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.expressions.useStrictBooleans=true"),". See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/sql-data-types#boolean-logic"},"boolean handling")," for more details"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.generic.ignoreNullsForStringCardinality")),(0,i.kt)("td",{parentName:"tr",align:null},"When set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"null")," values will be ignored for the built-in cardinality aggregator over string columns. Set to ",(0,i.kt)("inlineCode",{parentName:"td"},"false")," to include ",(0,i.kt)("inlineCode",{parentName:"td"},"null")," values while estimating cardinality of only string columns using the built-in cardinality aggregator. This setting takes effect only when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.generic.useDefaultValueForNull")," is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," and is ignored in SQL compatibility mode. Additionally, empty strings (equivalent to null) are not counted when this is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),". This configuration has been deprecated and will be removed in a future release since it has no effect when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.generic.useDefaultValueForNull=false"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))))),(0,i.kt)("p",null,"This mode does have a storage size and query performance cost, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/segments#handling-null-values"},"segment documentation")," for more details."),(0,i.kt)("h3",{id:"http-client"},"HTTP client"),(0,i.kt)("p",null,"All Druid components can communicate with each other over HTTP."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.numConnections")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of connection pool per destination URL. If there are more HTTP requests than this number that all need to speak to the same URL, then they will queue up."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"20"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.eagerInitialization")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicates that http connections should be eagerly initialized. If set to true, ",(0,i.kt)("inlineCode",{parentName:"td"},"numConnections")," connections are created upon initialization"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.compressionCodec")),(0,i.kt)("td",{parentName:"tr",align:null},'Compression codec to communicate with others. May be "gzip" or "identity".'),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"gzip"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.readTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout for data reads."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT15M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.unusedConnectionTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout for idle connections in connection pool. The connection in the pool will be closed after this timeout and a new one will be established. This timeout should be less than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.readTimeout"),". Set this timeout = ~90% of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.readTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT4M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.numMaxThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of I/O worker threads"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"max(10, ((number of cores * 17) / 16 + 2) + 30)"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.global.http.clientConnectTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout (in milliseconds) for establishing client connections."),(0,i.kt)("td",{parentName:"tr",align:null},"500")))),(0,i.kt)("h3",{id:"common-endpoints-configuration"},"Common endpoints configuration"),(0,i.kt)("p",null,"This section contains the configuration options for endpoints that are supported by all services."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.hiddenProperties")),(0,i.kt)("td",{parentName:"tr",align:null},"If property names or substring of property names (case insensitive) is in this list, responses of the ",(0,i.kt)("inlineCode",{parentName:"td"},"/status/properties")," endpoint do not show these properties"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'["druid.s3.accessKey","druid.s3.secretKey","druid.metadata.storage.connector.password", "password", "key", "token", "pwd"]'))))),(0,i.kt)("h2",{id:"master-server"},"Master server"),(0,i.kt)("p",null,"This section contains the configuration options for the services that reside on Master servers (Coordinators and Overlords) in the suggested ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/architecture#druid-servers"},"three-server configuration"),"."),(0,i.kt)("h3",{id:"coordinator"},"Coordinator"),(0,i.kt)("p",null,"For general Coordinator services information, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/coordinator"},"Coordinator service"),"."),(0,i.kt)("h4",{id:"static-configuration"},"Static Configuration"),(0,i.kt)("p",null,"These Coordinator static configurations can be defined in the ",(0,i.kt)("inlineCode",{parentName:"p"},"coordinator/runtime.properties")," file."),(0,i.kt)("h5",{id:"coordinator-service-config"},"Coordinator service config"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"The host for the current service. This is used to advertise the current service location as reachable from another service and should generally be specified such that ",(0,i.kt)("inlineCode",{parentName:"td"},"http://${druid.host}/")," could actually talk to this service."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"InetAddress.getLocalHost().getCanonicalHostName()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.bindOnHost")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicating whether the service's internal jetty server bind on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host"),". Default is false, which means binding to all interfaces."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.plaintextPort")),(0,i.kt)("td",{parentName:"tr",align:null},"This is the port to actually listen on; unless port mapping is used, this will be the same port as is on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"8081")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.tlsPort")),(0,i.kt)("td",{parentName:"tr",align:null},"TLS port for HTTPS connector, if ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/tls-support"},"druid.enableTlsPort")," is set then this config will be used. If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")," contains port then that port will be ignored. This should be a non-negative integer."),(0,i.kt)("td",{parentName:"tr",align:null},"8281")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.service")),(0,i.kt)("td",{parentName:"tr",align:null},"The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid/coordinator"))))),(0,i.kt)("h5",{id:"coordinator-operation"},"Coordinator operation"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period")),(0,i.kt)("td",{parentName:"tr",align:null},'The run period for the Coordinator. The Coordinator operates by maintaining the current state of the world in memory and periodically looking at the set of "used" segments and segments being served to make decisions about whether any changes need to be made to the data topology. This property sets the delay between each of these runs.'),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT60S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.indexingPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to send compact/merge/conversion tasks to the indexing service. It's recommended to be longer than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.segments.pollDuration")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1800S")," (30 mins)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.startDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"The operation of the Coordinator works on the assumption that it has an up-to-date view of the state of the world when it runs, the current ZooKeeper interaction code, however, is written in a way that doesn\u2019t allow the Coordinator to know for a fact that it\u2019s done loading the current state of the world. This delay is a hack to give it enough time to believe that it has all the data."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT300S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.load.timeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout duration for when the Coordinator assigns a segment to a Historical service."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT15M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.pendingSegments.on")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for whether or not the Coordinator clean up old entries in the ",(0,i.kt)("inlineCode",{parentName:"td"},"pendingSegments")," table of metadata store. If set to true, Coordinator will check the created time of most recently complete task. If it doesn't exist, it finds the created time of the earliest running/pending/waiting tasks. Once the created time is found, then for all datasources not in the ",(0,i.kt)("inlineCode",{parentName:"td"},"killPendingSegmentsSkipList")," (see ",(0,i.kt)("a",{parentName:"td",href:"#dynamic-configuration"},"Dynamic configuration"),"), Coordinator will ask the Overlord to clean up the entries 1 day or more older than the found created time in the ",(0,i.kt)("inlineCode",{parentName:"td"},"pendingSegments")," table. This will be done periodically based on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.indexingPeriod")," specified."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.on")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for whether or not the Coordinator should submit kill task for unused segments, that is, permanently delete them from metadata store and deep storage. If set to true, then for all whitelisted datasources (or optionally all), Coordinator will submit tasks periodically based on ",(0,i.kt)("inlineCode",{parentName:"td"},"period")," specified. A whitelist can be set via dynamic configuration ",(0,i.kt)("inlineCode",{parentName:"td"},"killDataSourceWhitelist")," described later.",(0,i.kt)("br",null),(0,i.kt)("br",null),"When ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.on")," is true, segments are eligible for permanent deletion once their data intervals are older than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.durationToRetain")," relative to the current time. If a segment's data interval is older than this threshold at the time it is marked unused, it is eligible for permanent deletion immediately after being marked unused."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.period")),(0,i.kt)("td",{parentName:"tr",align:null},"The frequency of sending kill tasks to the indexing service. The value must be greater than or equal to ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.indexingPeriod"),". Only applies if kill is turned on."),(0,i.kt)("td",{parentName:"tr",align:null},"Same as ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.indexingPeriod"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.durationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"Only applies if you set ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.on")," to ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),". This value is ignored if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.ignoreDurationToRetain")," is ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),". Valid configurations must be a ISO8601 period. Druid will not kill unused segments whose interval end date is beyond ",(0,i.kt)("inlineCode",{parentName:"td"},"now - durationToRetain"),". ",(0,i.kt)("inlineCode",{parentName:"td"},"durationToRetain")," can be a negative ISO8601 period, which would result in ",(0,i.kt)("inlineCode",{parentName:"td"},"now - durationToRetain")," to be in the future.",(0,i.kt)("br",null),(0,i.kt)("br",null),"Note that the ",(0,i.kt)("inlineCode",{parentName:"td"},"durationToRetain")," parameter applies to the segment interval, not the time that the segment was last marked unused. For example, if ",(0,i.kt)("inlineCode",{parentName:"td"},"durationToRetain")," is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"P90D"),", then a segment for a time chunk 90 days in the past is eligible for permanent deletion immediately after being marked unused."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P90D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.ignoreDurationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"A way to override ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.durationToRetain")," and tell the coordinator that you do not care about the end date of unused segment intervals when it comes to killing them. If true, the coordinator considers all unused segments as eligible to be killed."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.bufferPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"The amount of time that a segment must be unused before it is able to be permanently removed from metadata and deep storage. This can serve as a buffer period to prevent data loss if data ends up being needed after being marked unused."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P30D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.maxSegments")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of unused segments to kill per kill task. This number must be greater than 0. This only applies when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.on=true"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"100")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.balancer.strategy")),(0,i.kt)("td",{parentName:"tr",align:null},"Specify the type of balancing strategy for the Coordinator to use to distribute segments among the Historical services. ",(0,i.kt)("inlineCode",{parentName:"td"},"diskNormalized")," weights the costs according to the servers' disk usage ratios - there are known issues with this strategy distributing segments unevenly across the cluster. ",(0,i.kt)("inlineCode",{parentName:"td"},"random")," distributes segments among services randomly."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"cost"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.loadqueuepeon.http.repeatDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"The start and repeat delay (in milliseconds) for the load queue peon, which manages the load/drop queue of segments for any server."),(0,i.kt)("td",{parentName:"tr",align:null},"1 minute")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.loadqueuepeon.http.batchSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of segment load/drop requests to batch in one HTTP request. Note that it must be smaller than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numLoadingThreads")," config on Historical service."),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.asOverlord.enabled")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether this Coordinator service should act like an Overlord as well. This configuration allows users to simplify a Druid cluster by not having to deploy any standalone Overlord services. If set to true, then Overlord console is available at ",(0,i.kt)("inlineCode",{parentName:"td"},"http://coordinator-host:port/console.html")," and be sure to set ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.asOverlord.overlordService")," also."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.asOverlord.overlordService")),(0,i.kt)("td",{parentName:"tr",align:null},"Required, if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.asOverlord.enabled")," is ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),". This must be same value as ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.service")," on standalone Overlord services and ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.selectors.indexing.serviceName")," on Middle Managers."),(0,i.kt)("td",{parentName:"tr",align:null},"NULL")))),(0,i.kt)("h5",{id:"metadata-management"},"Metadata management"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.metadataStoreManagementPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to run metadata management tasks in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1H"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.supervisor.on")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether to enable automatic deletion of terminated supervisors. If set to true, Coordinator will periodically remove terminated supervisors from the supervisor table in metadata storage."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.supervisor.period")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to do automatic deletion of terminated supervisor in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Value must be equal to or greater than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.metadataStoreManagementPeriod"),". Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.supervisor.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P1D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.supervisor.durationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"Duration of terminated supervisor to be retained from created time in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.supervisor.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.supervisor.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P90D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.audit.on")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether to enable automatic deletion of audit logs. If set to true, Coordinator will periodically remove audit logs from the audit table entries in metadata storage."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"True")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.audit.period")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to do automatic deletion of audit logs in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Value must be equal to or greater than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.metadataStoreManagementPeriod"),". Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.audit.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P1D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.audit.durationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"Duration of audit logs to be retained from created time in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.audit.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.audit.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P90D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.compaction.on")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether to enable automatic deletion of compaction configurations. If set to true, Coordinator will periodically remove compaction configuration of inactive datasource (datasource with no used and unused segments) from the config table in metadata storage."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"False")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.compaction.period")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to do automatic deletion of compaction configurations in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Value must be equal to or greater than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.metadataStoreManagementPeriod"),". Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.compaction.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P1D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.rule.on")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether to enable automatic deletion of rules. If set to true, Coordinator will periodically remove rules of inactive datasource (datasource with no used and unused segments) from the rule table in metadata storage."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"True")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.rule.period")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to do automatic deletion of rules in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Value must be equal to or greater than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.metadataStoreManagementPeriod"),". Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.rule.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P1D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.rule.durationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"Duration of rules to be retained from created time in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.rule.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.rule.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P90D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.datasource.on")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether to enable automatic deletion of datasource metadata (Note: datasource metadata only exists for datasource created from supervisor). If set to true, Coordinator will periodically remove datasource metadata of terminated supervisor from the datasource table in metadata storage."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"True")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.datasource.period")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to do automatic deletion of datasource metadata in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Value must be equal to or greater than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.metadataStoreManagementPeriod"),". Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.datasource.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P1D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.datasource.durationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"Duration of datasource metadata to be retained from created time in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.datasource.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.datasource.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P90D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.segmentSchema.on")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether to enable automatic deletion of unused segment schemas. If set to true, Coordinator will periodically identify segment schemas which are not referenced by any used segment and mark them as unused. At a later point, these unused schemas are deleted. Only applies if ",(0,i.kt)("a",{parentName:"td",href:"#centralized-datasource-schema"},"Centralized Datasource schema")," feature is enabled."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},"True")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.segmentSchema.period")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to do automatic deletion of segment schemas in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Value must be equal to or greater than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.period.metadataStoreManagementPeriod"),". Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.segmentSchema.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"No"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P1D"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.segmentSchema.durationToRetain")),(0,i.kt)("td",{parentName:"tr",align:null},"Duration of segment schemas to be retained from the time it was marked as unused in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Only applies if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.segmentSchema.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},"Yes, if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.segmentSchema.on")," is set to true."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P90D"))))),(0,i.kt)("h5",{id:"segment-management"},"Segment management"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.serverview.type")),(0,i.kt)("td",{parentName:"tr",align:null},"batch or http"),(0,i.kt)("td",{parentName:"tr",align:null},'Segment discovery method to use. "http" enables discovering segments using HTTP instead of ZooKeeper.'),(0,i.kt)("td",{parentName:"tr",align:null},"http")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.segment.awaitInitializationOnStart")),(0,i.kt)("td",{parentName:"tr",align:null},"true or false"),(0,i.kt)("td",{parentName:"tr",align:null},"Whether the Coordinator will wait for its view of segments to fully initialize before starting up. If set to 'true', the Coordinator's HTTP server will not start up, and the Coordinator will not announce itself as available, until the server view is initialized."),(0,i.kt)("td",{parentName:"tr",align:null},"true")))),(0,i.kt)("h5",{id:"metadata-retrieval"},"Metadata retrieval"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.config.pollDuration")),(0,i.kt)("td",{parentName:"tr",align:null},"How often the manager polls the config table for updates."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.segments.pollDuration")),(0,i.kt)("td",{parentName:"tr",align:null},"The duration between polls the Coordinator does for updates to the set of active segments. Generally defines the amount of lag time it can take for the Coordinator to notice new segments."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.rules.pollDuration")),(0,i.kt)("td",{parentName:"tr",align:null},"The duration between polls the Coordinator does for updates to the set of active rules. Generally defines the amount of lag time it can take for the Coordinator to notice rules."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.rules.defaultRule")),(0,i.kt)("td",{parentName:"tr",align:null},"The default rule for the cluster"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"_default"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.rules.alertThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"The duration after a failed poll upon which an alert should be emitted."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT10M"))))),(0,i.kt)("h4",{id:"dynamic-configuration"},"Dynamic configuration"),(0,i.kt)("p",null,"The Coordinator has dynamic configurations to tune certain behavior on the fly, without requiring a service restart.\nYou can configure these parameters using the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/web-console"},"web console"),"(recommended) or through the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/dynamic-configuration-api#coordinator-dynamic-configuration"},"Coordinator dynamic configuration API"),"."),(0,i.kt)("p",null,"The following table shows the dynamic configuration properties for the Coordinator."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"millisToWaitBeforeDeleting")),(0,i.kt)("td",{parentName:"tr",align:null},"How long does the Coordinator need to be a leader before it can start marking overshadowed segments as unused in metadata storage."),(0,i.kt)("td",{parentName:"tr",align:null},"900000 (15 mins)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"mergeBytesLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum total uncompressed size in bytes of segments to merge."),(0,i.kt)("td",{parentName:"tr",align:null},"524288000L")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"mergeSegmentsLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of segments that can be in a single ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks"},"append task"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"100")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"smartSegmentLoading")),(0,i.kt)("td",{parentName:"tr",align:null},"Enables ",(0,i.kt)("a",{parentName:"td",href:"#smart-segment-loading"},'"smart" segment loading mode')," which dynamically computes the optimal values of several properties that maximize Coordinator performance."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxSegmentsToMove")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of segments that can be moved in a Historical tier at any given time."),(0,i.kt)("td",{parentName:"tr",align:null},"100")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"replicantLifetime")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of Coordinator runs for which a segment can wait in the load queue of a Historical before Druid raises an alert."),(0,i.kt)("td",{parentName:"tr",align:null},"15")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"replicationThrottleLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of segment replicas that can be assigned to a historical tier in a single Coordinator run. This property prevents Historical services from becoming overwhelmed when loading extra replicas of segments that are already available in the cluster."),(0,i.kt)("td",{parentName:"tr",align:null},"500")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"balancerComputeThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Thread pool size for computing moving cost of segments during segment balancing. Consider increasing this if you have a lot of segments and moving segments begins to stall."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"num_cores")," / 2")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"killDataSourceWhitelist")),(0,i.kt)("td",{parentName:"tr",align:null},"List of specific data sources for which kill tasks are sent if property ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.on")," is true. This can be a list of comma-separated data source names or a JSON array."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"killTaskSlotRatio")),(0,i.kt)("td",{parentName:"tr",align:null},"Ratio of total available task slots, including autoscaling if applicable that will be allowed for kill tasks. This value must be between 0 and 1. Only applicable for kill tasks that are spawned automatically by the coordinator's auto kill duty, which is enabled when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.on")," is true."),(0,i.kt)("td",{parentName:"tr",align:null},"0.1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxKillTaskSlots")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of tasks that will be allowed for kill tasks. This limit only applies for kill tasks that are spawned automatically by the coordinator's auto kill duty, which is enabled when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.on")," is true."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Integer.MAX_VALUE")," - no limit")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"killPendingSegmentsSkipList")),(0,i.kt)("td",{parentName:"tr",align:null},"List of data sources for which pendingSegments are ",(0,i.kt)("em",{parentName:"td"},"NOT")," cleaned up if property ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.kill.pendingSegments.on")," is true. This can be a list of comma-separated data sources or a JSON array."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxSegmentsInNodeLoadingQueue")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of segments allowed in the load queue of any given server. Use this parameter to load segments faster if, for example, the cluster contains slow-loading nodes or if there are too many segments to be replicated to a particular node (when faster loading is preferred to better segments distribution). The optimal value depends on the loading speed of segments, acceptable replication time and number of nodes."),(0,i.kt)("td",{parentName:"tr",align:null},"500")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"useRoundRobinSegmentAssignment")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for whether segments should be assigned to Historical services in a round robin fashion. When disabled, segment assignment is done using the chosen balancer strategy. When enabled, this can speed up segment assignments leaving balancing to move the segments to their optimal locations (based on the balancer strategy) lazily."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"decommissioningNodes")),(0,i.kt)("td",{parentName:"tr",align:null},"List of Historical servers to decommission. Coordinator will not assign new segments to decommissioning servers, and segments will be moved away from them to be placed on non-decommissioning servers at the maximum rate specified by ",(0,i.kt)("inlineCode",{parentName:"td"},"maxSegmentsToMove"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"pauseCoordination")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for whether or not the Coordinator should execute its various duties of coordinating the cluster. Setting this to true essentially pauses all coordination work while allowing the API to remain up. Duties that are paused include all classes that implement the ",(0,i.kt)("inlineCode",{parentName:"td"},"CoordinatorDuty")," interface. Such duties include: segment balancing, segment compaction, submitting kill tasks for unused segments (if enabled), logging of used segments in the cluster, marking of newly unused or overshadowed segments, matching and execution of load/drop rules for used segments, unloading segments that are no longer marked as used from Historical servers. An example of when an admin may want to pause coordination would be if they are doing deep storage maintenance on HDFS name nodes with downtime and don't want the Coordinator to be directing Historical nodes to hit the name node with API requests until maintenance is done and the deep store is declared healthy for use again."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"replicateAfterLoadTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean flag for whether or not additional replication is needed for segments that have failed to load due to the expiry of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.coordinator.load.timeout"),". If this is set to true, the Coordinator will attempt to replicate the failed segment on a different historical server. This helps improve the segment availability if there are a few slow Historicals in the cluster. However, the slow Historical may still load the segment later and the Coordinator may issue drop requests if the segment is over-replicated."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h5",{id:"smart-segment-loading"},"Smart segment loading"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"smartSegmentLoading")," mode simplifies Coordinator configuration for segment loading and balancing.\nIf you enable this mode, do not provide values for the properties in the table below as the Coordinator computes them automatically.\nDruid computes the values to optimize Coordinator performance, based on the current state of the cluster."),(0,i.kt)("p",null,"If you enable ",(0,i.kt)("inlineCode",{parentName:"p"},"smartSegmentLoading")," mode, Druid ignores any value you provide for the following properties."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Computed value"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"useRoundRobinSegmentAssignment")),(0,i.kt)("td",{parentName:"tr",align:null},"true"),(0,i.kt)("td",{parentName:"tr",align:null},"Speeds up segment assignment.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxSegmentsInNodeLoadingQueue")),(0,i.kt)("td",{parentName:"tr",align:null},"0"),(0,i.kt)("td",{parentName:"tr",align:null},"Removes the limit on load queue size.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"replicationThrottleLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"5% of used segments, minimum value 100"),(0,i.kt)("td",{parentName:"tr",align:null},"Prevents aggressive replication when a Historical disappears only intermittently.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"replicantLifetime")),(0,i.kt)("td",{parentName:"tr",align:null},"60"),(0,i.kt)("td",{parentName:"tr",align:null},"Allows segments to wait about an hour (assuming a Coordinator period of 1 minute) in the load queue before an alert is raised. In ",(0,i.kt)("inlineCode",{parentName:"td"},"smartSegmentLoading")," mode, load queues are not limited by size. Segments might therefore assigned to a load queue even if the corresponding server is slow to load them.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxSegmentsToMove")),(0,i.kt)("td",{parentName:"tr",align:null},"2% of used segments, minimum value 100, maximum value 1000"),(0,i.kt)("td",{parentName:"tr",align:null},"Ensures that some segments are always moving in the cluster to keep it well balanced. The maximum value keeps the Coordinator run times bounded.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"balancerComputeThreads")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"num_cores")," / 2"),(0,i.kt)("td",{parentName:"tr",align:null},"Ensures that there are enough threads to perform balancing computations without hogging all Coordinator resources.")))),(0,i.kt)("p",null,"When ",(0,i.kt)("inlineCode",{parentName:"p"},"smartSegmentLoading")," is disabled, Druid uses the configured values of these properties.\nDisable ",(0,i.kt)("inlineCode",{parentName:"p"},"smartSegmentLoading")," only if you want to explicitly set the values of any of the above properties."),(0,i.kt)("h5",{id:"lookups-dynamic-configuration"},"Lookups dynamic configuration"),(0,i.kt)("p",null,"These configuration options control Coordinator lookup management. For configurations that affect lookup propagation, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/lookups#dynamic-configuration"},"Dynamic configuration for lookups"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.lookups.hostDeleteTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait for a ",(0,i.kt)("inlineCode",{parentName:"td"},"DELETE")," request to a particular service before considering the ",(0,i.kt)("inlineCode",{parentName:"td"},"DELETE")," a failure."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.lookups.hostUpdateTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait for a ",(0,i.kt)("inlineCode",{parentName:"td"},"POST")," request to a particular service before considering the ",(0,i.kt)("inlineCode",{parentName:"td"},"POST")," a failure."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT10S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.lookups.deleteAllTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait for all ",(0,i.kt)("inlineCode",{parentName:"td"},"DELETE")," requests to finish before considering the delete attempt a failure."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT10S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.lookups.updateAllTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait for all ",(0,i.kt)("inlineCode",{parentName:"td"},"POST")," requests to finish before considering the attempt a failure."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT60S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.lookups.threadPoolSize")),(0,i.kt)("td",{parentName:"tr",align:null},"How many services can be managed concurrently (concurrent ",(0,i.kt)("inlineCode",{parentName:"td"},"POST")," and ",(0,i.kt)("inlineCode",{parentName:"td"},"DELETE")," requests). Requests this limit will wait in a queue until a slot becomes available."),(0,i.kt)("td",{parentName:"tr",align:null},"10")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.manager.lookups.period")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of milliseconds between checks for configuration changes."),(0,i.kt)("td",{parentName:"tr",align:null},"120000 (2 minutes)")))),(0,i.kt)("h5",{id:"automatic-compaction-dynamic-configuration"},"Automatic compaction dynamic configuration"),(0,i.kt)("p",null,"You can set or update ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/data-management/automatic-compaction"},"automatic compaction")," properties dynamically using the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/automatic-compaction-api"},"Automatic compaction API")," without restarting Coordinators."),(0,i.kt)("p",null,"For details about segment compaction, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/segment-optimization"},"Segment size optimization"),"."),(0,i.kt)("p",null,"You can configure automatic compaction through the following properties:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"dataSource")),(0,i.kt)("td",{parentName:"tr",align:null},"The datasource name to be compacted."),(0,i.kt)("td",{parentName:"tr",align:null},"yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"taskPriority")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#priority"},"Priority")," of compaction task."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 25)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"inputSegmentSizeBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of total segment bytes processed per compaction task. Since a time chunk must be processed in its entirety, if the segments for a particular time chunk have a total size in bytes greater than this parameter, compaction will not run for that time chunk."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 100,000,000,000,000 i.e. 100TB)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"skipOffsetFromLatest")),(0,i.kt)("td",{parentName:"tr",align:null},"The offset for searching segments to be compacted in ",(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/ISO_8601"},"ISO 8601")," duration format. Strongly recommended to set for realtime datasources. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/data-management/compaction#data-handling-with-compaction"},"Data handling with compaction"),"."),(0,i.kt)("td",{parentName:"tr",align:null},'no (default = "P1D")')),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"tuningConfig")),(0,i.kt)("td",{parentName:"tr",align:null},"Tuning config for compaction tasks. See below ",(0,i.kt)("a",{parentName:"td",href:"#automatic-compaction-tuningconfig"},"Automatic compaction tuningConfig"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"taskContext")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#context"},"Task context")," for compaction tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"granularitySpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Custom ",(0,i.kt)("inlineCode",{parentName:"td"},"granularitySpec"),". See ",(0,i.kt)("a",{parentName:"td",href:"#automatic-compaction-granularityspec"},"Automatic compaction granularitySpec"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"dimensionsSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Custom ",(0,i.kt)("inlineCode",{parentName:"td"},"dimensionsSpec"),". See ",(0,i.kt)("a",{parentName:"td",href:"#automatic-compaction-dimensionsspec"},"Automatic compaction dimensionsSpec"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"transformSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Custom ",(0,i.kt)("inlineCode",{parentName:"td"},"transformSpec"),". See ",(0,i.kt)("a",{parentName:"td",href:"#automatic-compaction-transformspec"},"Automatic compaction transformSpec"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"metricsSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Custom ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/ingestion-spec#metricsspec"},(0,i.kt)("inlineCode",{parentName:"a"},"metricsSpec")),". The compaction task preserves any existing metrics regardless of whether ",(0,i.kt)("inlineCode",{parentName:"td"},"metricsSpec")," is specified. If ",(0,i.kt)("inlineCode",{parentName:"td"},"metricsSpec")," is specified, Druid does not reapply any aggregators matching the metric names specified in ",(0,i.kt)("inlineCode",{parentName:"td"},"metricsSpec")," to rows that already have the associated metrics. For rows that do not already have the metric specified in ",(0,i.kt)("inlineCode",{parentName:"td"},"metricsSpec"),", Druid applies the metric aggregator on the source column, then proceeds to combine the metrics across segments as usual. If ",(0,i.kt)("inlineCode",{parentName:"td"},"metricsSpec")," is not specified, Druid automatically discovers the metrics in the existing segments and combines existing metrics with the same metric name across segments. Aggregators for metrics with the same name are assumed to be compatible for combining across segments, otherwise the compaction task may fail."),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"ioConfig")),(0,i.kt)("td",{parentName:"tr",align:null},"IO config for compaction tasks. See ",(0,i.kt)("a",{parentName:"td",href:"#automatic-compaction-ioconfig"},"Automatic compaction ioConfig"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"no")))),(0,i.kt)("p",null,"Automatic compaction config example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "dataSource": "wikiticker",\n "granularitySpec" : {\n "segmentGranularity" : "none"\n }\n}\n')),(0,i.kt)("p",null,"Compaction tasks fail when higher priority tasks cause Druid to revoke their locks. By default, realtime tasks like ingestion have a higher priority than compaction tasks. Frequent conflicts between compaction tasks and realtime tasks can cause the Coordinator's automatic compaction to hang.\nYou may see this issue with streaming ingestion from Kafka and Kinesis, which ingest late-arriving data."),(0,i.kt)("p",null,"To mitigate this problem, set ",(0,i.kt)("inlineCode",{parentName:"p"},"skipOffsetFromLatest")," to a value large enough so that arriving data tends to fall outside the offset value from the current time. This way you can avoid conflicts between compaction tasks and realtime ingestion tasks.\nFor example, if you want to skip over segments from thirty days prior to the end time of the most recent segment, assign ",(0,i.kt)("inlineCode",{parentName:"p"},'"skipOffsetFromLatest": "P30D"'),".\nFor more information, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/data-management/automatic-compaction#avoid-conflicts-with-ingestion"},"Avoid conflicts with ingestion"),"."),(0,i.kt)("h6",{id:"automatic-compaction-tuningconfig"},"Automatic compaction tuningConfig"),(0,i.kt)("p",null,"Auto-compaction supports a subset of the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/native-batch#tuningconfig"},"tuningConfig for Parallel task"),"."),(0,i.kt)("p",null,"The following table shows the supported configurations for auto-compaction."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"type"),(0,i.kt)("td",{parentName:"tr",align:null},"The task type. If you're using Coordinator duties for auto-compaction, set it to ",(0,i.kt)("inlineCode",{parentName:"td"},"index_parallel"),". If you're using compaction supervisors, set it to ",(0,i.kt)("inlineCode",{parentName:"td"},"autocompact"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"yes")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsInMemory")),(0,i.kt)("td",{parentName:"tr",align:null},"Used in determining when intermediate persists to disk should occur. Normally user does not need to set this, but depending on the nature of data, if rows are short in terms of bytes, user may not want to store a million rows in memory and this value should be set."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 1000000)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxBytesInMemory")),(0,i.kt)("td",{parentName:"tr",align:null},"Used in determining when intermediate persists to disk should occur. Normally this is computed internally and user does not need to set it. This value represents number of bytes to aggregate in heap memory before persisting. This is based on a rough estimate of memory usage and not actual usage. The maximum heap memory usage for indexing is ",(0,i.kt)("inlineCode",{parentName:"td"},"maxBytesInMemory")," * (2 + ",(0,i.kt)("inlineCode",{parentName:"td"},"maxPendingPersists"),")"),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 1/6 of max JVM memory)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"splitHintSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Used to give a hint to control the amount of data that each first phase task reads. This hint could be ignored depending on the implementation of the input source. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/native-batch#split-hint-spec"},"Split hint spec")," for more details."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = size-based split hint spec)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"partitionsSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Defines how to partition data in each time chunk, see ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/native-batch#partitionsspec"},(0,i.kt)("inlineCode",{parentName:"a"},"PartitionsSpec"))),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = ",(0,i.kt)("inlineCode",{parentName:"td"},"dynamic"),")")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"indexSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"Defines segment storage format options to be used at indexing time, see ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/ingestion-spec#indexspec"},"IndexSpec")),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"indexSpecForIntermediatePersists")),(0,i.kt)("td",{parentName:"tr",align:null},"Defines segment storage format options to be used at indexing time for intermediate persisted temporary segments. this can be used to disable dimension/metric compression on intermediate segments to reduce memory required for final merging. however, disabling compression on intermediate segments might increase page cache use while they are used before getting merged into final segment published, see ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/ingestion-spec#indexspec"},"IndexSpec")," for possible values."),(0,i.kt)("td",{parentName:"tr",align:null},"no")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxPendingPersists")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of persists that can be pending but not started. If this limit would be exceeded by a new intermediate persist, ingestion will block until the currently-running persist finishes. Maximum heap memory usage for indexing scales with ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsInMemory")," * (2 + ",(0,i.kt)("inlineCode",{parentName:"td"},"maxPendingPersists"),")."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 0, meaning one persist can be running concurrently with ingestion, and none can be queued up)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"pushTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Milliseconds to wait for pushing segments. It must be >= 0, where 0 means to wait forever."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 0)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"segmentWriteOutMediumFactory")),(0,i.kt)("td",{parentName:"tr",align:null},"Segment write-out medium to use when creating segments. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/native-batch#segmentwriteoutmediumfactory"},"SegmentWriteOutMediumFactory"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default is the value from ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.defaultSegmentWriteOutMediumFactory.type")," is used)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxNumConcurrentSubTasks")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of worker tasks which can be run in parallel at the same time. The supervisor task would spawn worker tasks up to ",(0,i.kt)("inlineCode",{parentName:"td"},"maxNumConcurrentSubTasks")," regardless of the current available task slots. If this value is set to 1, the Supervisor task processes data ingestion on its own instead of spawning worker tasks. If this value is set to too large, too many worker tasks can be created which might block other ingestion. Check ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/native-batch#capacity-planning"},"Capacity Planning")," for more details."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 1)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxRetry")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of retries on task failures."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 3)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxNumSegmentsToMerge")),(0,i.kt)("td",{parentName:"tr",align:null},"Max limit for the number of segments that a single task can merge at the same time in the second phase. Used only with ",(0,i.kt)("inlineCode",{parentName:"td"},"hashed")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"single_dim")," partitionsSpec."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 100)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"totalNumMergeTasks")),(0,i.kt)("td",{parentName:"tr",align:null},"Total number of tasks to merge segments in the merge phase when ",(0,i.kt)("inlineCode",{parentName:"td"},"partitionsSpec")," is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"hashed")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"single_dim"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 10)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"taskStatusCheckPeriodMs")),(0,i.kt)("td",{parentName:"tr",align:null},"Polling period in milliseconds to check running task statuses."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 1000)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"chatHandlerTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Timeout for reporting the pushed segments in worker tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = PT10S)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"chatHandlerNumRetries")),(0,i.kt)("td",{parentName:"tr",align:null},"Retries for reporting the pushed segments in worker tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = 5)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"engine")),(0,i.kt)("td",{parentName:"tr",align:null},"Engine for compaction. Can be either ",(0,i.kt)("inlineCode",{parentName:"td"},"native")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"msq"),". ",(0,i.kt)("inlineCode",{parentName:"td"},"msq")," uses the MSQ task engine and is only supported with ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/data-management/automatic-compaction#auto-compaction-using-compaction-supervisors"},"compaction supervisors"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"no (default = native)")))),(0,i.kt)("h6",{id:"automatic-compaction-granularityspec"},"Automatic compaction granularitySpec"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Field"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"segmentGranularity")),(0,i.kt)("td",{parentName:"tr",align:null},"Time chunking period for the segment granularity. Defaults to 'null', which preserves the original segment granularity. Accepts all ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/granularities"},"Query granularity")," values."),(0,i.kt)("td",{parentName:"tr",align:null},"No")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"queryGranularity")),(0,i.kt)("td",{parentName:"tr",align:null},"The resolution of timestamp storage within each segment. Defaults to 'null', which preserves the original query granularity. Accepts all ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/granularities"},"Query granularity")," values."),(0,i.kt)("td",{parentName:"tr",align:null},"No")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"rollup")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether to enable ingestion-time rollup or not. Defaults to null, which preserves the original setting. Note that once data is rollup, individual records can no longer be recovered."),(0,i.kt)("td",{parentName:"tr",align:null},"No")))),(0,i.kt)("h6",{id:"automatic-compaction-dimensionsspec"},"Automatic compaction dimensionsSpec"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Field"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"dimensions")),(0,i.kt)("td",{parentName:"tr",align:null},"A list of dimension names or objects. Defaults to null, which preserves the original dimensions. Note that setting this will cause segments manually compacted with ",(0,i.kt)("inlineCode",{parentName:"td"},"dimensionExclusions")," to be compacted again."),(0,i.kt)("td",{parentName:"tr",align:null},"No")))),(0,i.kt)("h6",{id:"automatic-compaction-transformspec"},"Automatic compaction transformSpec"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Field"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"filter")),(0,i.kt)("td",{parentName:"tr",align:null},"Conditionally filters input rows during compaction. Only rows that pass the filter will be included in the compacted segments. Any of Druid's standard ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/filters"},"query filters")," can be used. Defaults to null, which will not filter any row."),(0,i.kt)("td",{parentName:"tr",align:null},"No")))),(0,i.kt)("h6",{id:"automatic-compaction-ioconfig"},"Automatic compaction ioConfig"),(0,i.kt)("p",null,"Auto-compaction supports a subset of the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/native-batch"},"ioConfig for Parallel task"),".\nThe below is a list of the supported configurations for auto-compaction."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"),(0,i.kt)("th",{parentName:"tr",align:null},"Required"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"dropExisting")),(0,i.kt)("td",{parentName:"tr",align:null},"If ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," the compaction task replaces all existing segments fully contained by the umbrella interval of the compacted segments when the task publishes new segments and tombstones. If compaction fails, Druid does not publish any segments or tombstones. WARNING: this functionality is still in beta. Note that changing this config does not cause intervals to be compacted again."),(0,i.kt)("td",{parentName:"tr",align:null},"false"),(0,i.kt)("td",{parentName:"tr",align:null},"no")))),(0,i.kt)("h3",{id:"overlord"},"Overlord"),(0,i.kt)("p",null,"For general Overlord service information, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/overlord"},"Overlord"),"."),(0,i.kt)("h4",{id:"overlord-static-configuration"},"Overlord static configuration"),(0,i.kt)("p",null,"These Overlord static configurations can be defined in the ",(0,i.kt)("inlineCode",{parentName:"p"},"overlord/runtime.properties")," file."),(0,i.kt)("h5",{id:"overlord-service-configs"},"Overlord service configs"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"The host for the current service. This is used to advertise the current service location as reachable from another service and should generally be specified such that ",(0,i.kt)("inlineCode",{parentName:"td"},"http://${druid.host}/")," could actually talk to this service."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"InetAddress.getLocalHost().getCanonicalHostName()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.bindOnHost")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicating whether the service's internal jetty server bind on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host"),". Default is false, which means binding to all interfaces."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.plaintextPort")),(0,i.kt)("td",{parentName:"tr",align:null},"This is the port to actually listen on; unless port mapping is used, this will be the same port as is on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"8090")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.tlsPort")),(0,i.kt)("td",{parentName:"tr",align:null},"TLS port for HTTPS connector, if ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/tls-support"},"druid.enableTlsPort")," is set then this config will be used. If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")," contains port then that port will be ignored. This should be a non-negative Integer."),(0,i.kt)("td",{parentName:"tr",align:null},"8290")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.service")),(0,i.kt)("td",{parentName:"tr",align:null},"The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid/overlord"))))),(0,i.kt)("h5",{id:"overlord-operations"},"Overlord operations"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicates whether tasks should be run locally using ",(0,i.kt)("inlineCode",{parentName:"td"},"local")," or in a distributed environment using ",(0,i.kt)("inlineCode",{parentName:"td"},"remote"),". The recommended option is ",(0,i.kt)("inlineCode",{parentName:"td"},"httpRemote"),", which is similar to ",(0,i.kt)("inlineCode",{parentName:"td"},"remote")," but uses HTTP to interact with Middle Managers instead of ZooKeeper."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"httpRemote"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.storage.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicates whether incoming tasks should be stored locally (in heap) or in metadata storage. One of ",(0,i.kt)("inlineCode",{parentName:"td"},"local")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"metadata"),". ",(0,i.kt)("inlineCode",{parentName:"td"},"local")," is mainly for internal testing while ",(0,i.kt)("inlineCode",{parentName:"td"},"metadata")," is recommended in production because storing incoming tasks in metadata storage allows for tasks to be resumed if the Overlord should fail."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"local"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.storage.recentlyFinishedThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"Duration of time to store task results. Default is 24 hours. If you have hundreds of tasks running in a day, consider increasing this threshold."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT24H"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.tasklock.forceTimeChunkLock")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"Setting this to false is still experimental"),(0,i.kt)("br",null)," If set, all tasks are enforced to use time chunk lock. If not set, each task automatically chooses a lock type to use. This configuration can be overwritten by setting ",(0,i.kt)("inlineCode",{parentName:"td"},"forceTimeChunkLock")," in the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#context"},"task context"),". See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#context"},"Task Locking & Priority")," for more details about locking in tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.tasklock.batchSegmentAllocation")),(0,i.kt)("td",{parentName:"tr",align:null},"If set to true, Druid performs segment allocate actions in batches to improve throughput and reduce the average ",(0,i.kt)("inlineCode",{parentName:"td"},"task/action/run/time"),". See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#batching-segmentallocate-actions"},"batching ",(0,i.kt)("inlineCode",{parentName:"a"},"segmentAllocate")," actions")," for details."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.tasklock.batchAllocationWaitTime")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of milliseconds after Druid adds the first segment allocate action to a batch, until it executes the batch. Allows the batch to add more requests and improve the average segment allocation run time. This configuration takes effect only if ",(0,i.kt)("inlineCode",{parentName:"td"},"batchSegmentAllocation")," is enabled."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.default.context")),(0,i.kt)("td",{parentName:"tr",align:null},"Default task context that is applied to all tasks submitted to the Overlord. Any default in this config does not override neither the context values the user provides nor ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.tasklock.forceTimeChunkLock"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"empty context")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.queue.maxSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of active tasks at one time."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Integer.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.queue.startDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"Sleep this long before starting Overlord queue management. This can be useful to give a cluster time to re-orient itself (for example, after a widespread network issue)."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.queue.restartDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"Sleep this long when Overlord queue management throws an exception before trying again."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT30S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.queue.storageSyncRate")),(0,i.kt)("td",{parentName:"tr",align:null},"Sync Overlord state this often with an underlying task persistence mechanism."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.queue.maxTaskPayloadSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum allowed size in bytes of a single task payload accepted by the Overlord."),(0,i.kt)("td",{parentName:"tr",align:null},"none (allow all task payload sizes)")))),(0,i.kt)("p",null,"The following configs only apply if the Overlord is running in remote mode. For a description of local vs. remote mode, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/overlord"},"Overlord service"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.taskAssignmentTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait after a task has been assigned to a Middle Manager before throwing an error."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.minWorkerVersion")),(0,i.kt)("td",{parentName:"tr",align:null},"The minimum Middle Manager version to send tasks to. The version number is a string. This affects the expected behavior during certain operations like comparison against ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.version"),". Specifically, the version comparison follows dictionary order. Use ISO8601 date format for the version to accommodate date comparisons."),(0,i.kt)("td",{parentName:"tr",align:null},'"0"')),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.parallelIndexTaskSlotRatio")),(0,i.kt)("td",{parentName:"tr",align:null},"The ratio of task slots available for parallel indexing supervisor tasks per worker. The specified value must be in the range ",(0,i.kt)("inlineCode",{parentName:"td"},"[0, 1]"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.compressZnodes")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicates whether or not the Overlord should expect Middle Managers to compress Znodes."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.maxZnodeBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum size Znode in bytes that can be created in ZooKeeper, should be in the range of ",(0,i.kt)("inlineCode",{parentName:"td"},"[10KiB, 2GiB)"),". ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"Human-readable format")," is supported."),(0,i.kt)("td",{parentName:"tr",align:null},"512 KiB")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.taskCleanupTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait before failing a task after a Middle Manager is disconnected from ZooKeeper."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT15M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.taskShutdownLinkTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait on a shutdown request to a Middle Manager before timing out"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.pendingTasksRunnerNumThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of threads to allocate pending-tasks to workers, must be at least 1."),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.maxRetriesBeforeBlacklist")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of consecutive times the Middle Manager can fail tasks, before the worker is blacklisted, must be at least 1"),(0,i.kt)("td",{parentName:"tr",align:null},"5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.workerBlackListBackoffTime")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait before a task is whitelisted again. This value should be greater that the value set for taskBlackListCleanupPeriod."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT15M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.workerBlackListCleanupPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"A duration after which the cleanup thread will start up to clean blacklisted workers."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.maxPercentageBlacklistWorkers")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum percentage of workers to blacklist, this must be between 0 and 100."),(0,i.kt)("td",{parentName:"tr",align:null},"20")))),(0,i.kt)("p",null,"If autoscaling is enabled, you can set these additional configs:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.strategy")),(0,i.kt)("td",{parentName:"tr",align:null},"Sets the strategy to run when autoscaling is required. One of ",(0,i.kt)("inlineCode",{parentName:"td"},"noop"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"ec2")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"gce"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"noop"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.doAutoscale")),(0,i.kt)("td",{parentName:"tr",align:null},"If set to true, autoscaling will be enabled."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.provisionPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to check whether or not new Middle Managers should be added."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.terminatePeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to check when Middle Managers should be removed."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.originTime")),(0,i.kt)("td",{parentName:"tr",align:null},"The starting reference timestamp that the terminate period increments upon."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"2012-01-01T00:55:00.000Z"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.workerIdleTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"How long can a worker be idle (not a run task) before it can be considered for termination."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT90M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.maxScalingDuration")),(0,i.kt)("td",{parentName:"tr",align:null},"How long the Overlord will wait around for a Middle Manager to show up before giving up."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT15M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.numEventsToTrack")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of autoscaling related events (node creation and termination) to track."),(0,i.kt)("td",{parentName:"tr",align:null},"10")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.pendingTaskTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},'How long a task can be in "pending" state before the Overlord tries to scale up.'),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT30S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.workerVersion")),(0,i.kt)("td",{parentName:"tr",align:null},"If set, will only create nodes of set version during autoscaling. Overrides dynamic configuration."),(0,i.kt)("td",{parentName:"tr",align:null},"null")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.workerPort")),(0,i.kt)("td",{parentName:"tr",align:null},"The port that Middle Managers will run on."),(0,i.kt)("td",{parentName:"tr",align:null},"8080")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.workerCapacityHint")),(0,i.kt)("td",{parentName:"tr",align:null},"An estimation of the number of task slots available for each worker launched by the auto scaler when there are no workers running. The auto scaler uses the worker capacity hint to launch workers with an adequate capacity to handle pending tasks. When unset or set to a value less than or equal to 0, the auto scaler scales workers equal to the value for ",(0,i.kt)("inlineCode",{parentName:"td"},"minNumWorkers")," in autoScaler config instead. The auto scaler assumes that each worker, either a Middle Manager or indexer, has the same amount of task slots. Therefore, when all your workers have the same capacity (homogeneous capacity), set the value for ",(0,i.kt)("inlineCode",{parentName:"td"},"autoscale.workerCapacityHint")," equal to ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.capacity"),". If your workers have different capacities (heterogeneous capacity), set the value to the average of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.capacity")," across the workers. For example, if two workers have ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.capacity=10"),", and one has ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.capacity=4"),", set ",(0,i.kt)("inlineCode",{parentName:"td"},"autoscale.workerCapacityHint=8"),". Only applies to ",(0,i.kt)("inlineCode",{parentName:"td"},"pendingTaskBased")," provisioning strategy."),(0,i.kt)("td",{parentName:"tr",align:null},"-1")))),(0,i.kt)("h5",{id:"supervisors"},"Supervisors"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.healthinessThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of successful runs before an unhealthy supervisor is again considered healthy."),(0,i.kt)("td",{parentName:"tr",align:null},"3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.unhealthinessThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of failed runs before the supervisor is considered unhealthy."),(0,i.kt)("td",{parentName:"tr",align:null},"3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.taskHealthinessThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of consecutive task successes before an unhealthy supervisor is again considered healthy."),(0,i.kt)("td",{parentName:"tr",align:null},"3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.taskUnhealthinessThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of consecutive task failures before the supervisor is considered unhealthy."),(0,i.kt)("td",{parentName:"tr",align:null},"3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.storeStackTrace")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether full stack traces of supervisor exceptions should be stored and returned by the supervisor ",(0,i.kt)("inlineCode",{parentName:"td"},"/status")," endpoint."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.maxStoredExceptionEvents")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of exception events that can be returned through the supervisor ",(0,i.kt)("inlineCode",{parentName:"td"},"/status")," endpoint."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"max(healthinessThreshold, unhealthinessThreshold)"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.idleConfig.enabled")),(0,i.kt)("td",{parentName:"tr",align:null},"If ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", supervisor can become idle if there is no data on input stream/topic for some time."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.supervisor.idleConfig.inactiveAfterMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"Supervisor is marked as idle if all existing data has been read from input topic and no new data has been published for ",(0,i.kt)("inlineCode",{parentName:"td"},"inactiveAfterMillis")," milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"600_000"))))),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.supervisor.idleConfig.*")," specification in the Overlord runtime properties defines the default behavior for the entire cluster. See ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/kinesis-ingestion#io-configuration"},"Idle Configuration in Kafka Supervisor IOConfig")," to override it for an individual supervisor."),(0,i.kt)("h4",{id:"overlord-dynamic-configuration"},"Overlord dynamic configuration"),(0,i.kt)("p",null,"The Overlord has dynamic configurations to tune how Druid assigns tasks to workers.\nYou can configure these parameters using the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/web-console"},"web console")," or through the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/api-reference/dynamic-configuration-api#overlord-dynamic-configuration"},"Overlord dynamic configuration API"),"."),(0,i.kt)("p",null,"The following table shows the dynamic configuration properties for the Overlord."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"selectStrategy")),(0,i.kt)("td",{parentName:"tr",align:null},"Describes how to assign tasks to Middle Managers. The type can be ",(0,i.kt)("inlineCode",{parentName:"td"},"equalDistribution"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"equalDistributionWithCategorySpec"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"fillCapacity"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"fillCapacityWithCategorySpec"),", and ",(0,i.kt)("inlineCode",{parentName:"td"},"javascript"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'{"type":"equalDistribution"}'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"autoScaler")),(0,i.kt)("td",{parentName:"tr",align:null},"Only used if ",(0,i.kt)("a",{parentName:"td",href:"#autoscaler"},"autoscaling")," is enabled."),(0,i.kt)("td",{parentName:"tr",align:null},"null")))),(0,i.kt)("p",null,"The following is an example of an Overlord dynamic config:"),(0,i.kt)("details",null,(0,i.kt)("summary",null,"Click to view the example"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "selectStrategy": {\n "type": "fillCapacity",\n "affinityConfig": {\n "affinity": {\n "datasource1": ["host1:port", "host2:port"],\n "datasource2": ["host3:port"]\n }\n }\n },\n "autoScaler": {\n "type": "ec2",\n "minNumWorkers": 2,\n "maxNumWorkers": 12,\n "envConfig": {\n "availabilityZone": "us-east-1a",\n "nodeData": {\n "amiId": "${AMI}",\n "instanceType": "c3.8xlarge",\n "minInstances": 1,\n "maxInstances": 1,\n "securityGroupIds": ["${IDs}"],\n "keyName": "${KEY_NAME}"\n },\n "userData": {\n "impl": "string",\n "data": "${SCRIPT_COMMAND}",\n "versionReplacementString": ":VERSION:",\n "version": null\n }\n }\n }\n}\n'))),(0,i.kt)("h5",{id:"worker-select-strategy"},"Worker select strategy"),(0,i.kt)("p",null,"The select strategy controls how Druid assigns tasks to workers (Middle Managers).\nAt a high level, the select strategy determines the list of eligible workers for a given task using\neither an ",(0,i.kt)("inlineCode",{parentName:"p"},"affinityConfig")," or a ",(0,i.kt)("inlineCode",{parentName:"p"},"categorySpec"),". Then, Druid assigns the task by either trying to distribute load equally\n(",(0,i.kt)("inlineCode",{parentName:"p"},"equalDistribution"),") or to fill as many workers as possible to capacity (",(0,i.kt)("inlineCode",{parentName:"p"},"fillCapacity"),").\nThere are 4 options for select strategies:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#equaldistribution"},(0,i.kt)("inlineCode",{parentName:"a"},"equalDistribution"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#equaldistributionwithcategoryspec"},(0,i.kt)("inlineCode",{parentName:"a"},"equalDistributionWithCategorySpec"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#fillcapacity"},(0,i.kt)("inlineCode",{parentName:"a"},"fillCapacity"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#fillcapacitywithcategoryspec"},(0,i.kt)("inlineCode",{parentName:"a"},"fillCapacityWithCategorySpec")))),(0,i.kt)("p",null,"A ",(0,i.kt)("inlineCode",{parentName:"p"},"javascript")," option is also available but should only be used for prototyping new strategies."),(0,i.kt)("p",null,"If an ",(0,i.kt)("inlineCode",{parentName:"p"},"affinityConfig")," is provided (as part of ",(0,i.kt)("inlineCode",{parentName:"p"},"fillCapacity")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"equalDistribution")," strategies) for a given task, the list of workers eligible to be assigned is determined as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"a non-affinity worker if no affinity is specified for that datasource. Any worker not listed in the ",(0,i.kt)("inlineCode",{parentName:"li"},"affinityConfig")," is considered a non-affinity worker."),(0,i.kt)("li",{parentName:"ul"},"a non-affinity worker if preferred workers are not available and the affinity is ",(0,i.kt)("em",{parentName:"li"},"weak")," i.e. ",(0,i.kt)("inlineCode",{parentName:"li"},"strong: false"),"."),(0,i.kt)("li",{parentName:"ul"},"a preferred worker listed in the ",(0,i.kt)("inlineCode",{parentName:"li"},"affinityConfig")," for this datasource if it has available capacity"),(0,i.kt)("li",{parentName:"ul"},"no worker if preferred workers are not available and affinity is ",(0,i.kt)("em",{parentName:"li"},"strong")," i.e. ",(0,i.kt)("inlineCode",{parentName:"li"},"strong: true"),'. In this case, the task remains in "pending" state. The chosen provisioning strategy (e.g. ',(0,i.kt)("inlineCode",{parentName:"li"},"pendingTaskBased"),") may then use the total number of pending tasks to determine if a new node should be provisioned.")),(0,i.kt)("p",null,"Note that every worker listed in the ",(0,i.kt)("inlineCode",{parentName:"p"},"affinityConfig")," will only be used for the assigned datasources and no other."),(0,i.kt)("p",null,"If a ",(0,i.kt)("inlineCode",{parentName:"p"},"categorySpec")," is provided (as part of ",(0,i.kt)("inlineCode",{parentName:"p"},"fillCapacityWithCategorySpec")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"equalDistributionWithCategorySpec")," strategies), then a task of a given datasource may be assigned to:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"any worker if no category config is given for task type"),(0,i.kt)("li",{parentName:"ul"},"any worker if category config is given for task type but no category is given for datasource and there's no default category"),(0,i.kt)("li",{parentName:"ul"},"a preferred worker (based on category config and category for datasource) if available"),(0,i.kt)("li",{parentName:"ul"},"any worker if category config and category are given but no preferred worker is available and category config is ",(0,i.kt)("inlineCode",{parentName:"li"},"weak")),(0,i.kt)("li",{parentName:"ul"},"not assigned at all if preferred workers are not available and category config is ",(0,i.kt)("inlineCode",{parentName:"li"},"strong"))),(0,i.kt)("p",null,"In both the cases, Druid determines the list of eligible workers and selects one depending on their load with the goal of either distributing the load equally or filling as few workers as possible."),(0,i.kt)("p",null,"If you are using auto-scaling, use the ",(0,i.kt)("inlineCode",{parentName:"p"},"fillCapacity")," select strategy since auto-scaled nodes can\nnot be assigned a category, and you want the work to be concentrated on the fewest number of workers to allow the empty ones to scale down."),(0,i.kt)("h6",{id:"equaldistribution"},(0,i.kt)("inlineCode",{parentName:"h6"},"equalDistribution")),(0,i.kt)("p",null,"Tasks are assigned to the Middle Manager with the most free slots at the time the task begins running.\nThis evenly distributes work across your Middle Managers."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"equalDistribution")),(0,i.kt)("td",{parentName:"tr",align:null},"required; must be ",(0,i.kt)("inlineCode",{parentName:"td"},"equalDistribution"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"affinityConfig")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"#affinityconfig"},(0,i.kt)("inlineCode",{parentName:"a"},"AffinityConfig"))," object"),(0,i.kt)("td",{parentName:"tr",align:null},"null (no affinity)")))),(0,i.kt)("h6",{id:"equaldistributionwithcategoryspec"},(0,i.kt)("inlineCode",{parentName:"h6"},"equalDistributionWithCategorySpec")),(0,i.kt)("p",null,"This strategy is a variant of ",(0,i.kt)("inlineCode",{parentName:"p"},"equalDistribution"),", which supports ",(0,i.kt)("inlineCode",{parentName:"p"},"workerCategorySpec")," field rather than ",(0,i.kt)("inlineCode",{parentName:"p"},"affinityConfig"),".\nBy specifying ",(0,i.kt)("inlineCode",{parentName:"p"},"workerCategorySpec"),", you can assign tasks to run on different categories of Middle Managers based on the ",(0,i.kt)("strong",{parentName:"p"},"type")," and ",(0,i.kt)("strong",{parentName:"p"},"dataSource")," of the task.\nThis strategy doesn't work with ",(0,i.kt)("inlineCode",{parentName:"p"},"AutoScaler")," since the behavior is undefined."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"equalDistributionWithCategorySpec")),(0,i.kt)("td",{parentName:"tr",align:null},"required; must be ",(0,i.kt)("inlineCode",{parentName:"td"},"equalDistributionWithCategorySpec"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"workerCategorySpec")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"#workercategoryspec"},(0,i.kt)("inlineCode",{parentName:"a"},"WorkerCategorySpec"))," object"),(0,i.kt)("td",{parentName:"tr",align:null},"null (no worker category spec)")))),(0,i.kt)("p",null,"The following example shows tasks of type ",(0,i.kt)("inlineCode",{parentName:"p"},"index_kafka")," that default to running on Middle Managers of category ",(0,i.kt)("inlineCode",{parentName:"p"},"c1"),", except for tasks that write to datasource ",(0,i.kt)("inlineCode",{parentName:"p"},"ds1"),", which run on Middle Managers of category ",(0,i.kt)("inlineCode",{parentName:"p"},"c2"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "selectStrategy": {\n "type": "equalDistributionWithCategorySpec",\n "workerCategorySpec": {\n "strong": false,\n "categoryMap": {\n "index_kafka": {\n "defaultCategory": "c1",\n "categoryAffinity": {\n "ds1": "c2"\n }\n }\n }\n }\n }\n}\n')),(0,i.kt)("h6",{id:"fillcapacity"},(0,i.kt)("inlineCode",{parentName:"h6"},"fillCapacity")),(0,i.kt)("p",null,"Tasks are assigned to the worker with the most currently-running tasks. This is\nuseful when you are auto-scaling Middle Managers since it tends to pack some full and\nleave others empty. The empty ones can be safely terminated."),(0,i.kt)("p",null,"Note that if ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.indexer.runner.pendingTasksRunnerNumThreads")," is set to ",(0,i.kt)("em",{parentName:"p"},"N")," > 1, then this strategy will fill ",(0,i.kt)("em",{parentName:"p"},"N"),"\nMiddle Managers up to capacity simultaneously, rather than a single Middle Manager."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"fillCapacity")),(0,i.kt)("td",{parentName:"tr",align:null},"required; must be ",(0,i.kt)("inlineCode",{parentName:"td"},"fillCapacity"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"affinityConfig")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"#affinityconfig"},(0,i.kt)("inlineCode",{parentName:"a"},"AffinityConfig"))," object"),(0,i.kt)("td",{parentName:"tr",align:null},"null (no affinity)")))),(0,i.kt)("h6",{id:"fillcapacitywithcategoryspec"},(0,i.kt)("inlineCode",{parentName:"h6"},"fillCapacityWithCategorySpec")),(0,i.kt)("p",null,"This strategy is a variant of ",(0,i.kt)("inlineCode",{parentName:"p"},"fillCapacity"),", which supports ",(0,i.kt)("inlineCode",{parentName:"p"},"workerCategorySpec")," instead of an ",(0,i.kt)("inlineCode",{parentName:"p"},"affinityConfig"),".\nThe usage is the same as ",(0,i.kt)("inlineCode",{parentName:"p"},"equalDistributionWithCategorySpec")," strategy.\nThis strategy doesn't work with ",(0,i.kt)("inlineCode",{parentName:"p"},"AutoScaler")," since the behavior is undefined."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"fillCapacityWithCategorySpec"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"required; must be ",(0,i.kt)("inlineCode",{parentName:"td"},"fillCapacityWithCategorySpec"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"workerCategorySpec")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"#workercategoryspec"},(0,i.kt)("inlineCode",{parentName:"a"},"WorkerCategorySpec"))," object"),(0,i.kt)("td",{parentName:"tr",align:null},"null (no worker category spec)")))),(0,i.kt)("a",{name:"javascript-worker-select-strategy"}),(0,i.kt)("h6",{id:"javascript-1"},(0,i.kt)("inlineCode",{parentName:"h6"},"javascript")),(0,i.kt)("p",null,"Allows defining arbitrary logic for selecting workers to run task using a JavaScript function.\nThe function is passed remoteTaskRunnerConfig, map of workerId to available workers and task to be executed and returns the workerId on which the task should be run or null if the task cannot be run.\nIt can be used for rapid development of missing features where the worker selection logic is to be changed or tuned often.\nIf the selection logic is quite complex and cannot be easily tested in JavaScript environment,\nits better to write a druid extension module with extending current worker selection strategies written in java."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"javascript")),(0,i.kt)("td",{parentName:"tr",align:null},"required; must be ",(0,i.kt)("inlineCode",{parentName:"td"},"javascript"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"function")),(0,i.kt)("td",{parentName:"tr",align:null},"String representing JavaScript function"),(0,i.kt)("td",{parentName:"tr",align:null})))),(0,i.kt)("p",null,"The following example shows a function that sends ",(0,i.kt)("inlineCode",{parentName:"p"},"batch_index_task")," to workers ",(0,i.kt)("inlineCode",{parentName:"p"},"10.0.0.1")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"10.0.0.2")," and all other tasks to other available workers."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type":"javascript",\n "function":"function (config, zkWorkers, task) {\\nvar batch_workers = new java.util.ArrayList();\\nbatch_workers.add(\\"middleManager1_hostname:8091\\");\\nbatch_workers.add(\\"middleManager2_hostname:8091\\");\\nworkers = zkWorkers.keySet().toArray();\\nvar sortedWorkers = new Array()\\n;for(var i = 0; i < workers.length; i++){\\n sortedWorkers[i] = workers[i];\\n}\\nArray.prototype.sort.call(sortedWorkers,function(a, b){return zkWorkers.get(b).getCurrCapacityUsed() - zkWorkers.get(a).getCurrCapacityUsed();});\\nvar minWorkerVer = config.getMinWorkerVersion();\\nfor (var i = 0; i < sortedWorkers.length; i++) {\\n var worker = sortedWorkers[i];\\n var zkWorker = zkWorkers.get(worker);\\n if(zkWorker.canRunTask(task) && zkWorker.isValidVersion(minWorkerVer)){\\n if(task.getType() == \'index_hadoop\' && batch_workers.contains(worker)){\\n return worker;\\n } else {\\n if(task.getType() != \'index_hadoop\' && !batch_workers.contains(worker)){\\n return worker;\\n }\\n }\\n }\\n}\\nreturn null;\\n}"\n}\n')),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"}," JavaScript-based functionality is disabled by default. Refer to the Druid ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/development/javascript"},"JavaScript programming guide")," for guidelines about using Druid's JavaScript functionality, including instructions on how to enable it.")),(0,i.kt)("h6",{id:"affinityconfig"},"affinityConfig"),(0,i.kt)("p",null,"Use the ",(0,i.kt)("inlineCode",{parentName:"p"},"affinityConfig")," field to pass affinity configuration to the ",(0,i.kt)("inlineCode",{parentName:"p"},"equalDistribution")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"fillCapacity")," strategies.\nIf not provided, the default is to have no affinity."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"affinity")),(0,i.kt)("td",{parentName:"tr",align:null},"JSON object mapping a datasource String name to a list of indexing service Middle Manager ",(0,i.kt)("inlineCode",{parentName:"td"},"host:port")," values. Druid doesn't perform DNS resolution, so the 'host' value must match what is configured on the Middle Manager and what the Middle Manager announces itself as (examine the Overlord logs to see what your Middle Manager announces itself as)."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"{}"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"strong")),(0,i.kt)("td",{parentName:"tr",align:null},"When ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," tasks for a datasource must be assigned to affinity-mapped Middle Managers. Tasks remain queued until a slot becomes available. When ",(0,i.kt)("inlineCode",{parentName:"td"},"false"),", Druid may assign tasks for a datasource to other Middle Managers when affinity-mapped Middle Managers are unavailable to run queued tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h6",{id:"workercategoryspec"},"workerCategorySpec"),(0,i.kt)("p",null,"You can provide ",(0,i.kt)("inlineCode",{parentName:"p"},"workerCategorySpec")," to the ",(0,i.kt)("inlineCode",{parentName:"p"},"equalDistributionWithCategorySpec")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"fillCapacityWithCategorySpec")," strategies using the ",(0,i.kt)("inlineCode",{parentName:"p"},"workerCategorySpec"),"\nfield. If not provided, the default is to not use it at all."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"categoryMap")),(0,i.kt)("td",{parentName:"tr",align:null},"A JSON map object mapping a task type String name to a ",(0,i.kt)("a",{parentName:"td",href:"#categoryconfig"},"CategoryConfig")," object, by which you can specify category config for different task type."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"{}"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"strong")),(0,i.kt)("td",{parentName:"tr",align:null},"With weak workerCategorySpec (the default), tasks for a dataSource may be assigned to other Middle Managers if the Middle Managers specified in ",(0,i.kt)("inlineCode",{parentName:"td"},"categoryMap")," are not able to run all pending tasks in the queue for that dataSource. With strong workerCategorySpec, tasks for a dataSource will only ever be assigned to their specified Middle Managers, and will wait in the pending queue if necessary."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h6",{id:"categoryconfig"},"CategoryConfig"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"defaultCategory")),(0,i.kt)("td",{parentName:"tr",align:null},"Specify default category for a task type."),(0,i.kt)("td",{parentName:"tr",align:null},"null")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"categoryAffinity")),(0,i.kt)("td",{parentName:"tr",align:null},"A JSON map object mapping a datasource String name to a category String name of the Middle Manager. If category isn't specified for a datasource, then using the ",(0,i.kt)("inlineCode",{parentName:"td"},"defaultCategory"),". If no specified category and the ",(0,i.kt)("inlineCode",{parentName:"td"},"defaultCategory")," is also null, then tasks can run on any available Middle Managers."),(0,i.kt)("td",{parentName:"tr",align:null},"null")))),(0,i.kt)("h5",{id:"autoscaler"},"Autoscaler"),(0,i.kt)("p",null,"Amazon's EC2 together with Google's GCE are currently the only supported autoscalers."),(0,i.kt)("p",null,"EC2's autoscaler properties are:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"ec2")),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"minNumWorkers")),(0,i.kt)("td",{parentName:"tr",align:null},"The minimum number of workers that can be in the cluster at any given time."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxNumWorkers")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of workers that can be in the cluster at any given time."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"envConfig.availabilityZone")),(0,i.kt)("td",{parentName:"tr",align:null},"What Amazon availability zone to run in."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"envConfig.nodeData")),(0,i.kt)("td",{parentName:"tr",align:null},"A JSON object that describes how to launch new nodes."),(0,i.kt)("td",{parentName:"tr",align:null},"none; required")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"envConfig.userData")),(0,i.kt)("td",{parentName:"tr",align:null},"A JSON object that describes how to configure new nodes. If you have set ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.autoscale.workerVersion"),", this must have a ",(0,i.kt)("inlineCode",{parentName:"td"},"versionReplacementString"),". Otherwise, a ",(0,i.kt)("inlineCode",{parentName:"td"},"versionReplacementString")," is not necessary."),(0,i.kt)("td",{parentName:"tr",align:null},"none; optional")))),(0,i.kt)("p",null,"For GCE's properties, please refer to the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/development/extensions-contrib/gce-extensions"},"gce-extensions"),"."),(0,i.kt)("h2",{id:"data-server"},"Data server"),(0,i.kt)("p",null,"This section contains the configuration options for the services that reside on Data servers (Middle Managers/Peons and Historicals) in the suggested ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/architecture#druid-servers"},"three-server configuration"),"."),(0,i.kt)("p",null,"Configuration options for the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/indexer"},"Indexer process")," are also provided here."),(0,i.kt)("h3",{id:"middle-manager-and-peon"},"Middle Manager and Peon"),(0,i.kt)("p",null,"These Middle Manager and Peon configurations can be defined in the ",(0,i.kt)("inlineCode",{parentName:"p"},"middleManager/runtime.properties")," file."),(0,i.kt)("h4",{id:"middle-manager-service-config"},"Middle Manager service config"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"The host for the current service. This is used to advertise the current service location as reachable from another service and should generally be specified such that ",(0,i.kt)("inlineCode",{parentName:"td"},"http://${druid.host}/")," could actually talk to this service"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"InetAddress.getLocalHost().getCanonicalHostName()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.bindOnHost")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicating whether the service's internal jetty server bind on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host"),". Default is false, which means binding to all interfaces."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.plaintextPort")),(0,i.kt)("td",{parentName:"tr",align:null},"This is the port to actually listen on; unless port mapping is used, this will be the same port as is on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"8091")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.tlsPort")),(0,i.kt)("td",{parentName:"tr",align:null},"TLS port for HTTPS connector, if ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/tls-support"},"druid.enableTlsPort")," is set then this config will be used. If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")," contains port then that port will be ignored. This should be a non-negative Integer."),(0,i.kt)("td",{parentName:"tr",align:null},"8291")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.service")),(0,i.kt)("td",{parentName:"tr",align:null},"The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid/middlemanager"))))),(0,i.kt)("h4",{id:"middle-manager-configuration"},"Middle Manager configuration"),(0,i.kt)("p",null,"Middle Managers pass their configurations down to their child peons. The Middle Manager requires the following configs:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.allowedPrefixes")),(0,i.kt)("td",{parentName:"tr",align:null},"Whitelist of prefixes for configs that can be passed down to child peons."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"com.metamx"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"druid"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.druid"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"user.timezone"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"file.encoding"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"hadoop"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.compressZnodes")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicates whether or not the Middle Managers should compress Znodes."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.classpath")),(0,i.kt)("td",{parentName:"tr",align:null},"Java classpath for the peon."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'System.getProperty("java.class.path")'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.javaCommand")),(0,i.kt)("td",{parentName:"tr",align:null},"Command required to execute java."),(0,i.kt)("td",{parentName:"tr",align:null},"java")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.javaOpts")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("em",{parentName:"td"},"DEPRECATED")," A string of -X Java options to pass to the peon's JVM. Quotable parameters or parameters with spaces are encouraged to use javaOptsArray"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"''"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.javaOptsArray")),(0,i.kt)("td",{parentName:"tr",align:null},"A JSON array of strings to be passed in as options to the peon's JVM. This is additive to ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.javaOpts")," and is recommended for properly handling arguments which contain quotes or spaces like ",(0,i.kt)("inlineCode",{parentName:"td"},'["-XX:OnOutOfMemoryError=kill -9 %p"]')),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"[]"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.maxZnodeBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum size Znode in bytes that can be created in ZooKeeper, should be in the range of [10KiB, 2GiB). ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"Human-readable format")," is supported."),(0,i.kt)("td",{parentName:"tr",align:null},"512KiB")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.startPort")),(0,i.kt)("td",{parentName:"tr",align:null},"Starting port used for Peon services, should be greater than 1023 and less than 65536."),(0,i.kt)("td",{parentName:"tr",align:null},"8100")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.endPort")),(0,i.kt)("td",{parentName:"tr",align:null},"Ending port used for Peon services, should be greater than or equal to ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.startPort")," and less than 65536."),(0,i.kt)("td",{parentName:"tr",align:null},"65535")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.ports")),(0,i.kt)("td",{parentName:"tr",align:null},"A JSON array of integers to specify ports that used for Peon services. If provided and non-empty, ports for Peon services will be chosen from these ports. And ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.startPort/druid.indexer.runner.endPort")," will be completely ignored."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"[]"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.ip")),(0,i.kt)("td",{parentName:"tr",align:null},"The IP of the worker."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"localhost"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.version")),(0,i.kt)("td",{parentName:"tr",align:null},"Version identifier for the Middle Manager. The version number is a string. This affects the expected behavior during certain operations like comparison against ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.runner.minWorkerVersion"),". Specifically, the version comparison follows dictionary order. Use ISO8601 date format for the version to accommodate date comparisons."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.capacity")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of tasks the Middle Manager can accept."),(0,i.kt)("td",{parentName:"tr",align:null},"Number of CPUs on the machine - 1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.baseTaskDirs")),(0,i.kt)("td",{parentName:"tr",align:null},"List of base temporary working directories, one of which is assigned per task in a round-robin fashion. This property can be used to allow usage of multiple disks for indexing. This property is recommended in place of and takes precedence over ",(0,i.kt)("inlineCode",{parentName:"td"},"${druid.indexer.task.baseTaskDir}"),". If this configuration is not set, ",(0,i.kt)("inlineCode",{parentName:"td"},"${druid.indexer.task.baseTaskDir}")," is used. For example, ",(0,i.kt)("inlineCode",{parentName:"td"},'druid.worker.baseTaskDirs=[\\"PATH1\\",\\"PATH2\\",...]'),"."),(0,i.kt)("td",{parentName:"tr",align:null},"null")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.baseTaskDirSize")),(0,i.kt)("td",{parentName:"tr",align:null},"The total amount of bytes that can be used by tasks on any single task dir. This value is treated symmetrically across all directories, that is, if this is 500 GB and there are 3 ",(0,i.kt)("inlineCode",{parentName:"td"},"baseTaskDirs"),", then each of those task directories is assumed to allow for 500 GB to be used and a total of 1.5 TB will potentially be available across all tasks. The actual amount of memory assigned to each task is discussed in ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#configuring-task-storage-sizes"},"Configuring task storage sizes")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Long.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.category")),(0,i.kt)("td",{parentName:"tr",align:null},"A string to name the category that the Middle Manager node belongs to."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"_default_worker_category"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.fork.property.druid.centralizedDatasourceSchema.enabled")),(0,i.kt)("td",{parentName:"tr",align:null},"This config should be set when ",(0,i.kt)("a",{parentName:"td",href:"#centralized-datasource-schema"},"Centralized Datasource Schema")," feature is enabled."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h4",{id:"peon-processing"},"Peon processing"),(0,i.kt)("p",null,"Processing properties set on the Middle Manager are passed through to Peons."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.sizeBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"Human-readable format")," is supported."),(0,i.kt)("td",{parentName:"tr",align:null},"auto (max 1 GiB)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.poolCacheMaxCount")),(0,i.kt)("td",{parentName:"tr",align:null},"Processing buffer pool caches the buffers for later use. This is the maximum count that the cache will grow to. Note that pool can create more buffers than it can cache if necessary."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Integer.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.formatString")),(0,i.kt)("td",{parentName:"tr",align:null},"Realtime and Historical processes use this format string to name their processing threads."),(0,i.kt)("td",{parentName:"tr",align:null},"processing-%s")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.numMergeBuffers")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of direct memory buffers available for merging query results. The buffers are sized by ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.sizeBytes"),". This property is effectively a concurrency limit for queries that require merging buffers. If you are using any queries that require merge buffers (currently, just groupBy) then you should have at least two of these."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"max(2, druid.processing.numThreads / 4)"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.numThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of processing threads to have available for parallel processing of segments. Our rule of thumb is ",(0,i.kt)("inlineCode",{parentName:"td"},"num_cores - 1"),", which means that even under heavy load there will still be one core available to do background tasks like talking with ZooKeeper and pulling down segments. If only one core is available, this property defaults to the value ",(0,i.kt)("inlineCode",{parentName:"td"},"1"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"Number of cores - 1 (or 1)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.fifo")),(0,i.kt)("td",{parentName:"tr",align:null},"Enables the processing queue to treat tasks of equal priority in a FIFO manner."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.tmpDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Path where temporary files created while processing a query should be stored. If specified, this configuration takes priority over the default ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir")," path."),(0,i.kt)("td",{parentName:"tr",align:null},"path represented by ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.intermediaryData.storage.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Storage type for intermediary segments of data shuffle between native parallel index tasks. ",(0,i.kt)("br",null),"Set to ",(0,i.kt)("inlineCode",{parentName:"td"},"local")," to store segment files in the local storage of the Middle Manager or Indexer. ",(0,i.kt)("br",null),"Set to ",(0,i.kt)("inlineCode",{parentName:"td"},"deepstore")," to use configured deep storage for better fault tolerance during rolling updates. When the storage type is ",(0,i.kt)("inlineCode",{parentName:"td"},"deepstore"),", Druid stores the data in the ",(0,i.kt)("inlineCode",{parentName:"td"},"shuffle-data")," directory under the configured deep storage path. Druid does not support automated cleanup for the ",(0,i.kt)("inlineCode",{parentName:"td"},"shuffle-data")," directory. You can set up cloud storage lifecycle rules for automated cleanup of data at the ",(0,i.kt)("inlineCode",{parentName:"td"},"shuffle-data")," prefix location."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"local"))))),(0,i.kt)("p",null,"The amount of direct memory needed by Druid is at least\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.processing.buffer.sizeBytes * (druid.processing.numMergeBuffers + druid.processing.numThreads + 1)"),". You can\nensure at least this amount of direct memory is available by providing ",(0,i.kt)("inlineCode",{parentName:"p"},"-XX:MaxDirectMemorySize=")," in\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.indexer.runner.javaOptsArray")," as documented above."),(0,i.kt)("h4",{id:"peon-query-configuration"},"Peon query configuration"),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#general-query-configuration"},"general query configuration"),"."),(0,i.kt)("h4",{id:"peon-caching"},"Peon caching"),(0,i.kt)("p",null,"You can optionally configure caching to be enabled on the peons by setting caching configs here."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible Values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.realtime.cache.useCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Enable the cache on the realtime."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.realtime.cache.populateCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Populate the cache on the realtime."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.realtime.cache.unCacheable")),(0,i.kt)("td",{parentName:"tr",align:null},"All druid query types"),(0,i.kt)("td",{parentName:"tr",align:null},"All query types to not cache."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"[]"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.realtime.cache.maxEntrySize")),(0,i.kt)("td",{parentName:"tr",align:null},"positive integer"),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum cache entry size in bytes."),(0,i.kt)("td",{parentName:"tr",align:null},"1_000_000")))),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#cache-configuration"},"cache configuration")," for how to configure cache settings."),(0,i.kt)("h4",{id:"additional-peon-configuration"},"Additional Peon configuration"),(0,i.kt)("p",null,"Although Peons inherit the configurations of their parent Middle Managers, explicit child Peon configs in Middle Manager can be set by prefixing them with:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-properties"},"druid.indexer.fork.property\n")),(0,i.kt)("p",null,"Additional Peon configs include:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.mode")),(0,i.kt)("td",{parentName:"tr",align:null},"One of ",(0,i.kt)("inlineCode",{parentName:"td"},"local")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"remote"),". Setting this property to ",(0,i.kt)("inlineCode",{parentName:"td"},"local")," means you intend to run the Peon as a standalone process which is not recommended."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"remote"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.baseDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Base temporary working directory."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'System.getProperty("java.io.tmpdir")'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.baseTaskDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Base temporary working directory for tasks."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.indexer.task.baseDir}/persistent/task"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.defaultHadoopCoordinates")),(0,i.kt)("td",{parentName:"tr",align:null},"Hadoop version to use with HadoopIndexTasks that do not request a particular version."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.hadoop:hadoop-client-api:3.3.6"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.hadoop:hadoop-client-runtime:3.3.6"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.defaultRowFlushBoundary")),(0,i.kt)("td",{parentName:"tr",align:null},"Highest row count before persisting to disk. Used for indexing generating tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"75000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.directoryLockTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Wait this long for zombie Peons to exit before giving up on their replacements."),(0,i.kt)("td",{parentName:"tr",align:null},"PT10M")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.gracefulShutdownTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Wait this long on Middle Manager restart for restorable tasks to gracefully exit."),(0,i.kt)("td",{parentName:"tr",align:null},"PT5M")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.hadoopWorkingPath")),(0,i.kt)("td",{parentName:"tr",align:null},"Temporary working directory for Hadoop tasks."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"/tmp/druid-indexing"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.restoreTasksOnRestart")),(0,i.kt)("td",{parentName:"tr",align:null},"If true, Middle Managers will attempt to stop tasks gracefully on shutdown and restore them on restart."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.ignoreTimestampSpecForDruidInputSource")),(0,i.kt)("td",{parentName:"tr",align:null},"If true, tasks using the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/input-sources"},"Druid input source")," will ignore the provided timestampSpec, and will use the ",(0,i.kt)("inlineCode",{parentName:"td"},"__time")," column of the input datasource. This option is provided for compatibility with ingestion specs written before Druid 0.22.0."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.storeEmptyColumns")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether or not to store empty columns during ingestion. When set to true, Druid stores every column specified in the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/ingestion-spec#dimensionsspec"},(0,i.kt)("inlineCode",{parentName:"a"},"dimensionsSpec")),". If you use the string-based schemaless ingestion and don't specify any dimensions to ingest, you must also set ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/ingestion-spec#dimensionsspec"},(0,i.kt)("inlineCode",{parentName:"a"},"includeAllDimensions"))," for Druid to store empty columns.",(0,i.kt)("br",null),(0,i.kt)("br",null),"If you set ",(0,i.kt)("inlineCode",{parentName:"td"},"storeEmptyColumns")," to false, Druid SQL queries referencing empty columns will fail. If you intend to leave ",(0,i.kt)("inlineCode",{parentName:"td"},"storeEmptyColumns")," disabled, you should either ingest placeholder data for empty columns or else not query on empty columns.",(0,i.kt)("br",null),(0,i.kt)("br",null),"You can overwrite this configuration by setting ",(0,i.kt)("inlineCode",{parentName:"td"},"storeEmptyColumns")," in the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#context-parameters"},"task context"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.tmpStorageBytesPerTask")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of bytes per task to be used to store temporary files on disk. This config is generally intended for internal usage. Attempts to set it are very likely to be overwritten by the TaskRunner that executes the task, so be sure of what you expect to happen before directly adjusting this configuration parameter. The config is documented here primarily to provide an understanding of what it means if/when someone sees that it has been set. A value of -1 disables this limit."),(0,i.kt)("td",{parentName:"tr",align:null},"-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.server.maxChatRequests")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of concurrent requests served by a task's chat handler. Set to 0 to disable limiting."),(0,i.kt)("td",{parentName:"tr",align:null},"0")))),(0,i.kt)("p",null,"If the Peon is running in remote mode, there must be an Overlord up and running. Peons in remote mode can set the following configurations:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.taskActionClient.retry.minWait")),(0,i.kt)("td",{parentName:"tr",align:null},"The minimum retry time to communicate with Overlord."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.taskActionClient.retry.maxWait")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum retry time to communicate with Overlord."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.taskActionClient.retry.maxRetryCount")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of retries to communicate with Overlord."),(0,i.kt)("td",{parentName:"tr",align:null},"60")))),(0,i.kt)("h5",{id:"segmentwriteoutmediumfactory"},"SegmentWriteOutMediumFactory"),(0,i.kt)("p",null,"When new segments are created, Druid temporarily stores some preprocessed data in some buffers.\nThe following types of medium exist for the buffers:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Temporary files")," (",(0,i.kt)("inlineCode",{parentName:"p"},"tmpFile"),") are stored under the task working directory (see ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.worker.baseTaskDirs")," configuration above) and thus share it's mounting properties. For example, they could be backed by HDD, SSD or memory (tmpfs).\nThis type of medium may do unnecessary disk I/O and requires some disk space to be available.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Off-heap memory")," (",(0,i.kt)("inlineCode",{parentName:"p"},"offHeapMemory"),") creates buffers in off-heap memory of a JVM process that is running a task.\nThis type of medium is preferred, but it may require you to allow the JVM to have more off-heap memory by changing the ",(0,i.kt)("inlineCode",{parentName:"p"},"-XX:MaxDirectMemorySize")," configuration. It's not understood yet how the required off-heap memory size relates to the size of the segments being created. But you shouldn't add more extra off-heap memory than the configured maximum ",(0,i.kt)("em",{parentName:"p"},"heap")," size (",(0,i.kt)("inlineCode",{parentName:"p"},"-Xmx"),") for the same JVM.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"On-heap memory")," (",(0,i.kt)("inlineCode",{parentName:"p"},"onHeapMemory"),") creates buffers using the allocated heap memory of the JVM process running a task. Using on-heap memory introduces garbage collection overhead and so is not recommended in most cases. This type of medium is most helpful for tasks run on external clusters where it may be difficult to allocate and work with direct memory effectively."))),(0,i.kt)("p",null,"For most types of tasks, ",(0,i.kt)("inlineCode",{parentName:"p"},"SegmentWriteOutMediumFactory")," can be configured per-task (see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/ingestion/tasks"},"Tasks")," for more information), but if it's not specified for a task, or it's not supported for a particular task type, then Druid uses the value from the following configuration:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.defaultSegmentWriteOutMediumFactory.type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"tmpFile"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"offHeapMemory"),", or ",(0,i.kt)("inlineCode",{parentName:"td"},"onHeapMemory")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"tmpFile"))))),(0,i.kt)("h3",{id:"indexer"},"Indexer"),(0,i.kt)("h4",{id:"indexer-process-configuration"},"Indexer process configuration"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that ",(0,i.kt)("inlineCode",{parentName:"td"},"http://${druid.host}/")," could actually talk to this process"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"InetAddress.getLocalHost().getCanonicalHostName()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.bindOnHost")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicating whether the process's internal jetty server bind on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host"),". Default is false, which means binding to all interfaces."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.plaintextPort")),(0,i.kt)("td",{parentName:"tr",align:null},"This is the port to actually listen on; unless port mapping is used, this will be the same port as is on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"8091")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.tlsPort")),(0,i.kt)("td",{parentName:"tr",align:null},"TLS port for HTTPS connector, if ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/tls-support"},"druid.enableTlsPort")," is set then this config will be used. If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")," contains port then that port will be ignored. This should be a non-negative Integer."),(0,i.kt)("td",{parentName:"tr",align:null},"8283")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.service")),(0,i.kt)("td",{parentName:"tr",align:null},"The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid/indexer"))))),(0,i.kt)("h4",{id:"indexer-general-configuration"},"Indexer general configuration"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.version")),(0,i.kt)("td",{parentName:"tr",align:null},"Version identifier for the Indexer."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.capacity")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of tasks the Indexer can accept."),(0,i.kt)("td",{parentName:"tr",align:null},"Number of available processors - 1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.baseTaskDirs")),(0,i.kt)("td",{parentName:"tr",align:null},"List of base temporary working directories, one of which is assigned per task in a round-robin fashion. This property can be used to allow usage of multiple disks for indexing. This property is recommended in place of and takes precedence over ",(0,i.kt)("inlineCode",{parentName:"td"},"${druid.indexer.task.baseTaskDir}"),". If this configuration is not set, ",(0,i.kt)("inlineCode",{parentName:"td"},"${druid.indexer.task.baseTaskDir}")," is used. Example: ",(0,i.kt)("inlineCode",{parentName:"td"},'druid.worker.baseTaskDirs=[\\"PATH1\\",\\"PATH2\\",...]'),"."),(0,i.kt)("td",{parentName:"tr",align:null},"null")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.baseTaskDirSize")),(0,i.kt)("td",{parentName:"tr",align:null},"The total amount of bytes that can be used by tasks on any single task dir. This value is treated symmetrically across all directories, that is, if this is 500 GB and there are 3 ",(0,i.kt)("inlineCode",{parentName:"td"},"baseTaskDirs"),", then each of those task directories is assumed to allow for 500 GB to be used and a total of 1.5 TB will potentially be available across all tasks. The actual amount of memory assigned to each task is discussed in ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#configuring-task-storage-sizes"},"Configuring task storage sizes")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Long.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.globalIngestionHeapLimitBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"Total amount of heap available for ingestion processing. This is applied by automatically setting the ",(0,i.kt)("inlineCode",{parentName:"td"},"maxBytesInMemory")," property on tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"Configured max JVM heap size / 6")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.numConcurrentMerges")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of segment persist or merge operations that can run concurrently across all tasks."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.worker.capacity")," / 2, rounded down")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.baseDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Base temporary working directory."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'System.getProperty("java.io.tmpdir")'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.baseTaskDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Base temporary working directory for tasks."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${druid.indexer.task.baseDir}/persistent/tasks"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.defaultHadoopCoordinates")),(0,i.kt)("td",{parentName:"tr",align:null},"Hadoop version to use with HadoopIndexTasks that do not request a particular version."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.hadoop:hadoop-client-api:3.3.6"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"org.apache.hadoop:hadoop-client-runtime:3.3.6"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.gracefulShutdownTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Wait this long on Indexer restart for restorable tasks to gracefully exit."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.hadoopWorkingPath")),(0,i.kt)("td",{parentName:"tr",align:null},"Temporary working directory for Hadoop tasks."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"/tmp/druid-indexing"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.restoreTasksOnRestart")),(0,i.kt)("td",{parentName:"tr",align:null},"If true, the Indexer will attempt to stop tasks gracefully on shutdown and restore them on restart."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.ignoreTimestampSpecForDruidInputSource")),(0,i.kt)("td",{parentName:"tr",align:null},"If true, tasks using the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/input-sources"},"Druid input source")," will ignore the provided timestampSpec, and will use the ",(0,i.kt)("inlineCode",{parentName:"td"},"__time")," column of the input datasource. This option is provided for compatibility with ingestion specs written before Druid 0.22.0."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.indexer.task.storeEmptyColumns")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean value for whether or not to store empty columns during ingestion. When set to true, Druid stores every column specified in the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/ingestion-spec#dimensionsspec"},(0,i.kt)("inlineCode",{parentName:"a"},"dimensionsSpec")),". ",(0,i.kt)("br",null),(0,i.kt)("br",null),"If you set ",(0,i.kt)("inlineCode",{parentName:"td"},"storeEmptyColumns")," to false, Druid SQL queries referencing empty columns will fail. If you intend to leave ",(0,i.kt)("inlineCode",{parentName:"td"},"storeEmptyColumns")," disabled, you should either ingest placeholder data for empty columns or else not query on empty columns.",(0,i.kt)("br",null),(0,i.kt)("br",null),"You can overwrite this configuration by setting ",(0,i.kt)("inlineCode",{parentName:"td"},"storeEmptyColumns")," in the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/ingestion/tasks#context-parameters"},"task context"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.taskActionClient.retry.minWait")),(0,i.kt)("td",{parentName:"tr",align:null},"The minimum retry time to communicate with Overlord."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.taskActionClient.retry.maxWait")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum retry time to communicate with Overlord."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.peon.taskActionClient.retry.maxRetryCount")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of retries to communicate with Overlord."),(0,i.kt)("td",{parentName:"tr",align:null},"60")))),(0,i.kt)("h4",{id:"indexer-concurrent-requests"},"Indexer concurrent requests"),(0,i.kt)("p",null,"Druid uses Jetty to serve HTTP requests."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.numThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of threads for HTTP requests. Please see the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/design/indexer#server-http-threads"},"Indexer Server HTTP threads")," documentation for more details on how the Indexer uses this configuration."),(0,i.kt)("td",{parentName:"tr",align:null},"max(10, (Number of cores * 17) / 16 + 2) + 30")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.queueSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of the worker queue used by Jetty server to temporarily store incoming client connections. If this value is set and a request is rejected by jetty because queue is full then client would observe request failure with TCP connection being closed immediately with a completely empty response from server."),(0,i.kt)("td",{parentName:"tr",align:null},"Unbounded")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxIdleTime")),(0,i.kt)("td",{parentName:"tr",align:null},"The Jetty max idle time for a connection."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.enableRequestLimit")),(0,i.kt)("td",{parentName:"tr",align:null},'If enabled, no requests would be queued in jetty queue and "HTTP 429 Too Many Requests" error response would be sent.'),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.defaultQueryTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Query timeout in millis, beyond which unfinished queries will be cancelled"),(0,i.kt)("td",{parentName:"tr",align:null},"300000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.gracefulShutdownTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum amount of time Jetty waits after receiving shutdown signal. After this timeout the threads will be forcefully shutdown. This allows any queries that are executing to complete(Only values greater than zero are valid)."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT30S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.unannouncePropagationDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait for ZooKeeper unannouncements to propagate before shutting down Jetty. This is a minimum and ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.gracefulShutdownTimeout")," does not start counting down until after this period elapses."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT0S")," (do not wait)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxQueryTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum allowed value (in milliseconds) for ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout")," parameter. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/query-context"},"query-context")," to know more about ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout"),". Query is rejected if the query context ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout")," is greater than this value."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Long.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxRequestHeaderSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum size of a request header in bytes. Larger headers consume more memory and can make a server more vulnerable to denial of service attacks."),(0,i.kt)("td",{parentName:"tr",align:null},"8 * 1024")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.enableForwardedRequestCustomizer")),(0,i.kt)("td",{parentName:"tr",align:null},"If enabled, adds Jetty ForwardedRequestCustomizer which reads X-Forwarded-* request headers to manipulate servlet request object when Druid is used behind a proxy."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.allowedHttpMethods")),(0,i.kt)("td",{parentName:"tr",align:null},"List of HTTP methods that should be allowed in addition to the ones required by Druid APIs. Druid APIs require GET, PUT, POST, and DELETE, which are always allowed. This option is not useful unless you have installed an extension that needs these additional HTTP methods or that adds functionality related to CORS. None of Druid's bundled extensions require these methods."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"[]"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.contentSecurityPolicy")),(0,i.kt)("td",{parentName:"tr",align:null},"Content-Security-Policy header value to set on each non-POST response. Setting this property to an empty string, or omitting it, both result in the default ",(0,i.kt)("inlineCode",{parentName:"td"},"frame-ancestors: none")," being set."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"frame-ancestors 'none'"))))),(0,i.kt)("h4",{id:"indexer-processing-resources"},"Indexer processing resources"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.sizeBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in the Indexer processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"Human-readable format")," is supported."),(0,i.kt)("td",{parentName:"tr",align:null},"auto (max 1GiB)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.poolCacheMaxCount")),(0,i.kt)("td",{parentName:"tr",align:null},"processing buffer pool caches the buffers for later use, this is the maximum count cache will grow to. note that pool can create more buffers than it can cache if necessary."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Integer.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.formatString")),(0,i.kt)("td",{parentName:"tr",align:null},"Indexer processes use this format string to name their processing threads."),(0,i.kt)("td",{parentName:"tr",align:null},"processing-%s")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.numMergeBuffers")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of direct memory buffers available for merging query results. The buffers are sized by ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.sizeBytes"),". This property is effectively a concurrency limit for queries that require merging buffers. If you are using any queries that require merge buffers (currently, just groupBy) then you should have at least two of these."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"max(2, druid.processing.numThreads / 4)"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.numThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of processing threads to have available for parallel processing of segments. Our rule of thumb is ",(0,i.kt)("inlineCode",{parentName:"td"},"num_cores - 1"),", which means that even under heavy load there will still be one core available to do background tasks like talking with ZooKeeper and pulling down segments. If only one core is available, this property defaults to the value ",(0,i.kt)("inlineCode",{parentName:"td"},"1"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"Number of cores - 1 (or 1)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.fifo")),(0,i.kt)("td",{parentName:"tr",align:null},"If the processing queue should treat tasks of equal priority in a FIFO manner"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.tmpDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Path where temporary files created while processing a query should be stored. If specified, this configuration takes priority over the default ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir")," path."),(0,i.kt)("td",{parentName:"tr",align:null},"path represented by ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir"))))),(0,i.kt)("p",null,"The amount of direct memory needed by Druid is at least\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.processing.buffer.sizeBytes * (druid.processing.numMergeBuffers + druid.processing.numThreads + 1)"),". You can\nensure at least this amount of direct memory is available by providing ",(0,i.kt)("inlineCode",{parentName:"p"},"-XX:MaxDirectMemorySize=")," at the command\nline."),(0,i.kt)("h4",{id:"query-configurations"},"Query configurations"),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#general-query-configuration"},"general query configuration"),"."),(0,i.kt)("h4",{id:"indexer-caching"},"Indexer caching"),(0,i.kt)("p",null,"You can optionally configure caching to be enabled on the Indexer by setting caching configs here."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible Values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.realtime.cache.useCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Enable the cache on the realtime."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.realtime.cache.populateCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Populate the cache on the realtime."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.realtime.cache.unCacheable")),(0,i.kt)("td",{parentName:"tr",align:null},"All druid query types"),(0,i.kt)("td",{parentName:"tr",align:null},"All query types to not cache."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"[]"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.realtime.cache.maxEntrySize")),(0,i.kt)("td",{parentName:"tr",align:null},"positive integer"),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum cache entry size in bytes."),(0,i.kt)("td",{parentName:"tr",align:null},"1_000_000")))),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#cache-configuration"},"cache configuration")," for how to configure cache settings."),(0,i.kt)("p",null,"Note that only local caches such as the ",(0,i.kt)("inlineCode",{parentName:"p"},"local"),"-type cache and ",(0,i.kt)("inlineCode",{parentName:"p"},"caffeine")," cache are supported. If a remote cache such as ",(0,i.kt)("inlineCode",{parentName:"p"},"memcached")," is used, it will be ignored."),(0,i.kt)("h3",{id:"historical"},"Historical"),(0,i.kt)("p",null,"For general Historical service information, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/historical"},"Historical"),"."),(0,i.kt)("p",null,"These Historical configurations can be defined in the ",(0,i.kt)("inlineCode",{parentName:"p"},"historical/runtime.properties")," file."),(0,i.kt)("h4",{id:"historical-service-configuration"},"Historical service configuration"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"The host for the current service. This is used to advertise the current service location as reachable from another service and should generally be specified such that ",(0,i.kt)("inlineCode",{parentName:"td"},"http://${druid.host}/")," could actually talk to this service"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"InetAddress.getLocalHost().getCanonicalHostName()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.bindOnHost")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicating whether the service's internal jetty server bind on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host"),". Default is false, which means binding to all interfaces."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.plaintextPort")),(0,i.kt)("td",{parentName:"tr",align:null},"This is the port to actually listen on; unless port mapping is used, this will be the same port as is on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"8083")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.tlsPort")),(0,i.kt)("td",{parentName:"tr",align:null},"TLS port for HTTPS connector, if ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/tls-support"},"druid.enableTlsPort")," is set then this config will be used. If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")," contains port then that port will be ignored. This should be a non-negative Integer."),(0,i.kt)("td",{parentName:"tr",align:null},"8283")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.service")),(0,i.kt)("td",{parentName:"tr",align:null},"The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid/historical"))))),(0,i.kt)("h4",{id:"historical-general-configuration"},"Historical general configuration"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.maxSize")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum number of bytes-worth of segments that the service wants assigned to it. The Coordinator service will attempt to assign segments to a Historical service only if this property is greater than the total size of segments served by it. Since this property defines the upper limit on the total segment size that can be assigned to a Historical, it is defaulted to the sum of all ",(0,i.kt)("inlineCode",{parentName:"td"},"maxSize")," values specified within ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.locations")," property. Human-readable format is supported, see ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"here"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"Sum of ",(0,i.kt)("inlineCode",{parentName:"td"},"maxSize")," values defined within ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.locations"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.tier")),(0,i.kt)("td",{parentName:"tr",align:null},"A string to name the distribution tier that the storage service belongs to. Many of the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/rule-configuration"},"rules Coordinator services use")," to manage segments can be keyed on tiers."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"_default_tier"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.priority")),(0,i.kt)("td",{parentName:"tr",align:null},"In a tiered architecture, the priority of the tier, thus allowing control over which services are queried. Higher numbers mean higher priority. The default (no priority) works for architecture with no cross replication (tiers that have no data-storage overlap). Data centers typically have equal priority."),(0,i.kt)("td",{parentName:"tr",align:null},"0")))),(0,i.kt)("h4",{id:"storing-segments"},"Storing segments"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.locations")),(0,i.kt)("td",{parentName:"tr",align:null},"Segments assigned to a Historical services are first stored on the local file system (in a disk cache) and then served by the Historical services. These locations define where that local cache resides. This value cannot be NULL or EMPTY. Here is an example ",(0,i.kt)("inlineCode",{parentName:"td"},'druid.segmentCache.locations=[{"path": "/mnt/druidSegments", "maxSize": "10k", "freeSpacePercent": 1.0}]'),'. "freeSpacePercent" is optional, if provided then enforces that much of free disk partition space while storing segments. But, it depends on ',(0,i.kt)("inlineCode",{parentName:"td"},"File.getTotalSpace()")," and ",(0,i.kt)("inlineCode",{parentName:"td"},"File.getFreeSpace()")," methods, so enable if only if they work for your File System."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.locationSelector.strategy")),(0,i.kt)("td",{parentName:"tr",align:null},"The strategy used to select a location from the configured ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.locations")," for segment distribution. Possible values are ",(0,i.kt)("inlineCode",{parentName:"td"},"leastBytesUsed"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"roundRobin"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"random"),", or ",(0,i.kt)("inlineCode",{parentName:"td"},"mostAvailableSize"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"leastBytesUsed")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.deleteOnRemove")),(0,i.kt)("td",{parentName:"tr",align:null},"Delete segment files from cache once a service is no longer serving a segment."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.dropSegmentDelayMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"How long a service delays before completely dropping segment."),(0,i.kt)("td",{parentName:"tr",align:null},"30000 (30 seconds)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.infoDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Historical services keep track of the segments they are serving so that when the service is restarted they can reload the same segments without waiting for the Coordinator to reassign. This path defines where this metadata is kept. Directory will be created if needed."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"${first_location}/info_dir"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.announceIntervalMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"How frequently to announce segments while segments are loading from cache. Set this value to zero to wait for all segments to be loaded before announcing."),(0,i.kt)("td",{parentName:"tr",align:null},"5000 (5 seconds)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numLoadingThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"How many segments to drop or load concurrently from deep storage. Note that the work of loading segments involves downloading segments from deep storage, decompressing them and loading them to a memory mapped location. So the work is not all I/O Bound. Depending on CPU and network load, one could possibly increase this config to a higher value."),(0,i.kt)("td",{parentName:"tr",align:null},"max(1,Number of cores / 6)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numBootstrapThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"How many segments to load concurrently during historical startup."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numLoadingThreads"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.lazyLoadOnStart")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether or not to load segment columns metadata lazily during historical startup. When set to true, Historical startup time will be dramatically improved by deferring segment loading until the first time that segment takes part in a query, which will incur this cost instead."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numThreadsToLoadSegmentsIntoPageCacheOnDownload")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of threads to asynchronously read segment index files into null output stream on each new segment download after the Historical service finishes bootstrapping. Recommended to set to 1 or 2 or leave unspecified to disable. See also ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numThreadsToLoadSegmentsIntoPageCacheOnBootstrap")),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numThreadsToLoadSegmentsIntoPageCacheOnBootstrap")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of threads to asynchronously read segment index files into null output stream during Historical service bootstrap. This thread pool is terminated after Historical service finishes bootstrapping. Recommended to set to half of available cores. If left unspecified, ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numThreadsToLoadSegmentsIntoPageCacheOnDownload")," will be used. If both configs are unspecified, this feature is disabled. Preemptively loading segments into page cache helps in the sense that later when a segment is queried, it's already in page cache and only a minor page fault needs to be triggered instead of a more costly major page fault to make the query latency more consistent. Note that loading segment into page cache just does a blind loading of segment index files and will evict any existing segments from page cache at the discretion of operating system when the total segment size on local disk is larger than the page cache usable in the RAM, which roughly equals to total available RAM in the host - druid process memory including both heap and direct memory allocated - memory used by other non druid processes on the host, so it is the user's responsibility to ensure the host has enough RAM to host all the segments to avoid random evictions to fully leverage this feature."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.segmentCache.numThreadsToLoadSegmentsIntoPageCacheOnDownload"))))),(0,i.kt)("p",null,"In ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.segmentCache.locations"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"freeSpacePercent")," was added because the ",(0,i.kt)("inlineCode",{parentName:"p"},"maxSize")," setting is only a theoretical limit and assumes that much space will always be available for storing segments. In case of any druid bug leading to unaccounted segment files left alone on disk or some other service writing stuff to disk, This check can start failing segment loading early before filling up the disk completely and leaving the host usable otherwise."),(0,i.kt)("p",null,"In ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.segmentCache.locationSelector.strategy"),", one of ",(0,i.kt)("inlineCode",{parentName:"p"},"leastBytesUsed"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"roundRobin"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"random"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"mostAvailableSize")," could be specified to represent the strategy to distribute segments across multiple segment cache locations."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Strategy"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"leastBytesUsed")),(0,i.kt)("td",{parentName:"tr",align:null},"Selects a location which has least bytes used in absolute terms.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"roundRobin")),(0,i.kt)("td",{parentName:"tr",align:null},"Selects a location in a round robin fashion oblivious to the bytes used or the capacity.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"random")),(0,i.kt)("td",{parentName:"tr",align:null},"Selects a segment cache location randomly each time among the available storage locations.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"mostAvailableSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Selects a segment cache location that has most free space among the available storage locations.")))),(0,i.kt)("p",null,"Note that if ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.segmentCache.numLoadingThreads")," > 1, multiple threads can download different segments at the same time. In this case, with the ",(0,i.kt)("inlineCode",{parentName:"p"},"leastBytesUsed")," strategy or ",(0,i.kt)("inlineCode",{parentName:"p"},"mostAvailableSize")," strategy, Historicals may select a sub-optimal storage location because each decision is based on a snapshot of the storage location status of when a segment is requested to download."),(0,i.kt)("h4",{id:"historical-query-configs"},"Historical query configs"),(0,i.kt)("h5",{id:"concurrent-requests"},"Concurrent requests"),(0,i.kt)("p",null,"Druid uses Jetty to serve HTTP requests."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.numThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of threads for HTTP requests."),(0,i.kt)("td",{parentName:"tr",align:null},"max(10, (Number of cores * 17) / 16 + 2) + 30")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.queueSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of the worker queue used by Jetty server to temporarily store incoming client connections. If this value is set and a request is rejected by jetty because queue is full then client would observe request failure with TCP connection being closed immediately with a completely empty response from server."),(0,i.kt)("td",{parentName:"tr",align:null},"Unbounded")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxIdleTime")),(0,i.kt)("td",{parentName:"tr",align:null},"The Jetty max idle time for a connection."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.enableRequestLimit")),(0,i.kt)("td",{parentName:"tr",align:null},'If enabled, no requests would be queued in jetty queue and "HTTP 429 Too Many Requests" error response would be sent.'),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.defaultQueryTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Query timeout in millis, beyond which unfinished queries will be cancelled"),(0,i.kt)("td",{parentName:"tr",align:null},"300000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.gracefulShutdownTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum amount of time Jetty waits after receiving shutdown signal. After this timeout the threads will be forcefully shutdown. This allows any queries that are executing to complete(Only values greater than zero are valid)."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT30S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.unannouncePropagationDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait for ZooKeeper unannouncements to propagate before shutting down Jetty. This is a minimum and ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.gracefulShutdownTimeout")," does not start counting down until after this period elapses."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT0S")," (do not wait)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxQueryTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum allowed value (in milliseconds) for ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout")," parameter. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/query-context"},"query-context")," to know more about ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout"),". Query is rejected if the query context ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout")," is greater than this value."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Long.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxRequestHeaderSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum size of a request header in bytes. Larger headers consume more memory and can make a server more vulnerable to denial of service attacks."),(0,i.kt)("td",{parentName:"tr",align:null},"8 * 1024")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.contentSecurityPolicy")),(0,i.kt)("td",{parentName:"tr",align:null},"Content-Security-Policy header value to set on each non-POST response. Setting this property to an empty string, or omitting it, both result in the default ",(0,i.kt)("inlineCode",{parentName:"td"},"frame-ancestors: none")," being set."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"frame-ancestors 'none'"))))),(0,i.kt)("h5",{id:"processing"},"Processing"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.sizeBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"This specifies a buffer size (less than 2GiB), for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"Human-readable format")," is supported."),(0,i.kt)("td",{parentName:"tr",align:null},"auto (max 1GiB)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.poolCacheMaxCount")),(0,i.kt)("td",{parentName:"tr",align:null},"processing buffer pool caches the buffers for later use, this is the maximum count cache will grow to. note that pool can create more buffers than it can cache if necessary."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Integer.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.formatString")),(0,i.kt)("td",{parentName:"tr",align:null},"Realtime and Historical processes use this format string to name their processing threads."),(0,i.kt)("td",{parentName:"tr",align:null},"processing-%s")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.numMergeBuffers")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of direct memory buffers available for merging query results. The buffers are sized by ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.sizeBytes"),". This property is effectively a concurrency limit for queries that require merging buffers. If you are using any queries that require merge buffers (currently, just groupBy) then you should have at least two of these."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"max(2, druid.processing.numThreads / 4)"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.numThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of processing threads to have available for parallel processing of segments. Our rule of thumb is ",(0,i.kt)("inlineCode",{parentName:"td"},"num_cores - 1"),", which means that even under heavy load there will still be one core available to do background tasks like talking with ZooKeeper and pulling down segments. If only one core is available, this property defaults to the value ",(0,i.kt)("inlineCode",{parentName:"td"},"1"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"Number of cores - 1 (or 1)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.fifo")),(0,i.kt)("td",{parentName:"tr",align:null},"If the processing queue should treat tasks of equal priority in a FIFO manner"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.tmpDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Path where temporary files created while processing a query should be stored. If specified, this configuration takes priority over the default ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir")," path."),(0,i.kt)("td",{parentName:"tr",align:null},"path represented by ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir"))))),(0,i.kt)("p",null,"The amount of direct memory needed by Druid is at least\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.processing.buffer.sizeBytes * (druid.processing.numMergeBuffers + druid.processing.numThreads + 1)"),". You can\nensure at least this amount of direct memory is available by providing ",(0,i.kt)("inlineCode",{parentName:"p"},"-XX:MaxDirectMemorySize=")," at the command\nline."),(0,i.kt)("h5",{id:"historical-query-configuration"},"Historical query configuration"),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#general-query-configuration"},"general query configuration"),"."),(0,i.kt)("h4",{id:"historical-caching"},"Historical caching"),(0,i.kt)("p",null,"You can optionally only configure caching to be enabled on the Historical by setting caching configs here."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible Values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.historical.cache.useCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Enable the cache on the Historical."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.historical.cache.populateCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Populate the cache on the Historical."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.historical.cache.unCacheable")),(0,i.kt)("td",{parentName:"tr",align:null},"All druid query types"),(0,i.kt)("td",{parentName:"tr",align:null},"All query types to not cache."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"[]"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.historical.cache.maxEntrySize")),(0,i.kt)("td",{parentName:"tr",align:null},"positive integer"),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum cache entry size in bytes."),(0,i.kt)("td",{parentName:"tr",align:null},"1_000_000")))),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#cache-configuration"},"cache configuration")," for how to configure cache settings."),(0,i.kt)("h2",{id:"query-server"},"Query server"),(0,i.kt)("p",null,"This section contains the configuration options for the services that reside on Query servers (Brokers) in the suggested ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/architecture#druid-servers"},"three-server configuration"),"."),(0,i.kt)("p",null,"Configuration options for the experimental ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/router"},"Router process")," are also provided here."),(0,i.kt)("h3",{id:"broker"},"Broker"),(0,i.kt)("p",null,"For general Broker process information, see ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/design/broker"},"here"),"."),(0,i.kt)("p",null,"These Broker configurations can be defined in the ",(0,i.kt)("inlineCode",{parentName:"p"},"broker/runtime.properties")," file."),(0,i.kt)("h4",{id:"broker-process-configs"},"Broker process configs"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that ",(0,i.kt)("inlineCode",{parentName:"td"},"http://${druid.host}/")," could actually talk to this process"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"InetAddress.getLocalHost().getCanonicalHostName()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.bindOnHost")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicating whether the process's internal jetty server bind on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host"),". Default is false, which means binding to all interfaces."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.plaintextPort")),(0,i.kt)("td",{parentName:"tr",align:null},"This is the port to actually listen on; unless port mapping is used, this will be the same port as is on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"8082")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.tlsPort")),(0,i.kt)("td",{parentName:"tr",align:null},"TLS port for HTTPS connector, if ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/tls-support"},"druid.enableTlsPort")," is set then this config will be used. If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")," contains port then that port will be ignored. This should be a non-negative Integer."),(0,i.kt)("td",{parentName:"tr",align:null},"8282")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.service")),(0,i.kt)("td",{parentName:"tr",align:null},"The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid/broker"))))),(0,i.kt)("h4",{id:"query-configuration"},"Query configuration"),(0,i.kt)("h5",{id:"query-routing"},"Query routing"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible Values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.balancer.type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"random"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"connectionCount")),(0,i.kt)("td",{parentName:"tr",align:null},"Determines how the broker balances connections to Historical processes. ",(0,i.kt)("inlineCode",{parentName:"td"},"random")," choose randomly, ",(0,i.kt)("inlineCode",{parentName:"td"},"connectionCount")," picks the process with the fewest number of active connections to"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"random"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.select.tier")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"highestPriority"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"lowestPriority"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"custom")),(0,i.kt)("td",{parentName:"tr",align:null},"If segments are cross-replicated across tiers in a cluster, you can tell the broker to prefer to select segments in a tier with a certain priority."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"highestPriority"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.select.tier.custom.priorities")),(0,i.kt)("td",{parentName:"tr",align:null},"An array of integer priorities, such as ",(0,i.kt)("inlineCode",{parentName:"td"},"[-1, 0, 1, 2]")),(0,i.kt)("td",{parentName:"tr",align:null},"Select servers in tiers with a custom priority list."),(0,i.kt)("td",{parentName:"tr",align:null},"The config only has effect if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.select.tier")," is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"custom"),". If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.select.tier")," is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"custom")," but this config is not specified, the effect is the same as ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.select.tier")," set to ",(0,i.kt)("inlineCode",{parentName:"td"},"highestPriority"),". Any of the integers in this config can be ignored if there's no corresponding tiers with such priorities. Tiers with priorities explicitly specified in this config always have higher priority than those not and those not specified fall back to use ",(0,i.kt)("inlineCode",{parentName:"td"},"highestPriority")," strategy among themselves.")))),(0,i.kt)("h5",{id:"query-prioritization-and-laning"},"Query prioritization and laning"),(0,i.kt)("p",null,"Laning strategies allow you to control capacity utilization for heterogeneous query workloads. With laning, the broker examines and classifies a query for the purpose of assigning it to a lane. Lanes have capacity limits, enforced by the broker, that can be used to ensure sufficient resources are available for other lanes or for interactive queries (with no lane), or to limit overall throughput for queries within the lane. Requests in excess of the capacity are discarded with an HTTP 429 status code."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.numThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of concurrently-running queries. When this parameter is set lower than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.numThreads"),", query requests beyond the limit are put into the Jetty request queue. This has the effect of reserving the leftover Jetty threads for non-query requests.",(0,i.kt)("br",null),(0,i.kt)("br",null),"When this parameter is set equal to or higher than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.numThreads"),", it has no effect."),(0,i.kt)("td",{parentName:"tr",align:null},"Unbounded")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.laning.strategy")),(0,i.kt)("td",{parentName:"tr",align:null},"Query laning strategy to use to assign queries to a lane in order to control capacities for certain classes of queries."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"none"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.prioritization.strategy")),(0,i.kt)("td",{parentName:"tr",align:null},"Query prioritization strategy to automatically assign priorities."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"manual"))))),(0,i.kt)("h5",{id:"prioritization-strategies"},"Prioritization strategies"),(0,i.kt)("h6",{id:"manual-prioritization-strategy"},"Manual prioritization strategy"),(0,i.kt)("p",null,"With this configuration, queries are never assigned a priority automatically, but will preserve a priority manually set on the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/query-context"},"query context")," with the ",(0,i.kt)("inlineCode",{parentName:"p"},"priority")," key. This mode can be explicitly set by setting ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.scheduler.prioritization.strategy")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"manual"),"."),(0,i.kt)("h6",{id:"threshold-prioritization-strategy"},"Threshold prioritization strategy"),(0,i.kt)("p",null,"This prioritization strategy lowers the priority of queries that cross any of a configurable set of thresholds, such as how far in the past the data is, how large of an interval a query covers, or the number of segments taking part in a query."),(0,i.kt)("p",null,"This strategy can be enabled by setting ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.scheduler.prioritization.strategy")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"threshold"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.prioritization.periodThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO duration threshold for how old data can be queried before automatically adjusting query priority."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.prioritization.durationThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO duration threshold for maximum duration a queries interval can span before the priority is automatically adjusted."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.prioritization.segmentCountThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"Number threshold for maximum number of segments that can take part in a query before its priority is automatically adjusted."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.prioritization.adjustment")),(0,i.kt)("td",{parentName:"tr",align:null},"Amount to reduce the priority of queries which cross any threshold."),(0,i.kt)("td",{parentName:"tr",align:null},"none")))),(0,i.kt)("h5",{id:"laning-strategies"},"Laning strategies"),(0,i.kt)("h6",{id:"no-laning-strategy"},"No laning strategy"),(0,i.kt)("p",null,"In this mode, queries are never assigned a lane, and the concurrent query count will only be limited by ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.server.http.numThreads")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.scheduler.numThreads"),", if set. This is the default Druid query scheduler operating mode. Enable this strategy explicitly by setting ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.scheduler.laning.strategy")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"none"),"."),(0,i.kt)("h6",{id:"highlow-laning-strategy"},"'High/Low' laning strategy"),(0,i.kt)("p",null,"This laning strategy splits queries with a ",(0,i.kt)("inlineCode",{parentName:"p"},"priority")," below zero into a ",(0,i.kt)("inlineCode",{parentName:"p"},"low")," query lane, automatically. Queries with priority of zero (the default) or above are considered 'interactive'. The limit on ",(0,i.kt)("inlineCode",{parentName:"p"},"low")," queries can be set to some desired percentage of the total capacity (or HTTP thread pool size), reserving capacity for interactive queries. Queries in the ",(0,i.kt)("inlineCode",{parentName:"p"},"low")," lane are ",(0,i.kt)("em",{parentName:"p"},"not")," guaranteed their capacity, which may be consumed by interactive queries, but may use up to this limit if total capacity is available."),(0,i.kt)("p",null,"If the ",(0,i.kt)("inlineCode",{parentName:"p"},"low")," lane is specified in the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/query-context"},"query context")," ",(0,i.kt)("inlineCode",{parentName:"p"},"lane")," parameter, this will override the computed lane."),(0,i.kt)("p",null,"This strategy can be enabled by setting ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.scheduler.laning.strategy=hilo"),"."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.laning.maxLowPercent")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum percent of the smaller number of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.numThreads")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.numThreads"),", defining the number of HTTP threads that can be used by queries with a priority lower than 0. Value must be an integer in the range 1 to 100, and will be rounded up"),(0,i.kt)("td",{parentName:"tr",align:null},"No default, must be set if using this mode")))),(0,i.kt)("h5",{id:"guardrails-for-materialization-of-subqueries"},"Guardrails for materialization of subqueries"),(0,i.kt)("p",null,"Druid stores the subquery rows in temporary tables that live in the Java heap. It is a good practice to avoid large subqueries in Druid.\nTherefore, there are guardrails that are built in Druid to prevent the queries from generating subquery results which can exhaust the heap\nspace. They can be set on a cluster level or modified per query level as desired.\nNote the following guardrails that can be set by the cluster admin to limit the subquery results:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("inlineCode",{parentName:"li"},"druid.server.http.maxSubqueryRows")," in broker's config to set a default for the entire cluster or ",(0,i.kt)("inlineCode",{parentName:"li"},"maxSubqueryRows")," in the query context to set an upper limit on the number of rows a subquery can generate"),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("inlineCode",{parentName:"li"},"druid.server.http.maxSubqueryBytes")," in broker's config to set a default for the entire cluster or ",(0,i.kt)("inlineCode",{parentName:"li"},"maxSubqueryBytes")," in the query context to set an upper limit on the number of bytes a subquery can generate")),(0,i.kt)("p",null,"Limiting the subquery by bytes is an experimental feature as it materializes the results differently."),(0,i.kt)("p",null,"You can configure ",(0,i.kt)("inlineCode",{parentName:"p"},"maxSubqueryBytes")," to the following values:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"disabled"),": It is the default setting out of the box. It disables the subquery's from the byte based limit, and effectively disables this feature."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"auto"),": Druid automatically decides the optimal byte based limit based upon the heap space available and the max number of concurrent queries."),(0,i.kt)("li",{parentName:"ul"},"A positive long value: User can manually specify the number of bytes that the results of the subqueries of a single query can occupy on the heap.")),(0,i.kt)("p",null,"Due to the conversion between the Java objects and the Frame's format, setting ",(0,i.kt)("inlineCode",{parentName:"p"},"maxSubqueryBytes")," can become slow if the subquery starts generating\nrows in the order of magnitude of around 10 million and above. In those scenarios, disable the ",(0,i.kt)("inlineCode",{parentName:"p"},"maxSubqueryBytes")," settings for such queries, assess the number of rows that the subqueries generate and override the ",(0,i.kt)("inlineCode",{parentName:"p"},"maxSubqueryRows")," to appropriate value."),(0,i.kt)("p",null,"If you choose to modify or set any of the above limits, you must also think about the heap size of all Brokers, Historicals, and task Peons that process data for the subqueries to accommodate the subquery results.\nThere is no formula to calculate the correct value. Trial and error is the best approach."),(0,i.kt)("h6",{id:"manual-laning-strategy"},"Manual laning strategy"),(0,i.kt)("p",null,"This laning strategy is best suited for cases where one or more external applications which query Druid are capable of manually deciding what lane a given query should belong to. Configured with a map of lane names to percent or exact max capacities, queries with a matching ",(0,i.kt)("inlineCode",{parentName:"p"},"lane")," parameter in the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/query-context"},"query context")," will be subjected to those limits."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.laning.lanes.{name}")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum percent or exact limit of queries that can concurrently run in the defined lanes. Any number of lanes may be defined like this. The lane names 'total' and 'default' are reserved for internal use."),(0,i.kt)("td",{parentName:"tr",align:null},"No default, must define at least one lane with a limit above 0. If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.laning.isLimitPercent")," is set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", values must be integers in the range of 1 to 100.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.laning.isLimitPercent")),(0,i.kt)("td",{parentName:"tr",align:null},"If set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", the values set for ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.laning.lanes")," will be treated as a percent of the smaller number of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.numThreads")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.scheduler.numThreads"),". Note that in this mode, these lane values across lanes are ",(0,i.kt)("em",{parentName:"td"},"not")," required to add up to, and can exceed, 100%."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))))),(0,i.kt)("h5",{id:"server-configuration"},"Server configuration"),(0,i.kt)("p",null,"Druid uses Jetty to serve HTTP requests. Each query being processed consumes a single thread from ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.server.http.numThreads"),", so consider defining ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.scheduler.numThreads")," to a lower value in order to reserve HTTP threads for responding to health checks, lookup loading, and other non-query, (in most cases) comparatively very short-lived, HTTP requests."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.numThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of threads for HTTP requests."),(0,i.kt)("td",{parentName:"tr",align:null},"max(10, (Number of cores * 17) / 16 + 2) + 30")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.queueSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of the worker queue used by Jetty server to temporarily store incoming client connections. If this value is set and a request is rejected by jetty because queue is full then client would observe request failure with TCP connection being closed immediately with a completely empty response from server."),(0,i.kt)("td",{parentName:"tr",align:null},"Unbounded")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxIdleTime")),(0,i.kt)("td",{parentName:"tr",align:null},"The Jetty max idle time for a connection."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.enableRequestLimit")),(0,i.kt)("td",{parentName:"tr",align:null},'If enabled, no requests would be queued in jetty queue and "HTTP 429 Too Many Requests" error response would be sent.'),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.defaultQueryTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Query timeout in millis, beyond which unfinished queries will be cancelled"),(0,i.kt)("td",{parentName:"tr",align:null},"300000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxScatterGatherBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of bytes gathered from data processes such as Historicals and realtime processes to execute a query. Queries that exceed this limit will fail. This is an advance configuration that allows to protect in case Broker is under heavy load and not utilizing the data gathered in memory fast enough and leading to OOMs. This limit can be further reduced at query time using ",(0,i.kt)("inlineCode",{parentName:"td"},"maxScatterGatherBytes")," in the context. Note that having large limit is not necessarily bad if broker is never under heavy concurrent load in which case data gathered is processed quickly and freeing up the memory used. Human-readable format is supported, see ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"here"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Long.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxSubqueryRows")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of rows from all subqueries per query. Druid stores the subquery rows in temporary tables that live in the Java heap. ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxSubqueryRows"),' is a guardrail to prevent the system from exhausting available heap. When a subquery exceeds the row limit, Druid throws a resource limit exceeded exception: "Subquery generated results beyond maximum."',(0,i.kt)("br",null),(0,i.kt)("br",null),"It is a good practice to avoid large subqueries in Druid. However, if you choose to raise the subquery row limit, you must also increase the heap size of all Brokers, Historicals, and task Peons that process data for the subqueries to accommodate the subquery results.",(0,i.kt)("br",null),(0,i.kt)("br",null),"There is no formula to calculate the correct value. Trial and error is the best approach."),(0,i.kt)("td",{parentName:"tr",align:null},"100000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxSubqueryBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of bytes from all subqueries per query. Since the results are stored on the Java heap, ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxSubqueryBytes")," is a guardrail like ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxSubqueryRows")," to prevent the heap space from exhausting. When a subquery exceeds the byte limit, Druid throws a resource limit exceeded exception. A negative value for the guardrail indicates that Druid won't guardrail by memory. This can be set to 'disabled' which disables the results from being limited via the byte limit, 'auto' which sets this value automatically taking free heap space into account, or a positive long value depicting the number of bytes per query's subqueries' results can occupy. This is an experimental feature for now as this materializes the results in a different format."),(0,i.kt)("td",{parentName:"tr",align:null},"'disabled'")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.gracefulShutdownTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum amount of time Jetty waits after receiving shutdown signal. After this timeout the threads will be forcefully shutdown. This allows any queries that are executing to complete(Only values greater than zero are valid)."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT30S"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.unannouncePropagationDelay")),(0,i.kt)("td",{parentName:"tr",align:null},"How long to wait for ZooKeeper unannouncements to propagate before shutting down Jetty. This is a minimum and ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.gracefulShutdownTimeout")," does not start counting down until after this period elapses."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT0S")," (do not wait)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxQueryTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum allowed value (in milliseconds) for ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout")," parameter. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/query-context"},"query-context")," to know more about ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout"),". Query is rejected if the query context ",(0,i.kt)("inlineCode",{parentName:"td"},"timeout")," is greater than this value."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Long.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxRequestHeaderSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum size of a request header in bytes. Larger headers consume more memory and can make a server more vulnerable to denial of service attacks."),(0,i.kt)("td",{parentName:"tr",align:null},"8 * 1024")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.contentSecurityPolicy")),(0,i.kt)("td",{parentName:"tr",align:null},"Content-Security-Policy header value to set on each non-POST response. Setting this property to an empty string, or omitting it, both result in the default ",(0,i.kt)("inlineCode",{parentName:"td"},"frame-ancestors: none")," being set."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"frame-ancestors 'none'"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.enableHSTS")),(0,i.kt)("td",{parentName:"tr",align:null},"If set to true, druid services will add strict transport security header ",(0,i.kt)("inlineCode",{parentName:"td"},"Strict-Transport-Security: max-age=63072000; includeSubDomains")," to all HTTP responses"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))))),(0,i.kt)("h5",{id:"client-configuration"},"Client configuration"),(0,i.kt)("p",null,"Druid Brokers use an HTTP client to communicate with data servers (Historical servers and real-time tasks). This\nclient has the following configuration options."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.numConnections")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of connection pool for the Broker to connect to Historical and real-time processes. If there are more queries than this number that all need to speak to the same process, then they will queue up."),(0,i.kt)("td",{parentName:"tr",align:null},"20")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.eagerInitialization")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicates that http connections from Broker to Historical and Real-time processes should be eagerly initialized. If set to true, ",(0,i.kt)("inlineCode",{parentName:"td"},"numConnections")," connections are created upon initialization"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.compressionCodec")),(0,i.kt)("td",{parentName:"tr",align:null},'Compression codec the Broker uses to communicate with Historical and real-time processes. May be "gzip" or "identity".'),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"gzip"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.readTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout for data reads from Historical servers and real-time tasks."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT15M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.unusedConnectionTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout for idle connections in connection pool. The connection in the pool will be closed after this timeout and a new one will be established. This timeout should be less than ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.readTimeout"),". Set this timeout = ~90% of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.readTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT4M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.maxQueuedBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of bytes queued per query before exerting ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/basic-cluster-tuning#broker-backpressure"},"backpressure")," on channels to the data servers.",(0,i.kt)("br",null),(0,i.kt)("br",null),"Similar to ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.server.http.maxScatterGatherBytes"),", except that ",(0,i.kt)("inlineCode",{parentName:"td"},"maxQueuedBytes")," triggers ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/basic-cluster-tuning#broker-backpressure"},"backpressure")," instead of query failure. Set to zero to disable. You can override this setting by using the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/query-context"},(0,i.kt)("inlineCode",{parentName:"a"},"maxQueuedBytes")," query context parameter"),". Druid supports ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"human-readable")," format."),(0,i.kt)("td",{parentName:"tr",align:null},"25 MB or 2% of maximum Broker heap size, whichever is greater.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.numMaxThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"`Maximum number of I/O worker threads"),(0,i.kt)("td",{parentName:"tr",align:null},"max(10, ((number of cores * 17) / 16 + 2) + 30)`")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.http.clientConnectTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout (in milliseconds) for establishing client connections."),(0,i.kt)("td",{parentName:"tr",align:null},"500")))),(0,i.kt)("h5",{id:"retry-policy"},"Retry policy"),(0,i.kt)("p",null,"Druid broker can optionally retry queries internally for transient errors."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.retryPolicy.numTries")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of tries."),(0,i.kt)("td",{parentName:"tr",align:null},"1")))),(0,i.kt)("h5",{id:"processing-1"},"Processing"),(0,i.kt)("p",null,"The broker uses processing configs for nested groupBy queries."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.sizeBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"Human-readable format")," is supported."),(0,i.kt)("td",{parentName:"tr",align:null},"auto (max 1GiB)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.poolCacheInitialCount")),(0,i.kt)("td",{parentName:"tr",align:null},"initializes the number of buffers allocated on the intermediate results pool. Note that pool can create more buffers if necessary."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"0"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.poolCacheMaxCount")),(0,i.kt)("td",{parentName:"tr",align:null},"processing buffer pool caches the buffers for later use, this is the maximum count cache will grow to. note that pool can create more buffers than it can cache if necessary."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Integer.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.numMergeBuffers")),(0,i.kt)("td",{parentName:"tr",align:null},"The number of direct memory buffers available for merging query results. The buffers are sized by ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.buffer.sizeBytes"),". This property is effectively a concurrency limit for queries that require merging buffers. If you are using any queries that require merge buffers (currently, just groupBy) then you should have at least two of these."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"max(2, druid.processing.numThreads / 4)"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.fifo")),(0,i.kt)("td",{parentName:"tr",align:null},"If the processing queue should treat tasks of equal priority in a FIFO manner"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.tmpDir")),(0,i.kt)("td",{parentName:"tr",align:null},"Path where temporary files created while processing a query should be stored. If specified, this configuration takes priority over the default ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir")," path."),(0,i.kt)("td",{parentName:"tr",align:null},"path represented by ",(0,i.kt)("inlineCode",{parentName:"td"},"java.io.tmpdir"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.merge.useParallelMergePool")),(0,i.kt)("td",{parentName:"tr",align:null},"Enable automatic parallel merging for Brokers on a dedicated async ForkJoinPool. If ",(0,i.kt)("inlineCode",{parentName:"td"},"false"),", instead merges will be done serially on the ",(0,i.kt)("inlineCode",{parentName:"td"},"HTTP")," thread pool."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.merge.pool.parallelism")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of ForkJoinPool. Note that the default configuration assumes that the value returned by ",(0,i.kt)("inlineCode",{parentName:"td"},"Runtime.getRuntime().availableProcessors()")," represents 2 hyper-threads per physical core, and multiplies this value by ",(0,i.kt)("inlineCode",{parentName:"td"},"0.75")," in attempt to size ",(0,i.kt)("inlineCode",{parentName:"td"},"1.5")," times the number of ",(0,i.kt)("em",{parentName:"td"},"physical")," cores."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Runtime.getRuntime().availableProcessors() * 0.75")," (rounded up)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.merge.pool.defaultMaxQueryParallelism")),(0,i.kt)("td",{parentName:"tr",align:null},"Default maximum number of parallel merge tasks per query. Note that the default configuration assumes that the value returned by ",(0,i.kt)("inlineCode",{parentName:"td"},"Runtime.getRuntime().availableProcessors()")," represents 2 hyper-threads per physical core, and multiplies this value by ",(0,i.kt)("inlineCode",{parentName:"td"},"0.5")," in attempt to size to the number of ",(0,i.kt)("em",{parentName:"td"},"physical")," cores."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Runtime.getRuntime().availableProcessors() * 0.5")," (rounded up)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.merge.pool.awaitShutdownMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"Time to wait for merge ForkJoinPool tasks to complete before ungracefully stopping on process shutdown in milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"60_000"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.merge.task.targetRunTimeMillis")),(0,i.kt)("td",{parentName:"tr",align:null},"Ideal run-time of each ForkJoinPool merge task, before forking off a new task to continue merging sequences."),(0,i.kt)("td",{parentName:"tr",align:null},"100")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.merge.task.initialYieldNumRows")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of rows to yield per ForkJoinPool merge task, before forking off a new task to continue merging sequences."),(0,i.kt)("td",{parentName:"tr",align:null},"16384")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.merge.task.smallBatchNumRows")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of result batches to operate on in ForkJoinPool merge tasks."),(0,i.kt)("td",{parentName:"tr",align:null},"4096")))),(0,i.kt)("p",null,"The amount of direct memory needed by Druid is at least\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.processing.buffer.sizeBytes * (druid.processing.numMergeBuffers + 1)"),". You can\nensure at least this amount of direct memory is available by providing ",(0,i.kt)("inlineCode",{parentName:"p"},"-XX:MaxDirectMemorySize=")," at the command\nline."),(0,i.kt)("h5",{id:"broker-query-configuration"},"Broker query configuration"),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#general-query-configuration"},"general query configuration"),"."),(0,i.kt)("h6",{id:"broker-generated-query-configuration-supplementation"},"Broker generated query configuration supplementation"),(0,i.kt)("p",null,"The Broker generates queries internally. This configuration section describes how an operator can augment the configuration\nof these queries."),(0,i.kt)("p",null,"As of now the only supported augmentation is overriding the default query context. This allows an operator the flexibility\nto adjust it as they see fit. A common use of this configuration is to override the query priority of the cluster generated\nqueries in order to avoid running as a default priority of 0."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.internal.query.config.context")),(0,i.kt)("td",{parentName:"tr",align:null},"A string formatted ",(0,i.kt)("inlineCode",{parentName:"td"},"key:value")," map of a query context to add to internally generated broker queries."),(0,i.kt)("td",{parentName:"tr",align:null},"null")))),(0,i.kt)("h4",{id:"sql"},"SQL"),(0,i.kt)("p",null,"The Druid SQL server is configured through the following properties on the Broker."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.enable")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether to enable SQL at all, including background metadata fetching. If false, this overrides all other SQL-related properties and disables SQL metadata, serving, and planning completely."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.avatica.enable")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether to enable JDBC querying at ",(0,i.kt)("inlineCode",{parentName:"td"},"/druid/v2/sql/avatica/"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.avatica.maxConnections")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of open connections for the Avatica server. These are not HTTP connections, but are logical client connections that may span multiple HTTP connections."),(0,i.kt)("td",{parentName:"tr",align:null},"25")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.avatica.maxRowsPerFrame")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum acceptable value for the JDBC client ",(0,i.kt)("inlineCode",{parentName:"td"},"Statement.setFetchSize")," method. This setting determines the maximum number of rows that Druid will populate in a single 'fetch' for a JDBC ",(0,i.kt)("inlineCode",{parentName:"td"},"ResultSet"),". Set this property to -1 to enforce no row limit on the server-side and potentially return the entire set of rows on the initial statement execution. If the JDBC client calls ",(0,i.kt)("inlineCode",{parentName:"td"},"Statement.setFetchSize")," with a value other than -1, Druid uses the lesser value of the client-provided limit and ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsPerFrame"),". If ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsPerFrame")," is smaller than ",(0,i.kt)("inlineCode",{parentName:"td"},"minRowsPerFrame"),", then the ",(0,i.kt)("inlineCode",{parentName:"td"},"ResultSet")," size will be fixed. To handle queries that produce results with a large number of rows, you can increase value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.avatica.maxRowsPerFrame")," to reduce the number of fetches required to completely transfer the result set."),(0,i.kt)("td",{parentName:"tr",align:null},"5,000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.avatica.minRowsPerFrame")),(0,i.kt)("td",{parentName:"tr",align:null},"Minimum acceptable value for the JDBC client ",(0,i.kt)("inlineCode",{parentName:"td"},"Statement.setFetchSize")," method. The value for this property must greater than 0. If the JDBC client calls ",(0,i.kt)("inlineCode",{parentName:"td"},"Statement.setFetchSize")," with a lesser value, Druid uses ",(0,i.kt)("inlineCode",{parentName:"td"},"minRowsPerFrame")," instead. If ",(0,i.kt)("inlineCode",{parentName:"td"},"maxRowsPerFrame")," is less than ",(0,i.kt)("inlineCode",{parentName:"td"},"minRowsPerFrame"),", Druid uses the minimum value of the two. For handling queries which produce results with a large number of rows, you can increase this value to reduce the number of fetches required to completely transfer the result set."),(0,i.kt)("td",{parentName:"tr",align:null},"100")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.avatica.maxStatementsPerConnection")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of simultaneous open statements per Avatica client connection."),(0,i.kt)("td",{parentName:"tr",align:null},"4")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.avatica.connectionIdleTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Avatica client connection idle timeout."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT5M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.avatica.fetchTimeoutMs")),(0,i.kt)("td",{parentName:"tr",align:null},"Avatica fetch timeout, in milliseconds. When a request for the next batch of data takes longer than this time, Druid returns an empty result set, causing the client to poll again. This avoids HTTP timeouts for long-running queries. The default of 5 sec. is good for most cases."),(0,i.kt)("td",{parentName:"tr",align:null},"5000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.http.enable")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether to enable JSON over HTTP querying at ",(0,i.kt)("inlineCode",{parentName:"td"},"/druid/v2/sql/"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.maxTopNLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum threshold for a ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/topnquery"},"TopN query"),". Higher limits will be planned as ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/groupbyquery"},"GroupBy queries")," instead."),(0,i.kt)("td",{parentName:"tr",align:null},"100000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.metadataRefreshPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"Throttle for metadata refreshes."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.metadataColumnTypeMergePolicy")),(0,i.kt)("td",{parentName:"tr",align:null},"Defines how column types will be chosen when faced with differences between segments when computing the SQL schema. Options are specified as a JSON object, with valid choices of ",(0,i.kt)("inlineCode",{parentName:"td"},"leastRestrictive")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"latestInterval"),". For ",(0,i.kt)("inlineCode",{parentName:"td"},"leastRestrictive"),", Druid will automatically widen the type computed for the schema to a type which data across all segments can be converted into, however planned schema migrations can only take effect once all segments have been re-ingested to the new schema. With ",(0,i.kt)("inlineCode",{parentName:"td"},"latestInterval"),", the column type in most recent time chunks defines the type for the schema."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"leastRestrictive"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.useApproximateCountDistinct")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether to use an approximate cardinality algorithm for ",(0,i.kt)("inlineCode",{parentName:"td"},"COUNT(DISTINCT foo)"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.useGroupingSetForExactDistinct")),(0,i.kt)("td",{parentName:"tr",align:null},"Only relevant when ",(0,i.kt)("inlineCode",{parentName:"td"},"useApproximateCountDistinct")," is disabled. If set to true, exact distinct queries are re-written using grouping sets. Otherwise, exact distinct queries are re-written using joins. This should be set to true for group by query with multiple exact distinct aggregations. This flag can be overridden per query."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.useApproximateTopN")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether to use approximate ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/topnquery"},"TopN queries")," when a SQL query could be expressed as such. If false, exact ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/groupbyquery"},"GroupBy queries")," will be used instead."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.requireTimeCondition")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether to require SQL to have filter conditions on ",(0,i.kt)("inlineCode",{parentName:"td"},"__time")," column so that all generated native queries will have user specified intervals. If true, all queries without filter condition on ",(0,i.kt)("inlineCode",{parentName:"td"},"__time")," column will fail"),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.sqlTimeZone")),(0,i.kt)("td",{parentName:"tr",align:null},'Sets the default time zone for the server, which will affect how time functions and timestamp literals behave. Should be a time zone name like "America/Los_Angeles" or offset like "-08:00".'),(0,i.kt)("td",{parentName:"tr",align:null},"UTC")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.metadataSegmentCacheEnable")),(0,i.kt)("td",{parentName:"tr",align:null},"Whether to keep a cache of published segments in broker. If true, broker polls coordinator in background to get segments from metadata store and maintains a local cache. If false, coordinator's REST API will be invoked when broker needs published segments info."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.metadataSegmentPollPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to poll coordinator for published segments list if ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.metadataSegmentCacheEnable")," is set to true. Poll period is in milliseconds."),(0,i.kt)("td",{parentName:"tr",align:null},"60000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.authorizeSystemTablesDirectly")),(0,i.kt)("td",{parentName:"tr",align:null},"If true, Druid authorizes queries against any of the system schema tables (",(0,i.kt)("inlineCode",{parentName:"td"},"sys")," in SQL) as ",(0,i.kt)("inlineCode",{parentName:"td"},"SYSTEM_TABLE")," resources which require ",(0,i.kt)("inlineCode",{parentName:"td"},"READ")," access, in addition to permissions based content filtering."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.useNativeQueryExplain")),(0,i.kt)("td",{parentName:"tr",align:null},"If true, ",(0,i.kt)("inlineCode",{parentName:"td"},"EXPLAIN PLAN FOR")," will return the explain plan as a JSON representation of equivalent native query(s), else it will return the original version of explain plan generated by Calcite. It can be overridden per query with ",(0,i.kt)("inlineCode",{parentName:"td"},"useNativeQueryExplain")," context key."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.maxNumericInFilters")),(0,i.kt)("td",{parentName:"tr",align:null},"Max limit for the amount of numeric values that can be compared for a string type dimension when the entire SQL WHERE clause of a query translates to an ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/filters#or"},"OR")," of ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/filters#bound-filter"},"Bound filter"),". By default, Druid does not restrict the amount of numeric Bound Filters on String columns, although this situation may block other queries from running. Set this property to a smaller value to prevent Druid from running queries that have prohibitively long segment processing times. The optimal limit requires some trial and error; we recommend starting with 100. Users who submit a query that exceeds the limit of ",(0,i.kt)("inlineCode",{parentName:"td"},"maxNumericInFilters")," should instead rewrite their queries to use strings in the ",(0,i.kt)("inlineCode",{parentName:"td"},"WHERE")," clause instead of numbers. For example, ",(0,i.kt)("inlineCode",{parentName:"td"},"WHERE someString IN (\u2018123\u2019, \u2018456\u2019)"),". If this value is disabled, ",(0,i.kt)("inlineCode",{parentName:"td"},"maxNumericInFilters")," set through query context is ignored."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-1")," (disabled)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.approxCountDistinct.function")),(0,i.kt)("td",{parentName:"tr",align:null},"Implementation to use for the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/sql-aggregations"},(0,i.kt)("inlineCode",{parentName:"a"},"APPROX_COUNT_DISTINCT")," function"),". Without extensions loaded, the only valid value is ",(0,i.kt)("inlineCode",{parentName:"td"},"APPROX_COUNT_DISTINCT_BUILTIN")," (a HyperLogLog, or HLL, based implementation). If the ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/development/extensions-core/datasketches-extension"},"DataSketches extension")," is loaded, this can also be ",(0,i.kt)("inlineCode",{parentName:"td"},"APPROX_COUNT_DISTINCT_DS_HLL")," (alternative HLL implementation) or ",(0,i.kt)("inlineCode",{parentName:"td"},"APPROX_COUNT_DISTINCT_DS_THETA"),".",(0,i.kt)("br",null),(0,i.kt)("br",null),"Theta sketches use significantly more memory than HLL sketches, so you should prefer one of the two HLL implementations."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"APPROX_COUNT_DISTINCT_BUILTIN"))))),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"}," Previous versions of Druid had properties named ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.sql.planner.maxQueryCount")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.sql.planner.maxSemiJoinRowsInMemory"),".\nThese properties are no longer available. Since Druid 0.18.0, you can use ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.server.http.maxSubqueryRows")," to control the maximum\nnumber of rows permitted across all subqueries.")),(0,i.kt)("h4",{id:"broker-caching"},"Broker caching"),(0,i.kt)("p",null,"You can optionally only configure caching to be enabled on the Broker by setting caching configs here."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible Values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.cache.useCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Enable the cache on the Broker."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.cache.populateCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Populate the cache on the Broker."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.cache.useResultLevelCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Enable result level caching on the Broker."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.cache.populateResultLevelCache")),(0,i.kt)("td",{parentName:"tr",align:null},"true, false"),(0,i.kt)("td",{parentName:"tr",align:null},"Populate the result level cache on the Broker."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.cache.resultLevelCacheLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"positive integer"),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum size of query response that can be cached."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Integer.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.cache.unCacheable")),(0,i.kt)("td",{parentName:"tr",align:null},"All druid query types"),(0,i.kt)("td",{parentName:"tr",align:null},"All query types to not cache."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"[]"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.cache.cacheBulkMergeLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"positive integer or 0"),(0,i.kt)("td",{parentName:"tr",align:null},"Queries with more segments than this number will not attempt to fetch from cache at the broker level, leaving potential caching fetches (and cache result merging) to the Historicals"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"Integer.MAX_VALUE"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.cache.maxEntrySize")),(0,i.kt)("td",{parentName:"tr",align:null},"positive integer"),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum cache entry size in bytes."),(0,i.kt)("td",{parentName:"tr",align:null},"1_000_000")))),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#cache-configuration"},"cache configuration")," for how to configure cache settings."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"}," Note: Even if cache is enabled, for ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/groupbyquery"},"groupBy")," queries, segment level cache does not work on Brokers.\nSee ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/caching"},"Query caching")," for more information.")),(0,i.kt)("h4",{id:"segment-discovery"},"Segment discovery"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible Values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.serverview.type")),(0,i.kt)("td",{parentName:"tr",align:null},"batch or http"),(0,i.kt)("td",{parentName:"tr",align:null},'Segment discovery method to use. "http" enables discovering segments using HTTP instead of ZooKeeper.'),(0,i.kt)("td",{parentName:"tr",align:null},"http")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.segment.watchedTiers")),(0,i.kt)("td",{parentName:"tr",align:null},"List of strings"),(0,i.kt)("td",{parentName:"tr",align:null},"The Broker watches segment announcements from processes that serve segments to build a cache to relate each process to the segments it serves. This configuration allows the Broker to only consider segments being served from a list of tiers. By default, Broker considers all tiers. This can be used to partition your dataSources in specific Historical tiers and configure brokers in partitions so that they are only queryable for specific dataSources. This config is mutually exclusive from ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.segment.ignoredTiers")," and at most one of these can be configured on a Broker."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.segment.ignoredTiers")),(0,i.kt)("td",{parentName:"tr",align:null},"List of strings"),(0,i.kt)("td",{parentName:"tr",align:null},"The Broker watches segment announcements from processes that serve segments to build a cache to relate each process to the segments it serves. This configuration allows the Broker to ignore the segments being served from a list of tiers. By default, Broker considers all tiers. This config is mutually exclusive from ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.segment.watchedTiers")," and at most one of these can be configured on a Broker."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.segment.watchedDataSources")),(0,i.kt)("td",{parentName:"tr",align:null},"List of strings"),(0,i.kt)("td",{parentName:"tr",align:null},"Broker watches the segment announcements from processes serving segments to build cache of which process is serving which segments, this configuration allows to only consider segments being served from a whitelist of dataSources. By default, Broker would consider all datasources. This can be used to configure brokers in partitions so that they are only queryable for specific dataSources."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.segment.watchRealtimeTasks")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"The Broker watches segment announcements from processes that serve segments to build a cache to relate each process to the segments it serves. When ",(0,i.kt)("inlineCode",{parentName:"td"},"watchRealtimeTasks")," is true, the Broker watches for segment announcements from both Historicals and realtime processes. To configure a broker to exclude segments served by realtime processes, set ",(0,i.kt)("inlineCode",{parentName:"td"},"watchRealtimeTasks")," to false."),(0,i.kt)("td",{parentName:"tr",align:null},"true")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.broker.segment.awaitInitializationOnStart")),(0,i.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,i.kt)("td",{parentName:"tr",align:null},"Whether the Broker will wait for its view of segments to fully initialize before starting up. If set to 'true', the Broker's HTTP server will not start up, and the Broker will not announce itself as available, until the server view is initialized. See also ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.sql.planner.awaitInitializationOnStart"),", a related setting."),(0,i.kt)("td",{parentName:"tr",align:null},"true")))),(0,i.kt)("h2",{id:"cache-configuration"},"Cache configuration"),(0,i.kt)("p",null,"This section describes caching configuration that is common to Broker, Historical, and Middle Manager/Peon processes."),(0,i.kt)("p",null,"Caching could optionally be enabled on the Broker, Historical, and Middle Manager/Peon processes. See\n",(0,i.kt)("a",{parentName:"p",href:"#broker-caching"},"Broker"),", ",(0,i.kt)("a",{parentName:"p",href:"#historical-caching"},"Historical"),", and ",(0,i.kt)("a",{parentName:"p",href:"#peon-caching"},"Peon")," configuration options for how to\nenable it for different processes."),(0,i.kt)("p",null,"Druid uses a local in-memory cache by default, unless a different type of cache is specified.\nUse the ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.cache.type")," configuration to set a different kind of cache."),(0,i.kt)("p",null,"Cache settings are set globally, so the same configuration can be re-used\nfor both Broker and Historical processes, when defined in the common properties file."),(0,i.kt)("h3",{id:"cache-type"},"Cache type"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Possible Values"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.type")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"local"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"memcached"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"hybrid"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"caffeine")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of cache to use for queries. See below of the configuration options for each cache type"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"caffeine"))))),(0,i.kt)("h4",{id:"local-cache"},"Local cache"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"}," DEPRECATED: Use caffeine (default as of v0.12.0) instead")),(0,i.kt)("p",null,"The local cache is deprecated in favor of the Caffeine cache, and may be removed in a future version of Druid. The Caffeine cache affords significantly better performance and control over eviction behavior compared to ",(0,i.kt)("inlineCode",{parentName:"p"},"local")," cache, and is recommended in any situation where you are using JRE 8u60 or higher."),(0,i.kt)("p",null,"A simple in-memory LRU cache. Local cache resides in JVM heap memory, so if you enable it, make sure you increase heap size accordingly."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.sizeInBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum cache size in bytes. Zero disables caching."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.initialSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Initial size of the hash table backing the cache."),(0,i.kt)("td",{parentName:"tr",align:null},"500000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.logEvictionCount")),(0,i.kt)("td",{parentName:"tr",align:null},"If non-zero, log cache eviction every ",(0,i.kt)("inlineCode",{parentName:"td"},"logEvictionCount")," items."),(0,i.kt)("td",{parentName:"tr",align:null},"0")))),(0,i.kt)("h4",{id:"caffeine-cache"},"Caffeine cache"),(0,i.kt)("p",null,"A highly performant local cache implementation for Druid based on ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/ben-manes/caffeine"},"Caffeine"),". Requires a JRE8u60 or higher if using ",(0,i.kt)("inlineCode",{parentName:"p"},"COMMON_FJP"),"."),(0,i.kt)("h5",{id:"configuration"},"Configuration"),(0,i.kt)("p",null,"The following table shows the configuration options known to this module:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"th"},"runtime.properties")),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Set this to ",(0,i.kt)("inlineCode",{parentName:"td"},"caffeine")," or leave out parameter"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"caffeine"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.sizeInBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"The maximum size of the cache in bytes on heap. It can be configured as described in ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/configuration/human-readable-byte"},"here"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"min(1GiB, Runtime.maxMemory / 10)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.expireAfter")),(0,i.kt)("td",{parentName:"tr",align:null},"The time (in ms) after an access for which a cache entry may be expired"),(0,i.kt)("td",{parentName:"tr",align:null},"None (no time limit)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.cacheExecutorFactory")),(0,i.kt)("td",{parentName:"tr",align:null},"The executor factory to use for Caffeine maintenance. One of ",(0,i.kt)("inlineCode",{parentName:"td"},"COMMON_FJP"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"SINGLE_THREAD"),", or ",(0,i.kt)("inlineCode",{parentName:"td"},"SAME_THREAD")),(0,i.kt)("td",{parentName:"tr",align:null},"ForkJoinPool common pool (",(0,i.kt)("inlineCode",{parentName:"td"},"COMMON_FJP"),")")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.evictOnClose")),(0,i.kt)("td",{parentName:"tr",align:null},"If a close of a namespace (ex: removing a segment from a process) should cause an eager eviction of associated cache values"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))))),(0,i.kt)("h5",{id:"druidcachecacheexecutorfactory"},(0,i.kt)("inlineCode",{parentName:"h5"},"druid.cache.cacheExecutorFactory")),(0,i.kt)("p",null,"The following are the possible values for ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.cache.cacheExecutorFactory"),", which controls how maintenance tasks are run:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"COMMON_FJP")," (default) use the common ForkJoinPool. Should use with ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/4810#issuecomment-329922810"},"JRE 8u60 or higher"),". Older versions of the JRE may have worse performance than newer JRE versions."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"SINGLE_THREAD")," Use a single-threaded executor."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"SAME_THREAD")," Cache maintenance is done eagerly.")),(0,i.kt)("h5",{id:"metrics"},"Metrics"),(0,i.kt)("p",null,"In addition to the normal cache metrics, the caffeine cache implementation also reports the following in both ",(0,i.kt)("inlineCode",{parentName:"p"},"total")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"delta"),":"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Metric"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Normal value"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"query/cache/caffeine/*/requests")),(0,i.kt)("td",{parentName:"tr",align:null},"Count of hits or misses."),(0,i.kt)("td",{parentName:"tr",align:null},"hit + miss")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"query/cache/caffeine/*/loadTime")),(0,i.kt)("td",{parentName:"tr",align:null},"Length of time caffeine spends loading new values (unused feature)."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"query/cache/caffeine/*/evictionBytes")),(0,i.kt)("td",{parentName:"tr",align:null},"Size in bytes that have been evicted from the cache"),(0,i.kt)("td",{parentName:"tr",align:null},"Varies, should tune cache ",(0,i.kt)("inlineCode",{parentName:"td"},"sizeInBytes")," so that ",(0,i.kt)("inlineCode",{parentName:"td"},"sizeInBytes"),"/",(0,i.kt)("inlineCode",{parentName:"td"},"evictionBytes")," is approximately the rate of cache churn you desire.")))),(0,i.kt)("h5",{id:"memcached"},"Memcached"),(0,i.kt)("p",null,"Uses memcached as cache backend. This allows all processes to share the same cache."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.expiration")),(0,i.kt)("td",{parentName:"tr",align:null},"Memcached ",(0,i.kt)("a",{parentName:"td",href:"https://code.google.com/p/memcached/wiki/NewCommands#Standard_Protocol"},"expiration time"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"2592000 (30 days)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.timeout")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum time in milliseconds to wait for a response from Memcached."),(0,i.kt)("td",{parentName:"tr",align:null},"500")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.hosts")),(0,i.kt)("td",{parentName:"tr",align:null},"Comma separated list of Memcached hosts ",(0,i.kt)("inlineCode",{parentName:"td"},""),". Need to specify all nodes when ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.clientMode")," is set to static. Dynamic mode ",(0,i.kt)("a",{parentName:"td",href:"https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/AutoDiscovery.html"},"automatically identifies nodes in your cluster")," so just specifying the configuration endpoint and port is fine."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.maxObjectSize")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum object size in bytes for a Memcached object."),(0,i.kt)("td",{parentName:"tr",align:null},"52428800 (50 MiB)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.memcachedPrefix")),(0,i.kt)("td",{parentName:"tr",align:null},"Key prefix for all keys in Memcached."),(0,i.kt)("td",{parentName:"tr",align:null},"druid")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.numConnections")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of memcached connections to use."),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.protocol")),(0,i.kt)("td",{parentName:"tr",align:null},"Memcached communication protocol. Can be binary or text."),(0,i.kt)("td",{parentName:"tr",align:null},"binary")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.locator")),(0,i.kt)("td",{parentName:"tr",align:null},"Memcached locator. Can be consistent or ",(0,i.kt)("inlineCode",{parentName:"td"},"array_mod"),"."),(0,i.kt)("td",{parentName:"tr",align:null},"consistent")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.enableTls")),(0,i.kt)("td",{parentName:"tr",align:null},"Enable TLS based connection for Memcached client. Boolean."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.clientMode")),(0,i.kt)("td",{parentName:"tr",align:null},"Client Mode. Static mode requires the user to specify individual cluster nodes. Dynamic mode uses ",(0,i.kt)("a",{parentName:"td",href:"https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/AutoDiscovery.HowAutoDiscoveryWorks.html"},"AutoDiscovery")," feature of AWS Memcached. String. ",(0,i.kt)("a",{parentName:"td",href:"https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/AutoDiscovery.Manual.html"},'"static"')," or ",(0,i.kt)("a",{parentName:"td",href:"https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/AutoDiscovery.Using.ModifyApp.Java.html"},'"dynamic"')),(0,i.kt)("td",{parentName:"tr",align:null},"static")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.skipTlsHostnameVerification")),(0,i.kt)("td",{parentName:"tr",align:null},"Skip TLS Hostname Verification. Boolean."),(0,i.kt)("td",{parentName:"tr",align:null},"true")))),(0,i.kt)("h4",{id:"hybrid"},"Hybrid"),(0,i.kt)("p",null,"Uses a combination of any two caches as a two-level L1 / L2 cache.\nThis may be used to combine a local in-memory cache with a remote memcached cache."),(0,i.kt)("p",null,"Cache requests will first check L1 cache before checking L2.\nIf there is an L1 miss and L2 hit, it will also populate L1."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.l1.type")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of cache to use for L1 cache. See ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.type")," configuration for valid types."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"caffeine"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.l2.type")),(0,i.kt)("td",{parentName:"tr",align:null},"The type of cache to use for L2 cache. See ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.type")," configuration for valid types."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"caffeine"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.l1.*")),(0,i.kt)("td",{parentName:"tr",align:null},"Any property valid for the given type of L1 cache can be set using this prefix. For instance, if you are using a ",(0,i.kt)("inlineCode",{parentName:"td"},"caffeine")," L1 cache, specify ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.l1.sizeInBytes")," to set its size."),(0,i.kt)("td",{parentName:"tr",align:null},"defaults are the same as for the given cache type")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.l2.*")),(0,i.kt)("td",{parentName:"tr",align:null},"Prefix for L2 cache settings, see description for L1."),(0,i.kt)("td",{parentName:"tr",align:null},"defaults are the same as for the given cache type")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.useL2")),(0,i.kt)("td",{parentName:"tr",align:null},"A boolean indicating whether to query L2 cache, if it's a miss in L1. It makes sense to configure this to ",(0,i.kt)("inlineCode",{parentName:"td"},"false")," on Historical processes, if L2 is a remote cache like ",(0,i.kt)("inlineCode",{parentName:"td"},"memcached"),", and this cache also used on brokers, because in this case if a query reached Historical it means that a broker didn't find corresponding results in the same remote cache, so a query to the remote cache from Historical is guaranteed to be a miss."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.cache.populateL2")),(0,i.kt)("td",{parentName:"tr",align:null},"A boolean indicating whether to put results into L2 cache."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))))),(0,i.kt)("h2",{id:"general-query-configuration"},"General query configuration"),(0,i.kt)("p",null,"This section describes configurations that control behavior of Druid's query types, applicable to Broker, Historical, and Middle Manager processes."),(0,i.kt)("h3",{id:"overriding-default-query-context-values"},"Overriding default query context values"),(0,i.kt)("p",null,"You can override any ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/query-context#general-parameters"},"query context general parameter")," default value by setting the runtime property in the format of ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context.{query_context_key}"),".\nThe ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context.{query_context_key}")," runtime property prefix applies to all current and future query context keys, the same as how query context parameter passed with the query works. You can override the runtime property value if the value for the same key is specified in the query contexts."),(0,i.kt)("p",null,"The precedence chain for query context values is as follows:"),(0,i.kt)("p",null,"hard-coded default value in Druid code <- runtime property not prefixed with ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context"),"\n<- runtime property prefixed with ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context")," <- context parameter in the query"),(0,i.kt)("p",null,"Note that not all query context key has a runtime property not prefixed with ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context")," that can\noverride the hard-coded default value. For example, ",(0,i.kt)("inlineCode",{parentName:"p"},"maxQueuedBytes")," has ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.broker.http.maxQueuedBytes"),"\nbut ",(0,i.kt)("inlineCode",{parentName:"p"},"joinFilterRewriteMaxSize")," does not. Hence, the only way of overriding ",(0,i.kt)("inlineCode",{parentName:"p"},"joinFilterRewriteMaxSize")," hard-coded default\nvalue is with runtime property ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context.joinFilterRewriteMaxSize"),"."),(0,i.kt)("p",null,"To further elaborate on the previous example:"),(0,i.kt)("p",null,"If neither ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.broker.http.maxQueuedBytes")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context.maxQueuedBytes")," is set and\nthe query does not have ",(0,i.kt)("inlineCode",{parentName:"p"},"maxQueuedBytes")," in the context, then the hard-coded value in Druid code is use.\nIf runtime property only contains ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.broker.http.maxQueuedBytes=x")," and query does not have ",(0,i.kt)("inlineCode",{parentName:"p"},"maxQueuedBytes")," in the\ncontext, then the value of the property, ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),", is use. However, if query does have ",(0,i.kt)("inlineCode",{parentName:"p"},"maxQueuedBytes")," in the context,\nthen that value is use instead.\nIf runtime property only contains ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context.maxQueuedBytes=y")," OR runtime property contains both\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.broker.http.maxQueuedBytes=x")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context.maxQueuedBytes=y"),", then the value of\n",(0,i.kt)("inlineCode",{parentName:"p"},"druid.query.default.context.maxQueuedBytes"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"y"),", is use (given that query does not have ",(0,i.kt)("inlineCode",{parentName:"p"},"maxQueuedBytes")," in the\ncontext). If query does have ",(0,i.kt)("inlineCode",{parentName:"p"},"maxQueuedBytes")," in the context, then that value is use instead."),(0,i.kt)("h3",{id:"topn-query-config"},"TopN query config"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.topN.minTopNThreshold")),(0,i.kt)("td",{parentName:"tr",align:null},"See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/topnquery#aliasing"},"TopN Aliasing")," for details."),(0,i.kt)("td",{parentName:"tr",align:null},"1000")))),(0,i.kt)("h3",{id:"search-query-config"},"Search query config"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.search.maxSearchLimit")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of search results to return."),(0,i.kt)("td",{parentName:"tr",align:null},"1000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.search.searchStrategy")),(0,i.kt)("td",{parentName:"tr",align:null},"Default search query strategy."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"useIndexes"))))),(0,i.kt)("h3",{id:"segmentmetadata-query-config"},"SegmentMetadata query config"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.segmentMetadata.defaultHistory")),(0,i.kt)("td",{parentName:"tr",align:null},"When no interval is specified in the query, use a default interval of defaultHistory before the end time of the most recent segment, specified in ISO8601 format. This property also controls the duration of the default interval used by ",(0,i.kt)("inlineCode",{parentName:"td"},"GET")," ",(0,i.kt)("inlineCode",{parentName:"td"},"/druid/v2/datasources/{dataSourceName}")," interactions for retrieving datasource dimensions and metrics."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"P1W"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.segmentMetadata.defaultAnalysisTypes")),(0,i.kt)("td",{parentName:"tr",align:null},"This can be used to set the Default Analysis Types for all segment metadata queries, this can be overridden when making the query"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'["cardinality", "interval", "minmax"]'))))),(0,i.kt)("h3",{id:"groupby-query-config"},"GroupBy query config"),(0,i.kt)("p",null,"This section describes the configurations for groupBy queries. You can set the runtime properties in the ",(0,i.kt)("inlineCode",{parentName:"p"},"runtime.properties")," file on Broker, Historical, and Middle Manager processes. You can set the query context parameters through the ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/querying/query-context"},"query context"),"."),(0,i.kt)("p",null,"Supported runtime properties:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxSelectorDictionarySize")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum amount of heap space (approximately) to use for per-segment string dictionaries. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/groupbyquery#memory-tuning-and-resource-limits"},"groupBy memory tuning and resource limits")," for details."),(0,i.kt)("td",{parentName:"tr",align:null},"100000000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxMergingDictionarySize")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum amount of heap space (approximately) to use for per-query string dictionaries. When the dictionary exceeds this size, a spill to disk will be triggered. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/groupbyquery#memory-tuning-and-resource-limits"},"groupBy memory tuning and resource limits")," for details."),(0,i.kt)("td",{parentName:"tr",align:null},"100000000")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxOnDiskStorage")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum amount of disk space to use, per-query, for spilling result sets to disk when either the merging buffer or the dictionary fills up. Queries that exceed this limit will fail. Set to zero to disable disk spilling."),(0,i.kt)("td",{parentName:"tr",align:null},"0 (disabled)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.defaultOnDiskStorage")),(0,i.kt)("td",{parentName:"tr",align:null},"Default amount of disk space to use, per-query, for spilling the result sets to disk when either the merging buffer or the dictionary fills up. Set to zero to disable disk spilling for queries which don't override ",(0,i.kt)("inlineCode",{parentName:"td"},"maxOnDiskStorage")," in their context."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxOnDiskStorage"))))),(0,i.kt)("p",null,"Supported query contexts:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Key"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxSelectorDictionarySize")),(0,i.kt)("td",{parentName:"tr",align:null},"Can be used to lower the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxMergingDictionarySize")," for this query.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxMergingDictionarySize")),(0,i.kt)("td",{parentName:"tr",align:null},"Can be used to lower the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxMergingDictionarySize")," for this query.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"maxOnDiskStorage")),(0,i.kt)("td",{parentName:"tr",align:null},"Can be used to set ",(0,i.kt)("inlineCode",{parentName:"td"},"maxOnDiskStorage")," to a value between 0 and ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxOnDiskStorage")," for this query. If this query context override exceeds ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxOnDiskStorage"),", the query will use ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.maxOnDiskStorage"),". Omitting this from the query context will cause the query to use ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.defaultOnDiskStorage")," for ",(0,i.kt)("inlineCode",{parentName:"td"},"maxOnDiskStorage"))))),(0,i.kt)("h3",{id:"advanced-configurations"},"Advanced configurations"),(0,i.kt)("p",null,"Supported runtime properties:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.singleThreaded")),(0,i.kt)("td",{parentName:"tr",align:null},"Merge results using a single thread."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.bufferGrouperInitialBuckets")),(0,i.kt)("td",{parentName:"tr",align:null},"Initial number of buckets in the off-heap hash table used for grouping results. Set to 0 to use a reasonable default (1024)."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.bufferGrouperMaxLoadFactor")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum load factor of the off-heap hash table used for grouping results. When the load factor exceeds this size, the table will be grown or spilled to disk. Set to 0 to use a reasonable default (0.7)."),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.forceHashAggregation")),(0,i.kt)("td",{parentName:"tr",align:null},"Force to use hash-based aggregation."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.intermediateCombineDegree")),(0,i.kt)("td",{parentName:"tr",align:null},"Number of intermediate processes combined together in the combining tree. Higher degrees will need less threads which might be helpful to improve the query performance by reducing the overhead of too many threads if the server has sufficiently powerful CPU cores."),(0,i.kt)("td",{parentName:"tr",align:null},"8")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.numParallelCombineThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Hint for the number of parallel combining threads. This should be larger than 1 to turn on the parallel combining feature. The actual number of threads used for parallel combining is min(",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.numParallelCombineThreads"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.processing.numThreads"),")."),(0,i.kt)("td",{parentName:"tr",align:null},"1 (disabled)")))),(0,i.kt)("p",null,"Supported query contexts:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Key"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"groupByIsSingleThreaded")),(0,i.kt)("td",{parentName:"tr",align:null},"Overrides the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.singleThreaded")," for this query."),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"bufferGrouperInitialBuckets")),(0,i.kt)("td",{parentName:"tr",align:null},"Overrides the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.bufferGrouperInitialBuckets")," for this query."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"bufferGrouperMaxLoadFactor")),(0,i.kt)("td",{parentName:"tr",align:null},"Overrides the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.bufferGrouperMaxLoadFactor")," for this query."),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"forceHashAggregation")),(0,i.kt)("td",{parentName:"tr",align:null},"Overrides the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.forceHashAggregation")),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"intermediateCombineDegree")),(0,i.kt)("td",{parentName:"tr",align:null},"Overrides the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.intermediateCombineDegree")),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"numParallelCombineThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Overrides the value of ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.query.groupBy.numParallelCombineThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"none")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"sortByDimsFirst")),(0,i.kt)("td",{parentName:"tr",align:null},"Sort the results first by dimension values and then by timestamp."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"forceLimitPushDown")),(0,i.kt)("td",{parentName:"tr",align:null},"When all fields in the orderby are part of the grouping key, the broker will push limit application down to the Historical processes. When the sorting order uses fields that are not in the grouping key, applying this optimization can result in approximate results with unknown accuracy, so this optimization is disabled by default in that case. Enabling this context flag turns on limit push down for limit/orderbys that contain non-grouping key columns."),(0,i.kt)("td",{parentName:"tr",align:null},"false")))),(0,i.kt)("h4",{id:"expression-processing-configurations"},"Expression processing configurations"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Key"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.expressions.useStrictBooleans")),(0,i.kt)("td",{parentName:"tr",align:null},"Controls the behavior of Druid boolean operators and functions, if set to ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," all boolean values are either ",(0,i.kt)("inlineCode",{parentName:"td"},"1")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"0"),". This configuration has been deprecated and will be removed in a future release, taking on the ",(0,i.kt)("inlineCode",{parentName:"td"},"true")," behavior. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/querying/math-expr#logical-operator-modes"},"expression documentation")," for more information."),(0,i.kt)("td",{parentName:"tr",align:null},"true")))),(0,i.kt)("h3",{id:"router"},"Router"),(0,i.kt)("h4",{id:"router-process-configs"},"Router process configs"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that ",(0,i.kt)("inlineCode",{parentName:"td"},"http://${druid.host}/")," could actually talk to this process"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"InetAddress.getLocalHost().getCanonicalHostName()"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.bindOnHost")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicating whether the process's internal jetty server bind on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host"),". Default is false, which means binding to all interfaces."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.plaintextPort")),(0,i.kt)("td",{parentName:"tr",align:null},"This is the port to actually listen on; unless port mapping is used, this will be the same port as is on ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")),(0,i.kt)("td",{parentName:"tr",align:null},"8888")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.tlsPort")),(0,i.kt)("td",{parentName:"tr",align:null},"TLS port for HTTPS connector, if ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/operations/tls-support"},"druid.enableTlsPort")," is set then this config will be used. If ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.host")," contains port then that port will be ignored. This should be a non-negative Integer."),(0,i.kt)("td",{parentName:"tr",align:null},"9088")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.service")),(0,i.kt)("td",{parentName:"tr",align:null},"The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid/router"))))),(0,i.kt)("h4",{id:"runtime-configuration"},"Runtime configuration"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Property"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Default"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.defaultBrokerServiceName")),(0,i.kt)("td",{parentName:"tr",align:null},"The default Broker to connect to in case service discovery fails."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid/broker"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.tierToBrokerMap")),(0,i.kt)("td",{parentName:"tr",align:null},"Queries for a certain tier of data are routed to their appropriate Broker. This value should be an ordered JSON map of tiers to Broker names. The priority of Brokers is based on the ordering."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'{"_default_tier": ""}'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.defaultRule")),(0,i.kt)("td",{parentName:"tr",align:null},"The default rule for all datasources."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"_default"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.pollPeriod")),(0,i.kt)("td",{parentName:"tr",align:null},"How often to poll for new rules."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT1M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.sql.enable")),(0,i.kt)("td",{parentName:"tr",align:null},"Enable routing of SQL queries using strategies. When",(0,i.kt)("inlineCode",{parentName:"td"},"true"),", the Router uses the strategies defined in ",(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.strategies")," to determine the broker service for a given SQL query. When ",(0,i.kt)("inlineCode",{parentName:"td"},"false"),", the Router uses the ",(0,i.kt)("inlineCode",{parentName:"td"},"defaultBrokerServiceName"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"false"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.strategies")),(0,i.kt)("td",{parentName:"tr",align:null},"Please see ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/design/router#router-strategies"},"Router Strategies")," for details."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'[{"type":"timeBoundary"},{"type":"priority"}]'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.avatica.balancer.type")),(0,i.kt)("td",{parentName:"tr",align:null},"Class to use for balancing Avatica queries across Brokers. Please see ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/design/router#avatica-query-balancing"},"Avatica Query Balancing"),"."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"rendezvousHash"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.managementProxy.enabled")),(0,i.kt)("td",{parentName:"tr",align:null},"Enables the Router's ",(0,i.kt)("a",{parentName:"td",href:"/docs/31.0.0/design/router#router-as-management-proxy"},"management proxy")," functionality."),(0,i.kt)("td",{parentName:"tr",align:null},"false")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.http.numConnections")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of connection pool for the Router to connect to Broker processes. If there are more queries than this number that all need to speak to the same process, then they will queue up."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"20"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.http.eagerInitialization")),(0,i.kt)("td",{parentName:"tr",align:null},"Indicates that http connections from Router to Broker should be eagerly initialized. If set to true, ",(0,i.kt)("inlineCode",{parentName:"td"},"numConnections")," connections are created upon initialization"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"true"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.http.readTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout for data reads from Broker processes."),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"PT15M"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.http.numMaxThreads")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of worker threads to handle HTTP requests and responses"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"max(10, ((number of cores * 17) / 16 + 2) + 30)"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.http.numRequestsQueued")),(0,i.kt)("td",{parentName:"tr",align:null},"Maximum number of requests that may be queued to a destination"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"1024"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.http.requestBuffersize")),(0,i.kt)("td",{parentName:"tr",align:null},"Size of the content buffer for receiving requests. These buffers are only used for active connections that have requests with bodies that will not fit within the header buffer"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"8 * 1024"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"druid.router.http.clientConnectTimeout")),(0,i.kt)("td",{parentName:"tr",align:null},"The timeout (in milliseconds) for establishing client connections."),(0,i.kt)("td",{parentName:"tr",align:null},"500")))))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b6d922f1.d7b831bc.js b/assets/js/b6d922f1.d7b831bc.js new file mode 100644 index 0000000000..cb73831139 --- /dev/null +++ b/assets/js/b6d922f1.d7b831bc.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[9076],{14137:(e,t,r)=>{"use strict";r.d(t,{Zo:()=>p,kt:()=>w});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function s(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var d=a.createContext({}),l=function(e){var t=a.useContext(d),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},p=function(e){var t=l(e.components);return a.createElement(d.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,d=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=l(r),h=n,w=c["".concat(d,".").concat(h)]||c[h]||u[h]||i;return r?a.createElement(w,s(s({ref:t},p),{},{components:r})):a.createElement(w,s({ref:t},p))}));function w(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,s=new Array(i);s[0]=h;var o={};for(var d in t)hasOwnProperty.call(t,d)&&(o[d]=t[d]);o.originalType=e,o[c]="string"==typeof e?e:n,s[1]=o;for(var l=2;l{"use strict";r.r(t),r.d(t,{contentTitle:()=>l,default:()=>w,frontMatter:()=>d,metadata:()=>p,toc:()=>c});var a=r(87462),n=r(63366),i=(r(67294),r(14137)),s=r(60701),o=["components"],d={title:"Download"},l=void 0,p={type:"mdx",permalink:"/downloads",source:"@site/src/pages/downloads.mdx",title:"Download",description:"Latest release",frontMatter:{title:"Download"}},c=[{value:"Latest release",id:"latest-release",level:2},{value:"Get started",id:"get-started",level:2},{value:"Optional dependencies",id:"optional-dependencies",level:2},{value:"MySQL JDBC Driver",id:"mysql-jdbc-driver",level:3},{value:"Release candidates",id:"release-candidates",level:2},{value:"Older releases",id:"older-releases",level:2}],u={toc:c},h="wrapper";function w(e){var t=e.components,r=(0,n.Z)(e,o);return(0,i.kt)(h,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"latest-release"},"Latest release"),(0,i.kt)("p",null,"The latest Apache Druid stable release is ",s.w[0].version,"."),(0,i.kt)("ul",null,(0,i.kt)("li",null,"Release date: ",s.w[0].date),(0,i.kt)("li",null,"Binary download: ",(0,i.kt)("a",{href:"https://www.apache.org/dyn/closer.cgi?path=/druid/"+s.w[0].version+"/apache-druid-"+s.w[0].version+"-bin.tar.gz"},"apache-druid-",s.w[0].version,"-bin.tar.gz")," (",(0,i.kt)("a",{href:"https://www.apache.org/dist/druid/"+s.w[0].version+"/apache-druid-"+s.w[0].version+"-bin.tar.gz.sha512"},"sha512"),", ",(0,i.kt)("a",{href:"https://www.apache.org/dist/druid/"+s.w[0].version+"/apache-druid-"+s.w[0].version+"-bin.tar.gz.asc"},"pgp"),")"),(0,i.kt)("li",null,"Source download: ",(0,i.kt)("a",{href:"https://www.apache.org/dyn/closer.cgi?path=/druid/"+s.w[0].version+"/apache-druid-"+s.w[0].version+"-src.tar.gz"},"apache-druid-",s.w[0].version,"-src.tar.gz")," (",(0,i.kt)("a",{href:"https://www.apache.org/dist/druid/"+s.w[0].version+"/apache-druid-"+s.w[0].version+"-src.tar.gz.sha512"},"sha512"),", ",(0,i.kt)("a",{href:"https://www.apache.org/dist/druid/"+s.w[0].version+"/apache-druid-"+s.w[0].version+"-src.tar.gz.asc"},"pgp"),")"),(0,i.kt)("li",null,"Release notes: ",(0,i.kt)("a",{href:"https://github.com/apache/druid/releases/tag/druid-"+s.w[0].version},s.w[0].version))),(0,i.kt)("p",null,"You should verify your download by following these ",(0,i.kt)("a",{parentName:"p",href:"https://www.apache.org/info/verification.html"},"procedures")," and using these ",(0,i.kt)("a",{parentName:"p",href:"https://www.apache.org/dist/druid/KEYS"},"KEYS"),"."),(0,i.kt)("p",null,"To learn more about releases, please visit the ",(0,i.kt)("a",{parentName:"p",href:"/docs/latest/development/versioning"},"versioning page"),"."),(0,i.kt)("h2",{id:"get-started"},"Get started"),(0,i.kt)("p",null,"To get started with Druid, visit the ",(0,i.kt)("a",{parentName:"p",href:"/docs/latest/tutorials/"},"quickstart"),"."),(0,i.kt)("h2",{id:"optional-dependencies"},"Optional dependencies"),(0,i.kt)("h3",{id:"mysql-jdbc-driver"},"MySQL JDBC Driver"),(0,i.kt)("p",null,"Due to licensing considerations, the MySQL metadata store extension does not include the required MySQL JDBC driver which\nmust be downloaded separately. Please see the ",(0,i.kt)("a",{parentName:"p",href:"/docs/latest/development/extensions-core/mysql"},"documentation")," for instructions on how to include this library."),(0,i.kt)("h2",{id:"release-candidates"},"Release candidates"),(0,i.kt)("p",null,"Release candidates are announced on the ",(0,i.kt)("a",{parentName:"p",href:"https://lists.apache.org/list.html?dev@druid.apache.org"},"Druid dev mailing list"),"."),(0,i.kt)("p",null,"If you are interested in being notified of upcoming release candidates and being involved in the dev community (e.g. validating and approving RC builds), you can subscribe to the list by emailing: ",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("a",{parentName:"strong",href:"mailto:dev-subscribe@druid.apache.org"},"dev-subscribe@druid.apache.org"))),(0,i.kt)("p",null,"Previous discussions are available in the ",(0,i.kt)("a",{parentName:"p",href:"https://lists.apache.org/list.html?dev@druid.apache.org"},"Apache Mail Archives"),"."),(0,i.kt)("h2",{id:"older-releases"},"Older releases"),(0,i.kt)("p",null,"The previous major release branch of Apache Druid was ",s.w[1].version,"."),(0,i.kt)("h3",null,s.w[1].version),(0,i.kt)("ul",null,(0,i.kt)("li",null,"Release date: ",s.w[1].date),(0,i.kt)("li",null,"Binary download: ",(0,i.kt)("a",{href:"https://www.apache.org/dyn/closer.cgi?path=/druid/"+s.w[1].version+"/apache-druid-"+s.w[1].version+"-bin.tar.gz"},"apache-druid-",s.w[1].version,"-bin.tar.gz")," (",(0,i.kt)("a",{href:"https://www.apache.org/dist/druid/"+s.w[1].version+"/apache-druid-"+s.w[1].version+"-bin.tar.gz.sha512"},"sha512"),", ",(0,i.kt)("a",{href:"https://www.apache.org/dist/druid/"+s.w[1].version+"/apache-druid-"+s.w[1].version+"-bin.tar.gz.asc"},"pgp"),")"),(0,i.kt)("li",null,"Source download: ",(0,i.kt)("a",{href:"https://www.apache.org/dyn/closer.cgi?path=/druid/"+s.w[1].version+"/apache-druid-"+s.w[1].version+"-src.tar.gz"},"apache-druid-",s.w[1].version,"-src.tar.gz")," (",(0,i.kt)("a",{href:"https://www.apache.org/dist/druid/"+s.w[1].version+"/apache-druid-"+s.w[1].version+"-src.tar.gz.sha512"},"sha512"),", ",(0,i.kt)("a",{href:"https://www.apache.org/dist/druid/"+s.w[1].version+"/apache-druid-"+s.w[1].version+"-src.tar.gz.asc"},"pgp"),")"),(0,i.kt)("li",null,"Release notes: ",(0,i.kt)("a",{href:"https://github.com/apache/druid/releases/tag/druid-"+s.w[1].version},s.w[1].version))),(0,i.kt)("p",null,"All other releases of Apache Druid are available at the ",(0,i.kt)("a",{parentName:"p",href:"https://archive.apache.org/dist/druid/"},"Apache Druid release archives"),"."),(0,i.kt)("p",null,"Archived versions of releases made while Druid was under the Apache Incubator are available at ",(0,i.kt)("a",{parentName:"p",href:"https://archive.apache.org/dist/incubator/druid/"},"Apache Druid (incubating) release archives"),"."))}w.isMDXComponent=!0},60701:e=>{e.exports.w=[{version:"31.0.0",date:"Oct 18 2024"},{version:"30.0.1",date:"Sep 17 2024"},{version:"29.0.1",date:"Apr 3 2024"}]}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.692de4ec.js b/assets/js/c4f5d8e4.692de4ec.js new file mode 100644 index 0000000000..5b2adfeab6 --- /dev/null +++ b/assets/js/c4f5d8e4.692de4ec.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[4193],{99845:(e,a,t)=>{"use strict";t.r(a),t.d(a,{default:()=>f});var n=t(70063),i=t(67294);function l(e){var a=e.data;return i.createElement("div",{className:"druid-feature"},i.createElement("h5",null,a.title),i.createElement("p",null,a.description))}function r(e){var a=e.jsonData;return i.createElement("div",{className:"druid-feature-container"},a.map((function(e){return i.createElement(l,{key:e.id,data:e})})))}var s=[{title:"Interactive Query Engine",description:"Druid utilizes scatter/gather for high speed queries with data preloaded into memory or local storage to avoid data movement and network latency."},{title:"Tiering & QoS",description:"Configurable tiering with quality of service enables the ideal price-performance for mixed workloads, guarantees priority, and avoids resource contention."},{title:"Optimized Data Format",description:"Ingested data is automatically columnarized, time-indexed, dictionary-encoded, bitmap-indexed, and type-aware compressed."},{title:"Elastic Architecture",description:"Loosely coupled components for ingestion, queries, and orchestration combined with a deep storage layer enable easy & quick scale-up & scale-out."},{title:"True Stream Ingestion",description:"A connector-free integration with streaming platforms enables query-on-arrival, high scalability, low latency, and guaranteed consistency."},{title:"Non-stop Reliability",description:"Automatic data services including continuous backup, automated recovery, and multi-node replication ensure high availability and durability."},{title:"Schema Auto-Discovery",description:"Druid can automatically detect, define, and update column names and data types upon ingestion, providing the ease of schemaless and the performance of strongly typed schemas."},{title:"Flexible Joins Support",description:"Druid supports join operations during data ingestion and at query-time execution, with the fastest query performance when tables are pre-joined during ingestion."},{title:"SQL Support",description:"Developers and analysts can easily use the familiar SQL API for end-to-end data operations across ingestion, transformation, and querying."}];function o(e){var a=e.data;return i.createElement("div",null,i.createElement("p",null,i.createElement("i",{className:"fa fa-solid fa-calendar cal-icon"}),i.createElement("b",null,a.date),i.createElement("br",null),a.name,i.createElement("br",null),a.info,i.createElement("br",null),i.createElement("a",{href:a.link},"Learn more")))}function c(e){var a=e.jsonData,t=new Date;return i.createElement("div",null," ",0===a.length?i.createElement("p",null,"Nothing scheduled yet."):a.map((function(e){return new Date(e.date)>=t?i.createElement(o,{key:e.name,data:e}):null})))}var d=[{date:"2023-07-27",name:"In-person (Americas)",info:"Real-Time Meetup: Druid Roadmap + Success Stories from Conviva & ThousandEyes",link:"https://www.meetup.com/druidio/events/294343938/"},{date:"2023-03-02",name:"Virtual Drop-in (Asia)",info:"Apache Druid Meetup by Imply",link:"https://www.meetup.com/bangalore-druid-meetup-group/events/291483003/"}];function m(e){var a=e.data;return i.createElement("div",null,i.createElement("p",null,i.createElement("a",{href:a.link},i.createElement("b",null,a.title)),a.name,i.createElement("br",null),a.date))}function u(e){var a=e.jsonData.slice(0,5);return i.createElement("div",null,a.map((function(e){return i.createElement(m,{key:e.name,data:e})})))}var p=[{date:"2024-09-04",title:"APIs, Analytics, and Apache Druid: How Kong Delivers API Observability and Insights",name:"Reena Leone",link:"https://imply.io/podcast/apis-analytics-apache-druid-kong-api-observability-insights-hiroshi-fukada/",company:"Imply"},{date:"2024-09-22",title:"Druid Data Cookbook: Flattening Arrays of Complex Objects",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2024/09/22/druid-data-cookbook-flattening-arrays-of-complex-objects/",company:"Imply"},{date:"2024-06-17",title:"Using Spectator Histogram and DDSketch for Advanced Statistical Analysis",name:"Reena Leone",link:"https://imply.io/blog/community-spotlight-using-netflix-spectator-histogram-kongs-ddsketch-apache-druid-advanced-statistical-analysis/",company:"Imply"},{date:"2024-04-29",title:"Monitoring Apache Druid in Grafana",name:"Beata Zawi\u015blak",link:"https://www.deep.bi/blog/monitoring-apache-druid-in-grafana",company:"Deep.BI"},{date:"2024-03-29",title:"Getting up to Speed on Druid\u2019s Performance, Ecosystem, and SQL Compliance",name:"Reena Leone",link:"https://imply.io/podcast/apache-druid-29-getting-up-to-speed-performance-ecosystem-sql-compliance-sergio-ferragut/",company:"Imply"},{date:"2023-11-25",title:"Druid Data Cookbook: Upserts in Druid SQL",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2023/11/25/druid-data-cookbook-upserts-in-druid-sql/",company:"Imply"},{date:"2023-09-07",title:"New in Apache Druid 27: Querying Deep Storage",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2023/09/07/new-in-apache-druid-27-querying-deep-storage/",company:"Imply"},{date:"2023-08-29",title:"Using Druid with MinIO",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2023/08/29/using-druid-with-minio/",company:"Imply"},{date:"2023-06-28",title:"Indexes in Apache Druid",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2023/06/28/indexes-in-apache-druid/",company:"Imply"},{date:"2023-04-23",title:"Multi-Value Dimensions in Apache Druid (Part 5)",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2023/04/23/multivalue-dimensions-in-apache-druid-part-5/",company:"Imply"},{date:"2023-04-08",title:"Druid Sneak Peek: Timeseries Interpolation",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2023/04/08/druid-sneak-peek-timeseries-interpolation/",company:"Imply"},{date:"2023-03-07",title:"Selective Bulk Upserts in Apache Druid",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2023/03/07/selective-bulk-upserts-in-apache-druid/",company:"Imply"},{date:"2023-01-27",title:"Primary and secondary partitioning",name:"Sergio Ferragut",link:"https://imply.io/blog/real-time-analytics-database-uses-partitioning-and-pruning-to-achieve-its-legendary-performance/",company:"Imply"},{date:"2023-01-27",title:"Using Apache Druid for analyzing streaming data",name:"Julia Brouillette",link:"https://devops.com/stream-big-think-bigger-analyze-streaming-data-at-scale/",company:"Imply"},{date:"2022-12-15",title:"Why Confluent analyzes Kafka streams with Druid",name:"Matt Armstrong",link:"https://www.youtube.com/watch?v=Bozxc3vP1PA",company:"Imply"},{date:"2022-12-14",title:"Support for nested JSON columns in Druid",name:"Karthik Kasibhatla",link:"https://imply.io/blog/native-support-for-semi-structured-data-in-apache-druid/",company:"Imply"},{date:"2022-12-02",title:"Apache Druid's fit in the modern data stack",name:"David Wang",link:"https://imply.io/videos/apache-druids-fit-in-the-modern-data-stack/",company:"Imply"},{date:"2023-01-22",title:"Apache Druid: Data Lifecycle Management",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2023/01/22/apache-druid-data-lifecycle-management/",company:"Imply"},{date:"2022-03-20",title:"Druid Data Cookbook: Quantiles in Druid with Data Sketches",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2022/03/20/druid-data-cookbook-quantiles-in-druid-with-datasketches/",company:"Imply"},{date:"2022-02-09",title:"Druid Data Cookbook: Ingestion Transforms",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2022/02/09/druid-data-cookbook-ingestion-transforms/",company:"Imply"},{date:"2022-02-04",title:"Multi-dimensional range partitioning",name:"Kashif Faraz",link:"https://imply.io/blog/multi-dimensional-range-partitioning/",company:"Imply"},{date:"2021-12-16",title:"Seeking the Perfect Apache Druid Rollup",name:"Neil Buesing",link:"https://www.rilldata.com/blog/seeking-the-perfect-apache-druid-rollup",company:"Rill Data"},{date:"2021-11-08",title:"Scaling Apache Druid for Real-Time Cloud Analytics at Confluent",name:"Harini Rajendran, Zohreh Krimi",link:"https://www.confluent.io/blog/scaling-apache-druid-for-real-time-cloud-analytics-at-confluent/",company:"Confluent"},{date:"2021-10-01",title:"Setting up Apache Druid on Kubernetes in under 30 minutes",name:"Adheip Singh",link:"https://www.rilldata.com/blog/setting-up-apache-druid-on-kubernetes-part-one",company:"Rill Data"},{date:"2021-09-25",title:"Multi-Value Dimensions in Apache Druid (Part 3)",name:"Hellmar Becker",link:"https://blog.hellmar-becker.de/2021/09/25/multivalue-dimensions-in-apache-druid-part-3/",company:"Imply"},{date:"2021-09-08",title:"Anomaly detection using Druid and Imply Pivot",name:"Vijay Narayanan",link:"https://vijay-narayanan-bigdata.medium.com/anomaly-detection-using-druid-and-imply-pivot-d6cd5bf158db",company:"Imply"},{date:"2021-08-16",title:"Druid: Event-Driven Data with Eric Tschetter",name:"Jeff Meyerson",link:"https://softwareengineeringdaily.com/2021/08/16/druid-event-driven-data-with-eric-tschetter/",company:"SE Daily"},{date:"2021-08-18",title:"Augmented analytics on business metrics by Cuebook with Apache Druid",name:"Sachin Bansal",link:"https://imply.io/post/augmented-analytics-on-business-metrics-by-cuebook",company:"Cuebook"},{date:"2021-08-11",title:"Was ist Apache Druid?",name:"Stefan Luber",link:"https://www.bigdata-insider.de/was-ist-apache-druid-a-1044465/",company:"Big Data Insider"},{date:"2021-08-09",title:"Funnel Analysis with Spark, Druid and DataSketches",name:"Itai Yaffe, Yakir Buskila",link:"https://youtu.be/dOBb0IOdsnU",company:"Databricks Data and AI Summit 2021"},{date:"2021-07-26",title:"Apache Druid Deep Dive",name:"Jon King",link:"https://youtu.be/TkARXVqDvEw",company:"RVA Data Engineering"},{date:"2021-07-21",title:"Apache Druid \u2013 Datenspeicher mit geringen Latenzen",name:"Thomas Joos, Nico Litzel",link:"https://www.bigdata-insider.de/apache-druid-datenspeicher-mit-geringen-latenzen-a-1034042/",company:"Big Data Insider"},{date:"2021-06-17",title:"Casting the spell: Druid in Practice",name:"Itai Yaffe, Yakir Buskila",link:"https://youtu.be/QAitmv8QRq4",company:"Berlin Buzzwords 2021"},{date:"2021-06-07",title:"Intro to Apache Druid \u2026 What is this Devilry",name:"Daniel Beach",link:"https://www.confessionsofadataguy.com/intro-to-apache-druid-what-is-this-devilry/",company:"Confessions of a Data Guy Blog"},{date:"2021-02-22",title:"Data Modeling and Query Performance in Apache Druid",name:"Matt Sarrel",link:"https://www.druidforum.org/t/data-modeling-and-query-performance-in-apache-druid/5942",company:"Imply"},{date:"2020-04-16",title:"Apache Druid Vision and Roadmap",name:"Gian Merlino",link:"https://youtu.be/IhqDsoIHqWY",company:"Imply"},{date:"2020-04-16",title:"Automating CI/CD for Druid Clusters at Athena Health",name:"Shyam Mudambi, Ramesh Kempanna and Karthik Urs",link:"https://youtu.be/XGzMJBM8xeg",company:"Athena Health"},{date:"2020-04-13",title:"Holistic AML compliance using Apache Druid",name:"Arpit Dubey",link:"https://youtu.be/Ly3HFbbEihQ",company:"DBS"},{date:"2020-04-13",title:"How Apache Druid Powers Real-Time Analytics at BT",name:"Pankaj Tiwari",link:"https://youtu.be/QZUunUDQ8p4",company:"BT"},{date:"2020-04-13",title:"Analytics over Terabytes of Data at Twitter using Apache Druid",name:"Swapnesh Gandhi",link:"https://imply.io/virtual-druid-summit/analytics-over-terabytes-of-data-at-twitter-apache-druid",company:"MoPub"},{date:"2020-04-13",title:"Using Druid for Network Monitoring and Trust Analytics at Cisco",name:"TJ Giuli and Abhishek Balaji Radhakrishnan",link:"https://youtu.be/KXytFBehvXA",company:"Cisco"},{date:"2020-04-13",title:"Apache Druid Fireside Chat (Ask Us Anything",name:"Fangjin Yang, Gian Merlino and Vadim Ogievetsky",link:"https://youtu.be/5JJccj_dSBk",company:"Imply"},{date:"2020-03-03",title:"How Netflix uses Druid for Real-time Insights to Ensure a High-Quality Experience",name:"Ben Sykes",link:"https://netflixtechblog.com/how-netflix-uses-druid-for-real-time-insights-to-ensure-a-high-quality-experience-19e1e8568d06",company:"Netflix"},{date:"2020-01-30",title:"Introducing Druid 0.17.0",name:"Gian Merlino",link:"https://imply.io/post/announcing-druid-0.17.0",company:"Imply"},{date:"2019-12-10",title:"Druid: Reflections at a Milestone",name:"Gian Merlino",link:"https://imply.io/post/reflecting-on-druid",company:"Imply"},{date:"2019-11-21",title:"How Nielsen Marketing Cloud Uses Druid for Audience and Marketing Performance Analysis",name:"Itai Yaffe",link:"https://imply.io/post/nielsen-marketing-audience-analysis",company:"Nielsen"},{date:"2019-10-16",title:"Druid query view: An elegant SQL interface for a more civilized age",name:"Margaret Brewster",link:"https://imply.io/post/druid-console-query-view",company:"Imply"},{date:"2019-09-15",title:"Data Retention and Deletion in Apache Druid",name:"Dana Assa and Itai Yaffe",link:"https://medium.com/nmc-techblog/data-retention-and-deletion-in-apache-druid-74ffd12398a8",company:"Nielsen"},{date:"2019-08-11",title:"Understanding Spark Streaming with Kafka and Druid",name:"Daria Litvinov",link:"https://medium.com/outbrain-engineering/understanding-spark-streaming-with-kafka-and-druid-25b69e28dcb7",company:"Outbrain"},{date:"2019-07-08",title:"The Zscaler difference - security at cloud scale",name:"Subramanian Srinivasan and Kevin Fletcher",link:"https://imply.io/post/druid-at-zscaler-security-log-analytics",company:"Zscaler"},{date:"2019-07-03",title:"Interactive Analytics at MoPub: Querying Terabytes of Data in Seconds",name:"Aaron Rolett and Shravana Krishnamurthy",link:"https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/interactive-analytics-at-mopub.html",company:"Twitter"},{date:"2019-06-27",title:"Enrich API Brings Higher Match Rates with Multi-Field Enrichment Capabilities",name:"Ken Michie",link:"https://www.fullcontact.com/blog/enrich-api-brings-higher-match-rates-with-multi-field-enrichment-capabilities/",company:"FullContact"},{date:"2019-05-29",title:"Monitoring at eBay with Druid",name:"Mohan Garadi",link:"https://www.ebayinc.com/stories/blogs/tech/monitoring-at-ebay-with-druid/",company:"ebay"},{date:"2019-05-22",title:"Setting the stage for fast analytics with Druid",name:"Surekha Saharan and Benjamin Hopp",link:"https://speakerdeck.com/implydatainc/setting-the-stage-for-fast-analytics-with-druid",company:"Imply"},{date:"2019-03-15",title:"Data Engineering At Booking.com - a case study",name:"Andreas Kretz",link:"https://youtu.be/9GE3yiVo1FM",company:"Booking.com"},{date:"2018-11-14",title:"How Druid enables analytics at Airbnb",name:"Pala Muthiah and Jinyang Li",link:"https://medium.com/airbnb-engineering/druid-airbnb-data-platform-601c312f2a4c",company:"Airbnb"},{date:"2018-09-25",title:"Data Analytics and Processing at Snap",name:"Charles Allen",link:"https://www.slideshare.net/CharlesAllen9/data-analytics-and-processing-at-snap-druid-meetup-la-september-2018",company:"Snap, Inc."},{date:"2018-09-13",title:"Securing Druid",name:"Jon Wei",link:"https://imply.io/post/securing-druid",company:"Imply"},{date:"2018-08-30",title:"Streaming SQL and Druid",name:"Arup Malakar",link:"https://youtu.be/ovZ9iAkQllo",company:"Lyft"},{date:"2018-06-19",title:"PayPal merchant ecosystem using Apache Spark, Hive, Druid, and HBase",name:"Deepika Khera & Kasi Natarajan",link:"https://youtu.be/HJvuU0CQS44",company:"Paypal"}];function h(e){var a=e.data;return i.createElement("div",null,i.createElement("p",null,i.createElement("a",{href:"https://github.com/apache/druid/releases/tag/druid-"+a.version},i.createElement("b",null,a.version)),a.date))}function y(e){var a=e.jsonData.slice(0,3);return i.createElement("div",null,a.map((function(e){return i.createElement(h,{key:e.version,data:e})})))}var g=t(60701);const f=function(){return i.createElement(n.Z,{title:"Apache Druid"},i.createElement("div",null,i.createElement("main",{className:"druid-masthead"},i.createElement("div",{className:"text-center"},i.createElement("h1",null,"Apache",i.createElement("sup",null,"\xae")," Druid"),i.createElement("p",{className:"lead"},"A high performance, real-time analytics database that delivers sub-second queries on streaming and batch data at scale and under load."),i.createElement("p",null,i.createElement("a",{className:"button",href:"/downloads.html"},i.createElement("span",{className:"fa fa-download"})," Download"),i.createElement("a",{className:"button",href:"/community/join-slack/?v=2"},i.createElement("span",{className:"fab fa-slack"})," Join Slack"),i.createElement("a",{className:"button",href:"https://github.com/apache/druid/"},i.createElement("span",{className:"fab fa-github"})," GitHub")),i.createElement("p",null))),i.createElement("section",{className:"promotion-banner"},i.createElement("div",{className:"container"},i.createElement("div",{className:"text-center"},i.createElement("h4",null," ",i.createElement("a",{href:"https://druidsummit.org/",target:"_blank",rel:"noopener noreferrer"},"Druid Summit 2024")," ","- Registration is now open!"," ")))),i.createElement("div",{className:"grid-container"},i.createElement("div",{className:"grid-item"},i.createElement("h2",null,"Overview"),i.createElement("div",{className:"features"},i.createElement("div",{className:"feature"},i.createElement("span",{className:"fa fa-bolt"}),i.createElement("h5",null,"Sub-second queries at any scale"),i.createElement("p",null,"Execute OLAP queries in milliseconds on high-cardinality and high-dimensional data sets with billions to trillions of rows without pre-defining or caching queries in advance.")),i.createElement("div",{className:"feature"},i.createElement("span",{className:"fa fa-dollar-sign"}),i.createElement("h5",null,"High concurrency at the lowest cost "),i.createElement("p",null,"Build real-time analytics applications that supports 100s to 100,000s queries per second at consistent performance with a highly efficient architecture that uses less infrastructure than other databases.")),i.createElement("div",{className:"feature"},i.createElement("span",{className:"fa fa-chart-line"}),i.createElement("h5",null,"Real-time and historical insights"),i.createElement("p",null,"Unlock streaming data potential through Druid's native integration with Apache Kafka and Amazon Kinesis as it supports query-on-arrival at millions of events per second, low latency ingestion, and guaranteed consistency."))),i.createElement("h2",null,"Key Druid Features"),i.createElement("div",null,i.createElement(r,{jsonData:s})),i.createElement("br",null),i.createElement("h2",null,"Learn more"),i.createElement("div",{className:"features"},i.createElement("div",{className:"feature"},i.createElement("span",{className:"fa fa-power-off fa"}),i.createElement("h5",null," Powered By"),i.createElement("p",null,"Druid is proven in production at the ",i.createElement("a",{href:"/druid-powered"},"world's leading companies")," at massive scale.")),i.createElement("div",{className:"feature"},i.createElement("span",{className:"fa fa-info fa"}),i.createElement("h5",null," FAQ"),i.createElement("p",null,"Learn about some of the ",i.createElement("a",{href:"faq"},"most common questions about Druid"),".")),i.createElement("div",{className:"feature"},i.createElement("span",{className:"fa fa-flag-checkered fa"}),i.createElement("h5",null," Quickstart"),i.createElement("p",null,i.createElement("a",{href:"/docs/latest/tutorials/"},"Get started with Druid")," in minutes. Load your own data and query it.")),i.createElement("div",{className:"feature"},i.createElement("span",{className:"fa fa-question-circle fa"}),i.createElement("h5",null," Get Help"),i.createElement("p",null,"Get help from a ",i.createElement("a",{href:"/community/"},"wide network of community members")," about using Druid.")),i.createElement("div",{className:"feature"},i.createElement("span",{className:"fa fa-podcast fa"}),i.createElement("h5",null," Podcast"),i.createElement("p",null,"Hear from the Druid community on ",i.createElement("a",{href:"https://podcasts.apple.com/us/podcast/tales-at-scale/id1655951714"},"Apple"),", ",i.createElement("a",{href:"https://open.spotify.com/show/6KAKYLJvCVegsFfKvbfDnt"},"Spotify"),", and ",i.createElement("a",{href:"https://music.youtube.com/playlist?list=PLDZysOZKycN4ndlSxImrdFugdQ2NYbYMv"},"YouTube Music"),".")))),i.createElement("div",{className:"grid-item"},i.createElement("div",{className:"widget-container"},i.createElement("h3",null,"Upcoming Events"),i.createElement(c,{jsonData:d}),i.createElement("a",{className:"button",href:"https://www.meetup.com/topics/apache-druid/"},"Join a Druid Meetup!"),i.createElement("br",null)),i.createElement("div",{className:"widget-container"},i.createElement("h3",null,"Featured Content"),i.createElement(u,{jsonData:p})),i.createElement("div",{className:"widget-container"},i.createElement("h3",null,"Recent Releases"),i.createElement(y,{jsonData:g.w}))))))}},60701:e=>{e.exports.w=[{version:"31.0.0",date:"Oct 18 2024"},{version:"30.0.1",date:"Sep 17 2024"},{version:"29.0.1",date:"Apr 3 2024"}]}}]); \ No newline at end of file diff --git a/assets/js/d29a09b8.b5a56271.js b/assets/js/d29a09b8.b5a56271.js new file mode 100644 index 0000000000..d0f024f40a --- /dev/null +++ b/assets/js/d29a09b8.b5a56271.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5599],{14137:(e,t,a)=>{a.d(t,{Zo:()=>l,kt:()=>g});var o=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var c=o.createContext({}),p=function(e){var t=o.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},l=function(e){var t=p(e.components);return o.createElement(c.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),m=p(a),d=n,g=m["".concat(c,".").concat(d)]||m[d]||u[d]||i;return a?o.createElement(g,r(r({ref:t},l),{},{components:a})):o.createElement(g,r({ref:t},l))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,r=new Array(i);r[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[m]="string"==typeof e?e:n,r[1]=s;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>g,frontMatter:()=>s,metadata:()=>p,toc:()=>m});var o=a(87462),n=a(63366),i=(a(67294),a(14137)),r=["components"],s={id:"automatic-compaction",title:"Automatic compaction"},c=void 0,p={unversionedId:"data-management/automatic-compaction",id:"data-management/automatic-compaction",title:"Automatic compaction",description:"\x3c!--",source:"@site/docs/31.0.0/data-management/automatic-compaction.md",sourceDirName:"data-management",slug:"/data-management/automatic-compaction",permalink:"/docs/31.0.0/data-management/automatic-compaction",draft:!1,tags:[],version:"current",frontMatter:{id:"automatic-compaction",title:"Automatic compaction"},sidebar:"docs",previous:{title:"Compaction",permalink:"/docs/31.0.0/data-management/compaction"},next:{title:"Manual compaction",permalink:"/docs/31.0.0/data-management/manual-compaction"}},l={},m=[{value:"Auto-compaction syntax",id:"auto-compaction-syntax",level:2},{value:"Auto-compaction using Coordinator duties",id:"auto-compaction-using-coordinator-duties",level:2},{value:"Manage auto-compaction using the web console",id:"manage-auto-compaction-using-the-web-console",level:3},{value:"Manage auto-compaction using Coordinator APIs",id:"manage-auto-compaction-using-coordinator-apis",level:3},{value:"Change compaction frequency",id:"change-compaction-frequency",level:3},{value:"View Coordinator duty auto-compaction stats",id:"view-coordinator-duty-auto-compaction-stats",level:3},{value:"Avoid conflicts with ingestion",id:"avoid-conflicts-with-ingestion",level:2},{value:"Enable concurrent append and replace",id:"enable-concurrent-append-and-replace",level:3},{value:"Skip compaction for latest segments",id:"skip-compaction-for-latest-segments",level:3},{value:"Examples",id:"examples",level:2},{value:"Change segment granularity",id:"change-segment-granularity",level:3},{value:"Update partitioning scheme",id:"update-partitioning-scheme",level:3},{value:"Auto-compaction using compaction supervisors",id:"auto-compaction-using-compaction-supervisors",level:2},{value:"Manage compaction supervisors with the web console",id:"manage-compaction-supervisors-with-the-web-console",level:3},{value:"Manage compaction supervisors with supervisor APIs",id:"manage-compaction-supervisors-with-supervisor-apis",level:3},{value:"Use MSQ for auto-compaction",id:"use-msq-for-auto-compaction",level:3},{value:"MSQ task engine limitations",id:"msq-task-engine-limitations",level:4},{value:"Supported aggregators",id:"supported-aggregators",level:4},{value:"Learn more",id:"learn-more",level:2}],u={toc:m},d="wrapper";function g(e){var t=e.components,s=(0,n.Z)(e,r);return(0,i.kt)(d,(0,o.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"In Apache Druid, compaction is a special type of ingestion task that reads data from a Druid datasource and writes it back into the same datasource. A common use case for this is to ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/operations/segment-optimization"},"optimally size segments")," after ingestion to improve query performance. Automatic compaction, or auto-compaction, refers to the system for automatic execution of compaction tasks issued by Druid itself. In addition to auto-compaction, you can perform ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/data-management/manual-compaction"},"manual compaction")," using the Overlord APIs."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"}," Auto-compaction skips datasources that have a segment granularity of ",(0,i.kt)("inlineCode",{parentName:"p"},"ALL"),".")),(0,i.kt)("p",null,"As a best practice, you should set up auto-compaction for all Druid datasources. You can run compaction tasks manually for cases where you want to allocate more system resources. For example, you may choose to run multiple compaction tasks in parallel to compact an existing datasource for the first time. See ",(0,i.kt)("a",{parentName:"p",href:"/docs/31.0.0/data-management/compaction"},"Compaction")," for additional details and use cases."),(0,i.kt)("p",null,"This topic guides you through setting up automatic compaction for your Druid cluster. See the ",(0,i.kt)("a",{parentName:"p",href:"#examples"},"examples")," for common use cases for automatic compaction."),(0,i.kt)("h2",{id:"auto-compaction-syntax"},"Auto-compaction syntax"),(0,i.kt)("p",null,"You can configure automatic compaction dynamically without restarting Druid.\nThe automatic compaction system uses the following syntax:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "dataSource": ,\n "ioConfig": ,\n "dimensionsSpec": ,\n "transformSpec": ,\n "metricsSpec": ,\n "tuningConfig": ,\n "granularitySpec": ,\n "skipOffsetFromLatest":

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'

\n

We suggest trying baseUrl =

\n\n'}(e)).replace(/{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(67294),o=n(36809);const a=JSON.parse('{"docusaurus-lunr-search":{"default":{"fileNames":{"searchDoc":"search-doc-1729235775110.json","lunrIndex":"lunr-index-1729235775110.json"}}},"docusaurus-plugin-google-gtag":{"default":{"trackingID":["UA-131010415-1"],"anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs/31.0.0","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs/31.0.0","mainDocId":"design/index","docs":[{"id":"api-reference/api-reference","path":"/docs/31.0.0/api-reference/","sidebar":"docs"},{"id":"api-reference/automatic-compaction-api","path":"/docs/31.0.0/api-reference/automatic-compaction-api","sidebar":"docs"},{"id":"api-reference/data-management-api","path":"/docs/31.0.0/api-reference/data-management-api","sidebar":"docs"},{"id":"api-reference/dynamic-configuration-api","path":"/docs/31.0.0/api-reference/dynamic-configuration-api","sidebar":"docs"},{"id":"api-reference/json-querying-api","path":"/docs/31.0.0/api-reference/json-querying-api","sidebar":"docs"},{"id":"api-reference/legacy-metadata-api","path":"/docs/31.0.0/api-reference/legacy-metadata-api","sidebar":"docs"},{"id":"api-reference/lookups-api","path":"/docs/31.0.0/api-reference/lookups-api","sidebar":"docs"},{"id":"api-reference/retention-rules-api","path":"/docs/31.0.0/api-reference/retention-rules-api","sidebar":"docs"},{"id":"api-reference/service-status-api","path":"/docs/31.0.0/api-reference/service-status-api","sidebar":"docs"},{"id":"api-reference/sql-api","path":"/docs/31.0.0/api-reference/sql-api","sidebar":"docs"},{"id":"api-reference/sql-ingestion-api","path":"/docs/31.0.0/api-reference/sql-ingestion-api","sidebar":"docs"},{"id":"api-reference/sql-jdbc","path":"/docs/31.0.0/api-reference/sql-jdbc","sidebar":"docs"},{"id":"api-reference/supervisor-api","path":"/docs/31.0.0/api-reference/supervisor-api","sidebar":"docs"},{"id":"api-reference/tasks-api","path":"/docs/31.0.0/api-reference/tasks-api","sidebar":"docs"},{"id":"comparisons/druid-vs-elasticsearch","path":"/docs/31.0.0/comparisons/druid-vs-elasticsearch"},{"id":"comparisons/druid-vs-key-value","path":"/docs/31.0.0/comparisons/druid-vs-key-value"},{"id":"comparisons/druid-vs-kudu","path":"/docs/31.0.0/comparisons/druid-vs-kudu"},{"id":"comparisons/druid-vs-redshift","path":"/docs/31.0.0/comparisons/druid-vs-redshift"},{"id":"comparisons/druid-vs-spark","path":"/docs/31.0.0/comparisons/druid-vs-spark"},{"id":"comparisons/druid-vs-sql-on-hadoop","path":"/docs/31.0.0/comparisons/druid-vs-sql-on-hadoop"},{"id":"configuration/extensions","path":"/docs/31.0.0/configuration/extensions","sidebar":"docs"},{"id":"configuration/human-readable-byte","path":"/docs/31.0.0/configuration/human-readable-byte"},{"id":"configuration/index","path":"/docs/31.0.0/configuration/","sidebar":"docs"},{"id":"configuration/logging","path":"/docs/31.0.0/configuration/logging","sidebar":"docs"},{"id":"data-management/automatic-compaction","path":"/docs/31.0.0/data-management/automatic-compaction","sidebar":"docs"},{"id":"data-management/compaction","path":"/docs/31.0.0/data-management/compaction","sidebar":"docs"},{"id":"data-management/delete","path":"/docs/31.0.0/data-management/delete","sidebar":"docs"},{"id":"data-management/index","path":"/docs/31.0.0/data-management/","sidebar":"docs"},{"id":"data-management/manual-compaction","path":"/docs/31.0.0/data-management/manual-compaction","sidebar":"docs"},{"id":"data-management/schema-changes","path":"/docs/31.0.0/data-management/schema-changes","sidebar":"docs"},{"id":"data-management/update","path":"/docs/31.0.0/data-management/update","sidebar":"docs"},{"id":"design/architecture","path":"/docs/31.0.0/design/architecture","sidebar":"docs"},{"id":"design/broker","path":"/docs/31.0.0/design/broker","sidebar":"docs"},{"id":"design/coordinator","path":"/docs/31.0.0/design/coordinator","sidebar":"docs"},{"id":"design/deep-storage","path":"/docs/31.0.0/design/deep-storage","sidebar":"docs"},{"id":"design/extensions-contrib/dropwizard","path":"/docs/31.0.0/design/extensions-contrib/dropwizard"},{"id":"design/historical","path":"/docs/31.0.0/design/historical","sidebar":"docs"},{"id":"design/index","path":"/docs/31.0.0/design/","sidebar":"docs"},{"id":"design/indexer","path":"/docs/31.0.0/design/indexer","sidebar":"docs"},{"id":"design/indexing-service","path":"/docs/31.0.0/design/indexing-service"},{"id":"design/metadata-storage","path":"/docs/31.0.0/design/metadata-storage","sidebar":"docs"},{"id":"design/middlemanager","path":"/docs/31.0.0/design/middlemanager","sidebar":"docs"},{"id":"design/overlord","path":"/docs/31.0.0/design/overlord","sidebar":"docs"},{"id":"design/peons","path":"/docs/31.0.0/design/peons","sidebar":"docs"},{"id":"design/router","path":"/docs/31.0.0/design/router","sidebar":"docs"},{"id":"design/segments","path":"/docs/31.0.0/design/segments","sidebar":"docs"},{"id":"design/storage","path":"/docs/31.0.0/design/storage","sidebar":"docs"},{"id":"design/zookeeper","path":"/docs/31.0.0/design/zookeeper","sidebar":"docs"},{"id":"development/build","path":"/docs/31.0.0/development/build","sidebar":"docs"},{"id":"development/contribute-to-docs","path":"/docs/31.0.0/development/contribute-to-docs","sidebar":"docs"},{"id":"development/experimental","path":"/docs/31.0.0/development/experimental","sidebar":"docs"},{"id":"development/extensions-contrib/aliyun-oss","path":"/docs/31.0.0/development/extensions-contrib/aliyun-oss"},{"id":"development/extensions-contrib/ambari-metrics-emitter","path":"/docs/31.0.0/development/extensions-contrib/ambari-metrics-emitter"},{"id":"development/extensions-contrib/cassandra","path":"/docs/31.0.0/development/extensions-contrib/cassandra"},{"id":"development/extensions-contrib/cloudfiles","path":"/docs/31.0.0/development/extensions-contrib/cloudfiles"},{"id":"development/extensions-contrib/compressed-big-decimal","path":"/docs/31.0.0/development/extensions-contrib/compressed-big-decimal"},{"id":"development/extensions-contrib/ddsketch-quantiles","path":"/docs/31.0.0/development/extensions-contrib/ddsketch-quantiles"},{"id":"development/extensions-contrib/delta-lake","path":"/docs/31.0.0/development/extensions-contrib/delta-lake"},{"id":"development/extensions-contrib/distinctcount","path":"/docs/31.0.0/development/extensions-contrib/distinctcount"},{"id":"development/extensions-contrib/gce-extensions","path":"/docs/31.0.0/development/extensions-contrib/gce-extensions"},{"id":"development/extensions-contrib/graphite","path":"/docs/31.0.0/development/extensions-contrib/graphite"},{"id":"development/extensions-contrib/iceberg","path":"/docs/31.0.0/development/extensions-contrib/iceberg"},{"id":"development/extensions-contrib/influx","path":"/docs/31.0.0/development/extensions-contrib/influx"},{"id":"development/extensions-contrib/influxdb-emitter","path":"/docs/31.0.0/development/extensions-contrib/influxdb-emitter"},{"id":"development/extensions-contrib/k8s-jobs","path":"/docs/31.0.0/development/extensions-contrib/k8s-jobs"},{"id":"development/extensions-contrib/kafka-emitter","path":"/docs/31.0.0/development/extensions-contrib/kafka-emitter"},{"id":"development/extensions-contrib/materialized-view","path":"/docs/31.0.0/development/extensions-contrib/materialized-view"},{"id":"development/extensions-contrib/momentsketch-quantiles","path":"/docs/31.0.0/development/extensions-contrib/momentsketch-quantiles"},{"id":"development/extensions-contrib/moving-average-query","path":"/docs/31.0.0/development/extensions-contrib/moving-average-query"},{"id":"development/extensions-contrib/opentsdb-emitter","path":"/docs/31.0.0/development/extensions-contrib/opentsdb-emitter"},{"id":"development/extensions-contrib/prometheus","path":"/docs/31.0.0/development/extensions-contrib/prometheus"},{"id":"development/extensions-contrib/rabbit-super-stream-injestion","path":"/docs/31.0.0/development/extensions-contrib/rabbit-super-stream-injestion"},{"id":"development/extensions-contrib/redis-cache","path":"/docs/31.0.0/development/extensions-contrib/redis-cache"},{"id":"development/extensions-contrib/spectator-histogram","path":"/docs/31.0.0/development/extensions-contrib/spectator-histogram"},{"id":"development/extensions-contrib/sqlserver","path":"/docs/31.0.0/development/extensions-contrib/sqlserver"},{"id":"development/extensions-contrib/statsd","path":"/docs/31.0.0/development/extensions-contrib/statsd"},{"id":"development/extensions-contrib/tdigestsketch-quantiles","path":"/docs/31.0.0/development/extensions-contrib/tdigestsketch-quantiles"},{"id":"development/extensions-contrib/thrift","path":"/docs/31.0.0/development/extensions-contrib/thrift"},{"id":"development/extensions-contrib/time-min-max","path":"/docs/31.0.0/development/extensions-contrib/time-min-max"},{"id":"development/extensions-core/approximate-histograms","path":"/docs/31.0.0/development/extensions-core/approximate-histograms"},{"id":"development/extensions-core/avro","path":"/docs/31.0.0/development/extensions-core/avro"},{"id":"development/extensions-core/azure","path":"/docs/31.0.0/development/extensions-core/azure"},{"id":"development/extensions-core/bloom-filter","path":"/docs/31.0.0/development/extensions-core/bloom-filter"},{"id":"development/extensions-core/datasketches-extension","path":"/docs/31.0.0/development/extensions-core/datasketches-extension"},{"id":"development/extensions-core/datasketches-hll","path":"/docs/31.0.0/development/extensions-core/datasketches-hll"},{"id":"development/extensions-core/datasketches-kll","path":"/docs/31.0.0/development/extensions-core/datasketches-kll"},{"id":"development/extensions-core/datasketches-quantiles","path":"/docs/31.0.0/development/extensions-core/datasketches-quantiles"},{"id":"development/extensions-core/datasketches-theta","path":"/docs/31.0.0/development/extensions-core/datasketches-theta"},{"id":"development/extensions-core/datasketches-tuple","path":"/docs/31.0.0/development/extensions-core/datasketches-tuple"},{"id":"development/extensions-core/druid-aws-rds","path":"/docs/31.0.0/development/extensions-core/druid-aws-rds"},{"id":"development/extensions-core/druid-basic-security","path":"/docs/31.0.0/development/extensions-core/druid-basic-security"},{"id":"development/extensions-core/druid-kerberos","path":"/docs/31.0.0/development/extensions-core/druid-kerberos"},{"id":"development/extensions-core/druid-lookups","path":"/docs/31.0.0/development/extensions-core/druid-lookups"},{"id":"development/extensions-core/druid-pac4j","path":"/docs/31.0.0/development/extensions-core/druid-pac4j"},{"id":"development/extensions-core/druid-ranger-security","path":"/docs/31.0.0/development/extensions-core/druid-ranger-security"},{"id":"development/extensions-core/examples","path":"/docs/31.0.0/development/extensions-core/examples"},{"id":"development/extensions-core/google","path":"/docs/31.0.0/development/extensions-core/google"},{"id":"development/extensions-core/hdfs","path":"/docs/31.0.0/development/extensions-core/hdfs"},{"id":"development/extensions-core/kubernetes","path":"/docs/31.0.0/development/extensions-core/kubernetes"},{"id":"development/extensions-core/mysql","path":"/docs/31.0.0/development/extensions-core/mysql"},{"id":"development/extensions-core/orc","path":"/docs/31.0.0/development/extensions-core/orc"},{"id":"development/extensions-core/parquet","path":"/docs/31.0.0/development/extensions-core/parquet"},{"id":"development/extensions-core/postgresql","path":"/docs/31.0.0/development/extensions-core/postgresql"},{"id":"development/extensions-core/protobuf","path":"/docs/31.0.0/development/extensions-core/protobuf"},{"id":"development/extensions-core/s3","path":"/docs/31.0.0/development/extensions-core/s3"},{"id":"development/extensions-core/simple-client-sslcontext","path":"/docs/31.0.0/development/extensions-core/simple-client-sslcontext"},{"id":"development/extensions-core/stats","path":"/docs/31.0.0/development/extensions-core/stats"},{"id":"development/extensions-core/test-stats","path":"/docs/31.0.0/development/extensions-core/test-stats"},{"id":"development/javascript","path":"/docs/31.0.0/development/javascript","sidebar":"docs"},{"id":"development/modules","path":"/docs/31.0.0/development/modules","sidebar":"docs"},{"id":"development/overview","path":"/docs/31.0.0/development/overview","sidebar":"docs"},{"id":"development/versioning","path":"/docs/31.0.0/development/versioning","sidebar":"docs"},{"id":"ingestion/concurrent-append-replace","path":"/docs/31.0.0/ingestion/concurrent-append-replace","sidebar":"docs"},{"id":"ingestion/data-formats","path":"/docs/31.0.0/ingestion/data-formats","sidebar":"docs"},{"id":"ingestion/faq","path":"/docs/31.0.0/ingestion/faq","sidebar":"docs"},{"id":"ingestion/hadoop","path":"/docs/31.0.0/ingestion/hadoop","sidebar":"docs"},{"id":"ingestion/index","path":"/docs/31.0.0/ingestion/","sidebar":"docs"},{"id":"ingestion/ingestion-spec","path":"/docs/31.0.0/ingestion/ingestion-spec","sidebar":"docs"},{"id":"ingestion/input-sources","path":"/docs/31.0.0/ingestion/input-sources","sidebar":"docs"},{"id":"ingestion/kafka-ingestion","path":"/docs/31.0.0/ingestion/kafka-ingestion","sidebar":"docs"},{"id":"ingestion/kinesis-ingestion","path":"/docs/31.0.0/ingestion/kinesis-ingestion","sidebar":"docs"},{"id":"ingestion/native-batch","path":"/docs/31.0.0/ingestion/native-batch","sidebar":"docs"},{"id":"ingestion/native-batch-firehose","path":"/docs/31.0.0/ingestion/native-batch-firehose"},{"id":"ingestion/native-batch-simple-task","path":"/docs/31.0.0/ingestion/native-batch-simple-task"},{"id":"ingestion/partitioning","path":"/docs/31.0.0/ingestion/partitioning","sidebar":"docs"},{"id":"ingestion/rollup","path":"/docs/31.0.0/ingestion/rollup","sidebar":"docs"},{"id":"ingestion/schema-design","path":"/docs/31.0.0/ingestion/schema-design","sidebar":"docs"},{"id":"ingestion/schema-model","path":"/docs/31.0.0/ingestion/schema-model","sidebar":"docs"},{"id":"ingestion/standalone-realtime","path":"/docs/31.0.0/ingestion/standalone-realtime"},{"id":"ingestion/streaming","path":"/docs/31.0.0/ingestion/streaming","sidebar":"docs"},{"id":"ingestion/supervisor","path":"/docs/31.0.0/ingestion/supervisor","sidebar":"docs"},{"id":"ingestion/tasks","path":"/docs/31.0.0/ingestion/tasks","sidebar":"docs"},{"id":"ingestion/tranquility","path":"/docs/31.0.0/ingestion/tranquility"},{"id":"misc/papers-and-talks","path":"/docs/31.0.0/misc/papers-and-talks","sidebar":"docs"},{"id":"multi-stage-query/concepts","path":"/docs/31.0.0/multi-stage-query/concepts","sidebar":"docs"},{"id":"multi-stage-query/examples","path":"/docs/31.0.0/multi-stage-query/examples","sidebar":"docs"},{"id":"multi-stage-query/index","path":"/docs/31.0.0/multi-stage-query/","sidebar":"docs"},{"id":"multi-stage-query/known-issues","path":"/docs/31.0.0/multi-stage-query/known-issues","sidebar":"docs"},{"id":"multi-stage-query/reference","path":"/docs/31.0.0/multi-stage-query/reference","sidebar":"docs"},{"id":"multi-stage-query/security","path":"/docs/31.0.0/multi-stage-query/security","sidebar":"docs"},{"id":"operations/alerts","path":"/docs/31.0.0/operations/alerts","sidebar":"docs"},{"id":"operations/auth","path":"/docs/31.0.0/operations/auth"},{"id":"operations/auth-ldap","path":"/docs/31.0.0/operations/auth-ldap","sidebar":"docs"},{"id":"operations/basic-cluster-tuning","path":"/docs/31.0.0/operations/basic-cluster-tuning","sidebar":"docs"},{"id":"operations/clean-metadata-store","path":"/docs/31.0.0/operations/clean-metadata-store","sidebar":"docs"},{"id":"operations/deep-storage-migration","path":"/docs/31.0.0/operations/deep-storage-migration","sidebar":"docs"},{"id":"operations/dump-segment","path":"/docs/31.0.0/operations/dump-segment","sidebar":"docs"},{"id":"operations/durable-storage","path":"/docs/31.0.0/operations/durable-storage","sidebar":"docs"},{"id":"operations/dynamic-config-provider","path":"/docs/31.0.0/operations/dynamic-config-provider","sidebar":"docs"},{"id":"operations/export-metadata","path":"/docs/31.0.0/operations/export-metadata","sidebar":"docs"},{"id":"operations/high-availability","path":"/docs/31.0.0/operations/high-availability","sidebar":"docs"},{"id":"operations/http-compression","path":"/docs/31.0.0/operations/http-compression","sidebar":"docs"},{"id":"operations/insert-segment-to-db","path":"/docs/31.0.0/operations/insert-segment-to-db","sidebar":"docs"},{"id":"operations/java","path":"/docs/31.0.0/operations/java","sidebar":"docs"},{"id":"operations/kubernetes","path":"/docs/31.0.0/operations/kubernetes"},{"id":"operations/metadata-migration","path":"/docs/31.0.0/operations/metadata-migration","sidebar":"docs"},{"id":"operations/metrics","path":"/docs/31.0.0/operations/metrics","sidebar":"docs"},{"id":"operations/migrate-from-firehose","path":"/docs/31.0.0/operations/migrate-from-firehose","sidebar":"docs"},{"id":"operations/mixed-workloads","path":"/docs/31.0.0/operations/mixed-workloads","sidebar":"docs"},{"id":"operations/other-hadoop","path":"/docs/31.0.0/operations/other-hadoop","sidebar":"docs"},{"id":"operations/password-provider","path":"/docs/31.0.0/operations/password-provider","sidebar":"docs"},{"id":"operations/pull-deps","path":"/docs/31.0.0/operations/pull-deps","sidebar":"docs"},{"id":"operations/request-logging","path":"/docs/31.0.0/operations/request-logging","sidebar":"docs"},{"id":"operations/reset-cluster","path":"/docs/31.0.0/operations/reset-cluster","sidebar":"docs"},{"id":"operations/rolling-updates","path":"/docs/31.0.0/operations/rolling-updates","sidebar":"docs"},{"id":"operations/rule-configuration","path":"/docs/31.0.0/operations/rule-configuration","sidebar":"docs"},{"id":"operations/security-overview","path":"/docs/31.0.0/operations/security-overview","sidebar":"docs"},{"id":"operations/security-user-auth","path":"/docs/31.0.0/operations/security-user-auth","sidebar":"docs"},{"id":"operations/segment-optimization","path":"/docs/31.0.0/operations/segment-optimization","sidebar":"docs"},{"id":"operations/single-server","path":"/docs/31.0.0/operations/single-server","sidebar":"docs"},{"id":"operations/tls-support","path":"/docs/31.0.0/operations/tls-support","sidebar":"docs"},{"id":"operations/use_sbt_to_build_fat_jar","path":"/docs/31.0.0/operations/use_sbt_to_build_fat_jar","sidebar":"docs"},{"id":"operations/web-console","path":"/docs/31.0.0/operations/web-console","sidebar":"docs"},{"id":"querying/aggregations","path":"/docs/31.0.0/querying/aggregations","sidebar":"docs"},{"id":"querying/arrays","path":"/docs/31.0.0/querying/arrays","sidebar":"docs"},{"id":"querying/caching","path":"/docs/31.0.0/querying/caching","sidebar":"docs"},{"id":"querying/datasource","path":"/docs/31.0.0/querying/datasource","sidebar":"docs"},{"id":"querying/datasourcemetadataquery","path":"/docs/31.0.0/querying/datasourcemetadataquery","sidebar":"docs"},{"id":"querying/dimensionspecs","path":"/docs/31.0.0/querying/dimensionspecs","sidebar":"docs"},{"id":"querying/filters","path":"/docs/31.0.0/querying/filters","sidebar":"docs"},{"id":"querying/geo","path":"/docs/31.0.0/querying/geo","sidebar":"docs"},{"id":"querying/granularities","path":"/docs/31.0.0/querying/granularities","sidebar":"docs"},{"id":"querying/groupbyquery","path":"/docs/31.0.0/querying/groupbyquery","sidebar":"docs"},{"id":"querying/having","path":"/docs/31.0.0/querying/having","sidebar":"docs"},{"id":"querying/hll-old","path":"/docs/31.0.0/querying/hll-old"},{"id":"querying/joins","path":"/docs/31.0.0/querying/joins","sidebar":"docs"},{"id":"querying/kafka-extraction-namespace","path":"/docs/31.0.0/querying/kafka-extraction-namespace","sidebar":"docs"},{"id":"querying/limitspec","path":"/docs/31.0.0/querying/limitspec","sidebar":"docs"},{"id":"querying/lookups","path":"/docs/31.0.0/querying/lookups","sidebar":"docs"},{"id":"querying/lookups-cached-global","path":"/docs/31.0.0/querying/lookups-cached-global","sidebar":"docs"},{"id":"querying/math-expr","path":"/docs/31.0.0/querying/math-expr","sidebar":"docs"},{"id":"querying/multi-value-dimensions","path":"/docs/31.0.0/querying/multi-value-dimensions","sidebar":"docs"},{"id":"querying/multitenancy","path":"/docs/31.0.0/querying/multitenancy","sidebar":"docs"},{"id":"querying/nested-columns","path":"/docs/31.0.0/querying/nested-columns","sidebar":"docs"},{"id":"querying/post-aggregations","path":"/docs/31.0.0/querying/post-aggregations","sidebar":"docs"},{"id":"querying/query-context","path":"/docs/31.0.0/querying/query-context","sidebar":"docs"},{"id":"querying/query-deep-storage","path":"/docs/31.0.0/querying/query-deep-storage","sidebar":"docs"},{"id":"querying/query-execution","path":"/docs/31.0.0/querying/query-execution","sidebar":"docs"},{"id":"querying/query-processing","path":"/docs/31.0.0/querying/query-processing","sidebar":"docs"},{"id":"querying/querying","path":"/docs/31.0.0/querying/","sidebar":"docs"},{"id":"querying/scan-query","path":"/docs/31.0.0/querying/scan-query","sidebar":"docs"},{"id":"querying/searchquery","path":"/docs/31.0.0/querying/searchquery","sidebar":"docs"},{"id":"querying/segmentmetadataquery","path":"/docs/31.0.0/querying/segmentmetadataquery","sidebar":"docs"},{"id":"querying/select-query","path":"/docs/31.0.0/querying/select-query"},{"id":"querying/sorting-orders","path":"/docs/31.0.0/querying/sorting-orders","sidebar":"docs"},{"id":"querying/sql","path":"/docs/31.0.0/querying/sql","sidebar":"docs"},{"id":"querying/sql-aggregations","path":"/docs/31.0.0/querying/sql-aggregations","sidebar":"docs"},{"id":"querying/sql-array-functions","path":"/docs/31.0.0/querying/sql-array-functions","sidebar":"docs"},{"id":"querying/sql-data-types","path":"/docs/31.0.0/querying/sql-data-types","sidebar":"docs"},{"id":"querying/sql-functions","path":"/docs/31.0.0/querying/sql-functions","sidebar":"docs"},{"id":"querying/sql-json-functions","path":"/docs/31.0.0/querying/sql-json-functions","sidebar":"docs"},{"id":"querying/sql-metadata-tables","path":"/docs/31.0.0/querying/sql-metadata-tables","sidebar":"docs"},{"id":"querying/sql-multivalue-string-functions","path":"/docs/31.0.0/querying/sql-multivalue-string-functions","sidebar":"docs"},{"id":"querying/sql-operators","path":"/docs/31.0.0/querying/sql-operators","sidebar":"docs"},{"id":"querying/sql-query-context","path":"/docs/31.0.0/querying/sql-query-context","sidebar":"docs"},{"id":"querying/sql-scalar","path":"/docs/31.0.0/querying/sql-scalar","sidebar":"docs"},{"id":"querying/sql-translation","path":"/docs/31.0.0/querying/sql-translation","sidebar":"docs"},{"id":"querying/sql-window-functions","path":"/docs/31.0.0/querying/sql-window-functions","sidebar":"docs"},{"id":"querying/timeboundaryquery","path":"/docs/31.0.0/querying/timeboundaryquery","sidebar":"docs"},{"id":"querying/timeseriesquery","path":"/docs/31.0.0/querying/timeseriesquery","sidebar":"docs"},{"id":"querying/tips-good-queries","path":"/docs/31.0.0/querying/tips-good-queries","sidebar":"docs"},{"id":"querying/topnmetricspec","path":"/docs/31.0.0/querying/topnmetricspec","sidebar":"docs"},{"id":"querying/topnquery","path":"/docs/31.0.0/querying/topnquery","sidebar":"docs"},{"id":"querying/troubleshooting","path":"/docs/31.0.0/querying/troubleshooting","sidebar":"docs"},{"id":"querying/using-caching","path":"/docs/31.0.0/querying/using-caching","sidebar":"docs"},{"id":"querying/virtual-columns","path":"/docs/31.0.0/querying/virtual-columns","sidebar":"docs"},{"id":"release-info/migr-ansi-sql-null","path":"/docs/31.0.0/release-info/migr-ansi-sql-null","sidebar":"docs"},{"id":"release-info/migr-front-coded-dict","path":"/docs/31.0.0/release-info/migr-front-coded-dict","sidebar":"docs"},{"id":"release-info/migr-mvd-array","path":"/docs/31.0.0/release-info/migr-mvd-array","sidebar":"docs"},{"id":"release-info/migr-subquery-limit","path":"/docs/31.0.0/release-info/migr-subquery-limit","sidebar":"docs"},{"id":"release-info/migration-guide","path":"/docs/31.0.0/release-info/migration-guide","sidebar":"docs"},{"id":"release-info/release-notes","path":"/docs/31.0.0/release-info/release-notes","sidebar":"docs"},{"id":"release-info/upgrade-notes","path":"/docs/31.0.0/release-info/upgrade-notes","sidebar":"docs"},{"id":"tutorials/cluster","path":"/docs/31.0.0/tutorials/cluster","sidebar":"docs"},{"id":"tutorials/docker","path":"/docs/31.0.0/tutorials/docker","sidebar":"docs"},{"id":"tutorials/index","path":"/docs/31.0.0/tutorials/","sidebar":"docs"},{"id":"tutorials/tutorial-append-data","path":"/docs/31.0.0/tutorials/tutorial-append-data","sidebar":"docs"},{"id":"tutorials/tutorial-batch","path":"/docs/31.0.0/tutorials/tutorial-batch"},{"id":"tutorials/tutorial-batch-hadoop","path":"/docs/31.0.0/tutorials/tutorial-batch-hadoop","sidebar":"docs"},{"id":"tutorials/tutorial-batch-native","path":"/docs/31.0.0/tutorials/tutorial-batch-native"},{"id":"tutorials/tutorial-compaction","path":"/docs/31.0.0/tutorials/tutorial-compaction","sidebar":"docs"},{"id":"tutorials/tutorial-delete-data","path":"/docs/31.0.0/tutorials/tutorial-delete-data","sidebar":"docs"},{"id":"tutorials/tutorial-ingestion-spec","path":"/docs/31.0.0/tutorials/tutorial-ingestion-spec","sidebar":"docs"},{"id":"tutorials/tutorial-jdbc","path":"/docs/31.0.0/tutorials/tutorial-jdbc","sidebar":"docs"},{"id":"tutorials/tutorial-kafka","path":"/docs/31.0.0/tutorials/tutorial-kafka","sidebar":"docs"},{"id":"tutorials/tutorial-kerberos-hadoop","path":"/docs/31.0.0/tutorials/tutorial-kerberos-hadoop","sidebar":"docs"},{"id":"tutorials/tutorial-latest-by","path":"/docs/31.0.0/tutorials/tutorial-latest-by","sidebar":"docs"},{"id":"tutorials/tutorial-msq-convert-spec","path":"/docs/31.0.0/tutorials/tutorial-msq-convert-spec","sidebar":"docs"},{"id":"tutorials/tutorial-msq-extern","path":"/docs/31.0.0/tutorials/tutorial-msq-extern","sidebar":"docs"},{"id":"tutorials/tutorial-query","path":"/docs/31.0.0/tutorials/tutorial-query","sidebar":"docs"},{"id":"tutorials/tutorial-query-deep-storage","path":"/docs/31.0.0/tutorials/tutorial-query-deep-storage","sidebar":"docs"},{"id":"tutorials/tutorial-retention","path":"/docs/31.0.0/tutorials/tutorial-retention","sidebar":"docs"},{"id":"tutorials/tutorial-rollup","path":"/docs/31.0.0/tutorials/tutorial-rollup","sidebar":"docs"},{"id":"tutorials/tutorial-sketches-theta","path":"/docs/31.0.0/tutorials/tutorial-sketches-theta","sidebar":"docs"},{"id":"tutorials/tutorial-sql-null","path":"/docs/31.0.0/tutorials/tutorial-sql-null"},{"id":"tutorials/tutorial-sql-query-view","path":"/docs/31.0.0/tutorials/tutorial-sql-query-view","sidebar":"docs"},{"id":"tutorials/tutorial-transform","path":"/docs/31.0.0/tutorials/tutorial-transform","sidebar":"docs"},{"id":"tutorials/tutorial-unnest-arrays","path":"/docs/31.0.0/tutorials/tutorial-unnest-arrays","sidebar":"docs"},{"id":"tutorials/tutorial-update-data","path":"/docs/31.0.0/tutorials/tutorial-update-data","sidebar":"docs"}],"draftIds":[],"sidebars":{"docs":{"link":{"path":"/docs/31.0.0/design/","label":"design/index"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(57529);const c=JSON.parse('{"docusaurusVersion":"2.4.3","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"2.4.3"},"docusaurus-lunr-search":{"type":"package","name":"docusaurus-lunr-search","version":"3.3.2"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"2.4.3"}}}');var l={siteConfig:o.default,siteMetadata:c,globalData:a,i18n:i,codeTranslations:s},u=r.createContext(l);function d(e){var t=e.children;return r.createElement(u.Provider,{value:l},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(94578),o=n(67294),a=n(10412),i=n(35742),s=n(18780),c=n(70063);function l(e){var t=e.error,n=e.tryAgain;return o.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},o.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),o.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),o.createElement(u,{error:t}))}function u(e){var t=e.error,n=(0,s.getErrorCausalChain)(t).map((function(e){return e.message})).join("\n\nCause:\n");return o.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function d(e){var t=e.error,n=e.tryAgain;return o.createElement(f,{fallback:function(){return o.createElement(l,{error:t,tryAgain:n})}},o.createElement(i.Z,null,o.createElement("title",null,"Page Error")),o.createElement(c.Z,null,o.createElement(l,{error:t,tryAgain:n})))}var p=function(e){return o.createElement(d,e)},f=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={error:null},n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidCatch=function(e){a.Z.canUseDOM&&this.setState({error:e})},n.render=function(){var e=this,t=this.props.children,n=this.state.error;if(n){var r,o={error:n,tryAgain:function(){return e.setState({error:null})}};return(null!=(r=this.props.fallback)?r:p)(o)}return null!=t?t:null},t}(o.Component)},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document;const o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(70405);function a(e){return r.createElement(o.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var r=n(87462),o=n(63366),a=n(67294),i=n(73727),s=n(18780),c=n(52263),l=n(13919),u=n(10412),d=a.createContext({collectLink:function(){}});var p=n(44996),f=["isNavLink","to","href","activeClassName","isActive","data-noBrokenLinkCheck","autoAddBaseUrl"];function m(e,t){var n,m,h=e.isNavLink,g=e.to,b=e.href,v=e.activeClassName,y=e.isActive,w=e["data-noBrokenLinkCheck"],k=e.autoAddBaseUrl,x=void 0===k||k,E=(0,o.Z)(e,f),_=(0,c.Z)().siteConfig,S=_.trailingSlash,C=_.baseUrl,q=(0,p.C)().withBaseUrl,T=(0,a.useContext)(d),A=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(function(){return A.current}));var N=g||b;var R,L=(0,l.Z)(N),O=null==N?void 0:N.replace("pathname://",""),P=void 0!==O?(R=O,x&&function(e){return e.startsWith("/")}(R)?q(R):R):void 0;P&&L&&(P=(0,s.applyTrailingSlash)(P,{trailingSlash:S,baseUrl:C}));var I=(0,a.useRef)(!1),D=h?i.OL:i.rU,M=u.Z.canUseIntersectionObserver,j=(0,a.useRef)(),F=function(){I.current||null==P||(window.docusaurus.preload(P),I.current=!0)};(0,a.useEffect)((function(){return!M&&L&&null!=P&&window.docusaurus.prefetch(P),function(){M&&j.current&&j.current.disconnect()}}),[j,P,M,L]);var B=null!=(n=null==(m=P)?void 0:m.startsWith("#"))&&n,z=!P||!L||B;return z||w||T.collectLink(P),z?a.createElement("a",(0,r.Z)({ref:A,href:P},N&&!L&&{target:"_blank",rel:"noopener noreferrer"},E)):a.createElement(D,(0,r.Z)({},E,{onMouseEnter:F,onTouchStart:F,innerRef:function(e){A.current=e,M&&e&&L&&(j.current=new window.IntersectionObserver((function(t){t.forEach((function(t){e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(j.current.unobserve(e),j.current.disconnect(),null!=P&&window.docusaurus.prefetch(P))}))})),j.current.observe(e))},to:P},h&&{isActive:y,activeClassName:v}))}const h=a.forwardRef(m)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>s});var r=n(67294);function o(e,t){var n=e.split(/(\{\w+\})/).map((function(e,n){if(n%2==1){var r=null==t?void 0:t[e.slice(1,-1)];if(void 0!==r)return r}return e}));return n.some((function(e){return(0,r.isValidElement)(e)}))?n.map((function(e,t){return(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e})).filter((function(e){return""!==e})):n.join("")}var a=n(57529);function i(e){var t,n,r=e.id,o=e.message;if(void 0===r&&void 0===o)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=a[null!=r?r:o])?n:o)?t:r}function s(e,t){return o(i({message:e.message,id:e.id}),t)}function c(e){var t=e.children,n=e.id,a=e.values;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");var s=i({message:t,id:n});return r.createElement(r.Fragment,null,o(s,a))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});var r="default"},13919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(67294),o=n(52263),a=n(13919);function i(){var e=(0,o.Z)().siteConfig,t=e.baseUrl,n=e.url,i=(0,r.useCallback)((function(e,r){return function(e,t,n,r){var o=void 0===r?{}:r,i=o.forcePrependBaseUrl,s=void 0!==i&&i,c=o.absolute,l=void 0!==c&&c;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(s)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;var u=n.startsWith(t)?n:t+n.replace(/^\//,"");return l?e+u:u}(n,t,e,r)}),[n,t]);return{withBaseUrl:i}}function s(e,t){return void 0===t&&(t={}),(0,i().withBaseUrl)(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(58940);function a(){return(0,r.useContext)(o._)}},28084:(e,t,n)=>{"use strict";n.d(t,{OD:()=>a,eZ:()=>i});var r=n(52263),o=n(29935);function a(e,t){void 0===t&&(t={});var n=(0,r.Z)().globalData[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}function i(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});var r=a(e),i=null==r?void 0:r[t];if(!i&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return i}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(98934);function a(){return(0,r.useContext)(o._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=function(e){return"object"==typeof e&&!!e&&Object.keys(e).length>0};function o(e){var t={};return function e(n,o){Object.entries(n).forEach((function(n){var a=n[0],i=n[1],s=o?o+"."+a:a;r(i)?e(i,s):t[s]=i}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>a});var r=n(67294),o=r.createContext(null);function a(e){var t=e.children,n=e.value,a=r.useContext(o),i=(0,r.useMemo)((function(){return function(e){var t=e.parent,n=e.value;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}var r=Object.assign({},t.data,null==n?void 0:n.data);return{plugin:t.plugin,data:r}}({parent:a,value:n})}),[a,n]);return r.createElement(o.Provider,{value:i},t)}},94104:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>f,gA:()=>u,_r:()=>c,Jo:()=>m,zh:()=>l,yW:()=>p,gB:()=>d});var r=n(16550),o=n(28084);var a=function(e){return e.versions.find((function(e){return e.isLast}))};function i(e,t){var n,o,i=function(e,t){var n=a(e);return[].concat(e.versions.filter((function(e){return e!==n})),[n]).find((function(e){return!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})}))}(e,t),s=null==i?void 0:i.docs.find((function(e){return!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})}));return{activeVersion:i,activeDoc:s,alternateDocVersions:s?(n=s.id,o={},e.versions.forEach((function(e){e.docs.forEach((function(t){t.id===n&&(o[e.name]=t)}))})),o):{}}}var s={},c=function(){var e;return null!=(e=(0,o.OD)("docusaurus-plugin-content-docs"))?e:s},l=function(e){return(0,o.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0})};function u(e){return void 0===e&&(e={}),function(e,t,n){void 0===n&&(n={});var o=Object.entries(e).sort((function(e,t){return t[1].path.localeCompare(e[1].path)})).find((function(e){var n=e[1];return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((function(e){return e.path})).join(", "));return a}(c(),(0,r.TH)().pathname,e)}function d(e){return l(e).versions}function p(e){var t=l(e);return a(t)}function f(e){return i(l(e),(0,r.TH)().pathname)}function m(e){return function(e,t){var n=a(e);return{latestDocSuggestion:i(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(l(e),(0,r.TH)().pathname)}},56657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate:function(e){var t=e.location,n=e.previousLocation;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((function(){window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(74865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate:function(e){var t=e.location,n=e.previousLocation;if(n&&t.pathname!==n.pathname){var r=window.setTimeout((function(){o().start()}),200);return function(){return window.clearTimeout(r)}}},onRouteDidUpdate:function(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r,o,a=n(87410),i=n(36809);r=a.Z,o=i.default.themeConfig.prism.additionalLanguages,globalThis.Prism=r,o.forEach((function(e){n(6726)("./prism-"+e)})),delete globalThis.Prism},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294);const o={iconExternalLink:"iconExternalLink_nPIU"};function a(e){var t=e.width,n=void 0===t?13.5:t,a=e.height,i=void 0===a?13.5:a;return r.createElement("svg",{width:n,height:i,"aria-hidden":"true",viewBox:"0 0 24 24",className:o.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},70063:(e,t,n)=>{"use strict";n.d(t,{Z:()=>It});var r=n(67294),o=n(86010),a=n(44763),i=n(1944),s=n(87462),c=n(16550),l=n(95999),u=n(85936),d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){var e=(0,r.useRef)(null),t=(0,c.k6)().action,n=(0,r.useCallback)((function(e){e.preventDefault();var t,n=null!=(t=document.querySelector("main:first-of-type"))?t:document.getElementById(d);n&&p(n)}),[]);return(0,u.S)((function(n){var r=n.location;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}var m=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){var t,n=null!=(t=e.children)?t:m,o=f(),a=o.containerRef,i=o.onClick;return r.createElement("div",{ref:a,role:"region","aria-label":m},r.createElement("a",(0,s.Z)({},e,{href:"#"+d,onClick:i}),n))}var g=n(35281),b=n(19727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:v.skipToContent})}var w=n(86668),k=n(59689),x=n(63366),E=["width","height","color","strokeWidth","className"];function _(e){var t=e.width,n=void 0===t?21:t,o=e.height,a=void 0===o?21:o,i=e.color,c=void 0===i?"currentColor":i,l=e.strokeWidth,u=void 0===l?1.2:l,d=(e.className,(0,x.Z)(e,E));return r.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:n,height:a},d),r.createElement("g",{stroke:c,strokeWidth:u},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function C(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,o.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(_,{width:14,height:14,strokeWidth:3.1}))}const q={content:"content_knG7"};function T(e){var t=(0,w.L)().announcementBar.content;return r.createElement("div",(0,s.Z)({},e,{className:(0,o.Z)(q.content,e.className),dangerouslySetInnerHTML:{__html:t}}))}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function N(){var e=(0,w.L)().announcementBar,t=(0,k.nT)(),n=t.isActive,o=t.close;if(!n)return null;var a=e.backgroundColor,i=e.textColor,s=e.isCloseable;return r.createElement("div",{className:A.announcementBar,style:{backgroundColor:a,color:i},role:"banner"},s&&r.createElement("div",{className:A.announcementBarPlaceholder}),r.createElement(T,{className:A.announcementBarContent}),s&&r.createElement(C,{onClick:o,className:A.announcementBarClose}))}var R=n(93163),L=n(12466);var O=n(69688),P=n(13102),I=r.createContext(null);function D(e){var t,n,o,a,i,s,c,l=e.children,u=(t=(0,R.e)(),n=(0,P.HY)(),o=(0,r.useState)(!1),a=o[0],i=o[1],s=null!==n.component,c=(0,O.D9)(s),(0,r.useEffect)((function(){s&&!c&&i(!0)}),[s,c]),(0,r.useEffect)((function(){s?t.shown||i(!0):i(!1)}),[t.shown,s]),(0,r.useMemo)((function(){return[a,i]}),[a]));return r.createElement(I.Provider,{value:u},l)}function M(e){if(e.component){var t=e.component;return r.createElement(t,e.props)}}function j(){var e=(0,r.useContext)(I);if(!e)throw new O.i6("NavbarSecondaryMenuDisplayProvider");var t=e[0],n=e[1],o=(0,r.useCallback)((function(){return n(!1)}),[n]),a=(0,P.HY)();return(0,r.useMemo)((function(){return{shown:t,hide:o,content:M(a)}}),[o,a,t])}function F(e){var t=e.header,n=e.primaryMenu,a=e.secondaryMenu,i=j().shown;return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},a)))}var B=n(92949),z=n(72389);function U(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function Z(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){var t=e.className,n=e.buttonClassName,a=e.value,i=e.onChange,s=(0,z.Z)(),c=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===a?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,o.Z)($.toggle,t)},r.createElement("button",{className:(0,o.Z)("clean-btn",$.toggleButton,!s&&$.toggleButtonDisabled,n),type:"button",onClick:function(){return i("dark"===a?"light":"dark")},disabled:!s,title:c,"aria-label":c,"aria-live":"polite"},r.createElement(U,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(Z,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})))}const G=r.memo(H),W={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){var t=e.className,n=(0,w.L)().navbar.style,o=(0,w.L)().colorMode.disableSwitch,a=(0,B.I)(),i=a.colorMode,s=a.setColorMode;return o?null:r.createElement(G,{className:t,buttonClassName:"dark"===n?W.darkNavbarColorModeToggle:void 0,value:i,onChange:s})}var Y=n(21327);function K(){return r.createElement(Y.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function X(){var e=(0,R.e)();return r.createElement("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:function(){return e.toggle()}},r.createElement(_,{color:"var(--ifm-color-emphasis-600)"}))}function Q(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(K,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(X,null))}var J=n(39960),ee=n(44996),te=n(13919);function ne(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var re=n(39471),oe=["activeBasePath","activeBaseRegex","to","href","label","html","isDropdownLink","prependBaseUrlToHref"];function ae(e){var t=e.activeBasePath,n=e.activeBaseRegex,o=e.to,a=e.href,i=e.label,c=e.html,l=e.isDropdownLink,u=e.prependBaseUrlToHref,d=(0,x.Z)(e,oe),p=(0,ee.Z)(o),f=(0,ee.Z)(t),m=(0,ee.Z)(a,{forcePrependBaseUrl:!0}),h=i&&a&&!(0,te.Z)(a),g=c?{dangerouslySetInnerHTML:{__html:c}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(re.Z,l&&{width:12,height:12}))};return a?r.createElement(J.Z,(0,s.Z)({href:u?m:a},d,g)):r.createElement(J.Z,(0,s.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:function(e,t){return n?ne(n,t.pathname):t.pathname.startsWith(f)}},d,g))}var ie=["className","isDropdownItem"],se=["className","isDropdownItem"],ce=["mobile","position"];function le(e){var t=e.className,n=e.isDropdownItem,a=void 0!==n&&n,i=(0,x.Z)(e,ie),c=r.createElement(ae,(0,s.Z)({className:(0,o.Z)(a?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:a},i));return a?r.createElement("li",null,c):c}function ue(e){var t=e.className,n=(e.isDropdownItem,(0,x.Z)(e,se));return r.createElement("li",{className:"menu__list-item"},r.createElement(ae,(0,s.Z)({className:(0,o.Z)("menu__link",t)},n)))}function de(e){var t,n=e.mobile,o=void 0!==n&&n,a=(e.position,(0,x.Z)(e,ce)),i=o?ue:le;return r.createElement(i,(0,s.Z)({},a,{activeClassName:null!=(t=a.activeClassName)?t:o?"menu__link--active":"navbar__link--active"}))}var pe=n(86043),fe=n(48596),me=n(52263);var he=["items","position","className","onClick"],ge=["items","className","position","onClick"],be=["mobile"];function ve(e,t){return e.some((function(e){return function(e,t){return!!(0,fe.Mg)(e.to,t)||!!ne(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)}))}function ye(e){var t,n=e.items,a=e.position,i=e.className,c=(e.onClick,(0,x.Z)(e,he)),l=(0,r.useRef)(null),u=(0,r.useState)(!1),d=u[0],p=u[1];return(0,r.useEffect)((function(){var e=function(e){l.current&&!l.current.contains(e.target)&&p(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),function(){document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),r.createElement("div",{ref:l,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===a,"dropdown--show":d})},r.createElement(ae,(0,s.Z)({"aria-haspopup":"true","aria-expanded":d,role:"button",href:c.to?void 0:"#",className:(0,o.Z)("navbar__link",i)},c,{onClick:c.to?void 0:function(e){return e.preventDefault()},onKeyDown:function(e){"Enter"===e.key&&(e.preventDefault(),p(!d))}}),null!=(t=c.children)?t:c.label),r.createElement("ul",{className:"dropdown__menu"},n.map((function(e,t){return r.createElement(He,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))}))))}function we(e){var t,n,a=e.items,i=e.className,l=(e.position,e.onClick),u=(0,x.Z)(e,ge),d=(n=(0,me.Z)().siteConfig.baseUrl,(0,c.TH)().pathname.replace(n,"/")),p=ve(a,d),f=(0,pe.u)({initialState:function(){return!p}}),m=f.collapsed,h=f.toggleCollapsed,g=f.setCollapsed;return(0,r.useEffect)((function(){p&&g(!p)}),[d,p,g]),r.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":m})},r.createElement(ae,(0,s.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",i)},u,{onClick:function(e){e.preventDefault(),h()}}),null!=(t=u.children)?t:u.label),r.createElement(pe.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:m},a.map((function(e,t){return r.createElement(He,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:l,activeClassName:"menu__link--active"},e,{key:t}))}))))}function ke(e){var t=e.mobile,n=void 0!==t&&t,o=(0,x.Z)(e,be),a=n?we:ye;return r.createElement(a,o)}var xe=n(94711),Ee=["width","height"];function _e(e){var t=e.width,n=void 0===t?20:t,o=e.height,a=void 0===o?20:o,i=(0,x.Z)(e,Ee);return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:n,height:a,"aria-hidden":!0},i),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const Se="iconLanguage_nlXk";var Ce=["mobile","dropdownItemsBefore","dropdownItemsAfter"];var qe=n(28084),Te=n(813),Ae=n.n(Te),Ne=["highlightState"];function Re(){var e,t=(0,c.TH)(),n=(0,c.k6)(),o=(0,me.Z)().siteConfig.baseUrl,a=(0,r.useState)({wordToHighlight:"",isTitleSuggestion:!1,titleText:""}),i=a[0],s=a[1];return(0,r.useEffect)((function(){var e;if(null!=(e=t.state)&&e.highlightState&&0!==t.state.highlightState.wordToHighlight.length){s(t.state.highlightState);var r=t.state,o=(r.highlightState,(0,x.Z)(r,Ne));n.replace(Object.assign({},t,{state:o}))}}),[null==(e=t.state)?void 0:e.highlightState,n,t]),(0,r.useEffect)((function(){var e;if(0!==i.wordToHighlight.length){var t=null!=(e=document.getElementsByTagName("article")[0])?e:document.getElementsByTagName("main")[0];if(t){var n=new(Ae())(t),r={ignoreJoiners:!0};return n.mark(i.wordToHighlight,r),function(){return n.unmark(r)}}}}),[i,o]),null}const Le=function(e){var t,a,i=(0,r.useRef)(!1),s=(0,r.useRef)(null),l=(0,r.useState)(!1),u=l[0],d=l[1],p=(0,c.k6)(),f=(0,me.Z)().siteConfig,m=void 0===f?{}:f,h=(m.plugins||[]).find((function(e){return Array.isArray(e)&&"string"==typeof e[0]&&e[0].includes("docusaurus-lunr-search")})),g=(0,z.Z)(),b=m.baseUrl,v=h&&(null==(t=h[1])?void 0:t.assetUrl)||b,y=(0,qe.eZ)("docusaurus-lunr-search"),w=function(){i.current||(Promise.all([fetch(""+v+y.fileNames.searchDoc).then((function(e){return e.json()})),fetch(""+v+y.fileNames.lunrIndex).then((function(e){return e.json()})),Promise.all([n.e(4611),n.e(5684)]).then(n.bind(n,4734)),Promise.all([n.e(532),n.e(2572)]).then(n.bind(n,32572))]).then((function(e){var t=e[0],n=e[1],r=e[2].default,o=t.searchDocs,a=t.options;o&&0!==o.length&&(!function(e,t,n,r){new n({searchDocs:e,searchIndex:t,baseUrl:b,inputSelector:"#search_input_react",handleSelected:function(e,t,n){var o=n.url||"/";document.createElement("a").href=o,e.setVal(""),t.target.blur();var a="";if(r.highlightResult)try{var i=(n.text||n.subcategory||n.title).match(new RegExp("\\w*","g"));if(i&&i.length>0){var s=document.createElement("div");s.innerHTML=i[0],a=s.textContent}}catch(c){console.log(c)}p.push(o,{highlightState:{wordToHighlight:a}})},maxHits:r.maxHits})}(o,n,r,a),d(!0))})),i.current=!0)},k=(0,r.useCallback)((function(t){s.current.contains(t.target)||s.current.focus(),e.handleSearchBarToggle&&e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]);return g&&(w(),a=window.navigator.platform.startsWith("Mac")?"Search \u2318+K":"Search Ctrl+K"),r.createElement("div",{className:"navbar__search",key:"search-box"},r.createElement("span",{"aria-label":"expand searchbar",role:"button",className:(0,o.Z)("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:k,onKeyDown:k,tabIndex:0}),r.createElement("input",{id:"search_input_react",type:"search",placeholder:u?a:"Loading...","aria-label":"Search",className:(0,o.Z)("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onClick:w,onMouseOver:w,onFocus:k,onBlur:k,ref:s,disabled:!u}),r.createElement(Re,null))},Oe={searchBox:"searchBox_ZlJk"};function Pe(e){var t=e.children,n=e.className;return r.createElement("div",{className:(0,o.Z)(n,Oe.searchBox)},t)}var Ie=n(94104),De=n(53791),Me=["docId","label","docsPluginId"];var je=["sidebarId","label","docsPluginId"];var Fe=["label","to","docsPluginId"];var Be=n(60373),ze=["mobile","docsPluginId","dropdownActiveClassDisabled","dropdownItemsBefore","dropdownItemsAfter"],Ue=function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))};const Ze={default:de,localeDropdown:function(e){var t=e.mobile,n=e.dropdownItemsBefore,o=e.dropdownItemsAfter,a=(0,x.Z)(e,Ce),i=(0,me.Z)().i18n,u=i.currentLocale,d=i.locales,p=i.localeConfigs,f=(0,xe.l)(),m=(0,c.TH)(),h=m.search,g=m.hash,b=d.map((function(e){var n=""+("pathname://"+f.createUrl({locale:e,fullyQualified:!1}))+h+g;return{label:p[e].label,lang:p[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===u?t?"menu__link--active":"dropdown__link--active":""}})),v=[].concat(n,b,o),y=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):p[u].label;return r.createElement(ke,(0,s.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(_e,{className:Se}),y),items:v}))},search:function(e){var t=e.mobile,n=e.className;return t?null:r.createElement(Pe,{className:n},r.createElement(Le,null))},dropdown:ke,html:function(e){var t=e.value,n=e.className,a=e.mobile,i=void 0!==a&&a,s=e.isDropdownItem,c=void 0!==s&&s,l=c?"li":"div";return r.createElement(l,{className:(0,o.Z)({navbar__item:!i&&!c,"menu__list-item":i},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){var t=e.docId,n=e.label,o=e.docsPluginId,a=(0,x.Z)(e,Me),i=(0,Ie.Iw)(o).activeDoc,c=(0,De.vY)(t,o);return null===c?null:r.createElement(de,(0,s.Z)({exact:!0},a,{isActive:function(){return(null==i?void 0:i.path)===c.path||!(null==i||!i.sidebar)&&i.sidebar===c.sidebar},label:null!=n?n:c.id,to:c.path}))},docSidebar:function(e){var t=e.sidebarId,n=e.label,o=e.docsPluginId,a=(0,x.Z)(e,je),i=(0,Ie.Iw)(o).activeDoc,c=(0,De.oz)(t,o).link;if(!c)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(de,(0,s.Z)({exact:!0},a,{isActive:function(){return(null==i?void 0:i.sidebar)===t},label:null!=n?n:c.label,to:c.path}))},docsVersion:function(e){var t=e.label,n=e.to,o=e.docsPluginId,a=(0,x.Z)(e,Fe),i=(0,De.lO)(o)[0],c=null!=t?t:i.label,l=null!=n?n:function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))}(i).path;return r.createElement(de,(0,s.Z)({},a,{label:c,to:l}))},docsVersionDropdown:function(e){var t=e.mobile,n=e.docsPluginId,o=e.dropdownActiveClassDisabled,a=e.dropdownItemsBefore,i=e.dropdownItemsAfter,u=(0,x.Z)(e,ze),d=(0,c.TH)(),p=d.search,f=d.hash,m=(0,Ie.Iw)(n),h=(0,Ie.gB)(n),g=(0,Be.J)(n).savePreferredVersionName,b=h.map((function(e){var t,n=null!=(t=m.alternateDocVersions[e.name])?t:Ue(e);return{label:e.label,to:""+n.path+p+f,isActive:function(){return e===m.activeVersion},onClick:function(){return g(e.name)}}})),v=[].concat(a,b,i),y=(0,De.lO)(n)[0],w=t&&v.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):y.label,k=t&&v.length>1?void 0:Ue(y).path;return v.length<=1?r.createElement(de,(0,s.Z)({},u,{mobile:t,label:w,to:k,isActive:o?function(){return!1}:void 0})):r.createElement(ke,(0,s.Z)({},u,{mobile:t,label:w,to:k,items:v,isActive:o?function(){return!1}:void 0}))}};var $e=["type"];function He(e){var t=e.type,n=(0,x.Z)(e,$e),o=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Ze[o];if(!a)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(a,n)}function Ge(){var e=(0,R.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map((function(t,n){return r.createElement(He,(0,s.Z)({mobile:!0},t,{onClick:function(){return e.toggle()},key:n}))})))}function We(e){return r.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ve(){var e=0===(0,w.L)().navbar.items.length,t=j();return r.createElement(r.Fragment,null,!e&&r.createElement(We,{onClick:function(){return t.hide()}}),t.content)}function Ye(){var e,t=(0,R.e)();return void 0===(e=t.shown)&&(e=!0),(0,r.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e]),t.shouldRender?r.createElement(F,{header:r.createElement(Q,null),primaryMenu:r.createElement(Ge,null),secondaryMenu:r.createElement(Ve,null)}):null}const Ke={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Xe(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function Qe(e){var t=e.children,n=(0,w.L)().navbar,a=n.hideOnScroll,i=n.style,s=(0,R.e)(),c=function(e){var t=(0,r.useState)(e),n=t[0],o=t[1],a=(0,r.useRef)(!1),i=(0,r.useRef)(0),s=(0,r.useCallback)((function(e){null!==e&&(i.current=e.getBoundingClientRect().height)}),[]);return(0,L.RF)((function(t,n){var r=t.scrollY;if(e)if(r=s?o(!1):r+l0&&r.createElement(xt,{links:n}),logo:o&&r.createElement(Ct,{logo:o}),copyright:t&&r.createElement(qt,{copyright:t})})}const Nt=r.memo(At);var Rt=(0,O.Qc)([B.S,k.pl,L.OC,Be.L5,i.VC,function(e){var t=e.children;return r.createElement(P.n2,null,r.createElement(R.M,null,r.createElement(D,null,t)))}]);function Lt(e){var t=e.children;return r.createElement(Rt,null,t)}function Ot(e){var t=e.error,n=e.tryAgain;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(nt,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(rt,{error:t})))))}const Pt={mainWrapper:"mainWrapper_z2l0"};function It(e){var t=e.children,n=e.noFooter,s=e.wrapperClassName,c=e.title,l=e.description;return(0,b.t)(),r.createElement(Lt,null,r.createElement(i.d,{title:c,description:l}),r.createElement(y,null),r.createElement(N,null),r.createElement(ft,null),r.createElement("div",{id:d,className:(0,o.Z)(g.k.wrapper.main,Pt.mainWrapper,s)},r.createElement(a.Z,{fallback:function(e){return r.createElement(Ot,e)}},t)),!n&&r.createElement(Nt,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(87462),o=n(63366),a=n(67294),i=n(39960),s=n(44996),c=n(52263),l=n(86668),u=n(50941),d=["imageClassName","titleClassName"];function p(e){var t=e.logo,n=e.alt,r=e.imageClassName,o={light:(0,s.Z)(t.src),dark:(0,s.Z)(t.srcDark||t.src)},i=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},i):i}function f(e){var t,n=(0,c.Z)().siteConfig.title,u=(0,l.L)().navbar,f=u.title,m=u.logo,h=e.imageClassName,g=e.titleClassName,b=(0,o.Z)(e,d),v=(0,s.Z)((null==m?void 0:m.href)||"/"),y=f?"":n,w=null!=(t=null==m?void 0:m.alt)?t:y;return a.createElement(i.Z,(0,r.Z)({to:v},b,(null==m?void 0:m.target)&&{target:m.target}),m&&a.createElement(p,{logo:m,alt:w,imageClassName:h}),null!=f&&a.createElement("b",{className:g},f))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(35742);function a(e){var t=e.locale,n=e.version,a=e.tag,i=t;return r.createElement(o.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),a&&r.createElement("meta",{name:"docusaurus_tag",content:a}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),a&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:a}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(87462),o=n(63366),a=n(67294),i=n(86010),s=n(72389),c=n(92949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};var u=["sources","className","alt"];function d(e){var t=(0,s.Z)(),n=(0,c.I)().colorMode,d=e.sources,p=e.className,f=e.alt,m=(0,o.Z)(e,u),h=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,h.map((function(e){return a.createElement("img",(0,r.Z)({key:e,src:d[e],alt:f,className:(0,i.Z)(l.themedImage,l["themedImage--"+e],p)},m))})))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>d,z:()=>y});var r=n(87462),o=n(63366),a=n(67294),i=n(10412),s=n(91442),c=["collapsed"],l=["lazy"],u="ease-in-out";function d(e){var t=e.initialState,n=(0,a.useState)(null!=t&&t),r=n[0],o=n[1],i=(0,a.useCallback)((function(){o((function(e){return!e}))}),[]);return{collapsed:r,setCollapsed:o,toggleCollapsed:i}}var p={display:"none",overflow:"hidden",height:"0px"},f={display:"block",overflow:"visible",height:"auto"};function m(e,t){var n=t?p:f;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function h(e){var t=e.collapsibleRef,n=e.collapsed,r=e.animation,o=(0,a.useRef)(!1);(0,a.useEffect)((function(){var e,a=t.current;function i(){var e,t,n=a.scrollHeight,o=null!=(e=null==r?void 0:r.duration)?e:function(e){if((0,s.n)())return 1;var t=e/36;return Math.round(10*(4+15*Math.pow(t,.25)+t/5))}(n);return{transition:"height "+o+"ms "+(null!=(t=null==r?void 0:r.easing)?t:u),height:n+"px"}}function c(){var e=i();a.style.transition=e.transition,a.style.height=e.height}if(!o.current)return m(a,n),void(o.current=!0);return a.style.willChange="height",e=requestAnimationFrame((function(){n?(c(),requestAnimationFrame((function(){a.style.height=p.height,a.style.overflow=p.overflow}))):(a.style.display="block",requestAnimationFrame((function(){c()})))})),function(){return cancelAnimationFrame(e)}}),[t,n,r])}function g(e){if(!i.Z.canUseDOM)return e?p:f}function b(e){var t=e.as,n=void 0===t?"div":t,r=e.collapsed,o=e.children,i=e.animation,s=e.onCollapseTransitionEnd,c=e.className,l=e.disableSSRStyle,u=(0,a.useRef)(null);return h({collapsibleRef:u,collapsed:r,animation:i}),a.createElement(n,{ref:u,style:l?void 0:g(r),onTransitionEnd:function(e){"height"===e.propertyName&&(m(u.current,r),null==s||s(r))},className:c},o)}function v(e){var t=e.collapsed,n=(0,o.Z)(e,c),i=(0,a.useState)(!t),s=i[0],l=i[1],u=(0,a.useState)(t),d=u[0],p=u[1];return(0,a.useLayoutEffect)((function(){t||l(!0)}),[t]),(0,a.useLayoutEffect)((function(){s&&p(t)}),[s,t]),s?a.createElement(b,(0,r.Z)({},n,{collapsed:d})):null}function y(e){var t=e.lazy,n=(0,o.Z)(e,l),r=t?v:b;return a.createElement(r,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>f});var r=n(67294),o=n(72389),a=n(50012),i=n(69688),s=n(86668),c=(0,a.WA)("docusaurus.announcement.dismiss"),l=(0,a.WA)("docusaurus.announcement.id"),u=function(){return"true"===c.get()},d=function(e){return c.set(String(e))},p=r.createContext(null);function f(e){var t=e.children,n=function(){var e=(0,s.L)().announcementBar,t=(0,o.Z)(),n=(0,r.useState)((function(){return!!t&&u()})),a=n[0],i=n[1];(0,r.useEffect)((function(){i(u())}),[]);var c=(0,r.useCallback)((function(){d(!0),i(!0)}),[]);return(0,r.useEffect)((function(){if(e){var t=e.id,n=l.get();"annoucement-bar"===n&&(n="announcement-bar");var r=t!==n;l.set(t),r&&d(!1),!r&&u()||i(!1)}}),[e]),(0,r.useMemo)((function(){return{isActive:!!e&&!a,close:c}}),[e,a,c])}();return r.createElement(p.Provider,{value:n},t)}function m(){var e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(67294),o=n(10412),a=n(69688),i=n(50012),s=n(86668),c=r.createContext(void 0),l="theme",u=(0,i.WA)(l),d={light:"light",dark:"dark"},p=function(e){return e===d.dark?d.dark:d.light},f=function(e){return o.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e)},m=function(e){u.set(p(e))};function h(e){var t=e.children,n=function(){var e=(0,s.L)().colorMode,t=e.defaultMode,n=e.disableSwitch,o=e.respectPrefersColorScheme,a=(0,r.useState)(f(t)),i=a[0],c=a[1];(0,r.useEffect)((function(){n&&u.del()}),[n]);var h=(0,r.useCallback)((function(e,n){void 0===n&&(n={});var r=n.persist,a=void 0===r||r;e?(c(e),a&&m(e)):(c(o?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:t),u.del())}),[o,t]);(0,r.useEffect)((function(){document.documentElement.setAttribute("data-theme",p(i))}),[i]),(0,r.useEffect)((function(){if(!n){var e=function(e){if(e.key===l){var t=u.get();null!==t&&h(p(t))}};return window.addEventListener("storage",e),function(){return window.removeEventListener("storage",e)}}}),[n,h]);var g=(0,r.useRef)(!1);return(0,r.useEffect)((function(){if(!n||o){var e=window.matchMedia("(prefers-color-scheme: dark)"),t=function(){window.matchMedia("print").matches||g.current?g.current=window.matchMedia("print").matches:h(null)};return e.addListener(t),function(){return e.removeListener(t)}}}),[h,n,o]),(0,r.useMemo)((function(){return{colorMode:i,setColorMode:h,get isDarkTheme(){return i===d.dark},setLightTheme:function(){h(d.light)},setDarkTheme:function(){h(d.dark)}}}),[i,h])}();return r.createElement(c.Provider,{value:n},t)}function g(){var e=(0,r.useContext)(c);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>g});var r=n(67294),o=n(94104),a=n(29935),i=n(86668),s=n(53791),c=n(69688),l=n(50012),u=function(e){return"docs-preferred-version-"+e},d={save:function(e,t,n){(0,l.WA)(u(e),{persistence:t}).set(n)},read:function(e,t){return(0,l.WA)(u(e),{persistence:t}).get()},clear:function(e,t){(0,l.WA)(u(e),{persistence:t}).del()}},p=function(e){return Object.fromEntries(e.map((function(e){return[e,{preferredVersionName:null}]})))};var f=r.createContext(null);function m(){var e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((function(){return Object.keys(e)}),[e]),a=(0,r.useState)((function(){return p(n)})),s=a[0],c=a[1];return(0,r.useEffect)((function(){c(function(e){var t=e.pluginIds,n=e.versionPersistence,r=e.allDocsData;return Object.fromEntries(t.map((function(e){return[e,(t=e,o=d.read(t,n),r[t].versions.some((function(e){return e.name===o}))?{preferredVersionName:o}:(d.clear(t,n),{preferredVersionName:null}))];var t,o})))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]),[s,(0,r.useMemo)((function(){return{savePreferredVersion:function(e,n){d.save(e,t,n),c((function(t){var r;return Object.assign({},t,((r={})[e]={preferredVersionName:n},r))}))}}}),[t])]}function h(e){var t=e.children,n=m();return r.createElement(f.Provider,{value:n},t)}function g(e){var t=e.children;return s.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function b(){var e=(0,r.useContext)(f);if(!e)throw new c.i6("DocsPreferredVersionContextProvider");return e}function v(e){var t;void 0===e&&(e=a.m);var n=(0,o.zh)(e),i=b(),s=i[0],c=i[1],l=s[e].preferredVersionName;return{preferredVersion:null!=(t=n.versions.find((function(e){return e.name===l})))?t:null,savePreferredVersionName:(0,r.useCallback)((function(t){c.savePreferredVersion(e,t)}),[c,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>s});var r=n(67294),o=n(69688),a=Symbol("EmptyContext"),i=r.createContext(a);function s(e){var t=e.children,n=e.name,o=e.items,a=(0,r.useMemo)((function(){return n&&o?{name:n,items:o}:null}),[n,o]);return r.createElement(i.Provider,{value:a},t)}function c(){var e=(0,r.useContext)(i);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},93163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>p});var r=n(67294),o=n(13102),a=n(87524),i=n(91980),s=n(86668),c=n(69688),l=r.createContext(void 0);function u(){var e,t=(e=(0,o.HY)(),0===(0,s.L)().navbar.items.length&&!e.component),n=(0,a.i)(),c=!t&&"mobile"===n,l=(0,r.useState)(!1),u=l[0],d=l[1];(0,i.Rb)((function(){if(u)return d(!1),!1}));var p=(0,r.useCallback)((function(){d((function(e){return!e}))}),[]);return(0,r.useEffect)((function(){"desktop"===n&&d(!1)}),[n]),(0,r.useMemo)((function(){return{disabled:t,shouldRender:c,toggle:p,shown:u}}),[t,c,p,u])}function d(e){var t=e.children,n=u();return r.createElement(l.Provider,{value:n},t)}function p(){var e=r.useContext(l);if(void 0===e)throw new c.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>c,n2:()=>i});var r=n(67294),o=n(69688),a=r.createContext(null);function i(e){var t=e.children,n=(0,r.useState)({component:null,props:null});return r.createElement(a.Provider,{value:n},t)}function s(){var e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){var t=e.component,n=e.props,i=(0,r.useContext)(a);if(!i)throw new o.i6("NavbarSecondaryMenuContentProvider");var s=i[1],c=(0,o.Ql)(n);return(0,r.useEffect)((function(){s({component:t,props:c})}),[s,t,c]),(0,r.useEffect)((function(){return function(){return s({component:null,props:null})}}),[s]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(67294),o="navigation-with-keyboard";function a(){(0,r.useEffect)((function(){function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),function(){document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>l});var r=n(67294),o=n(10412),a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return o.Z.canUseDOM?window.innerWidth>i?a.desktop:a.mobile:a.ssr}var c=!1;function l(){var e=(0,r.useState)((function(){return c?"ssr":s()})),t=e[0],n=e[1];return(0,r.useEffect)((function(){function e(){n(s())}var t=c?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e),clearTimeout(t)}}),[]),t}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});var r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:function(e){return"theme-admonition-"+e}},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:function(e){return"theme-doc-sidebar-item-category-level-"+e},docSidebarItemLinkLevel:function(e){return"theme-doc-sidebar-item-link-level-"+e}},blog:{}}},91442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},53791:(e,t,n)=>{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}n.d(t,{Wl:()=>m,_F:()=>b,cE:()=>f,hI:()=>E,lO:()=>w,vY:()=>x,oz:()=>k,s1:()=>y});var a=n(67294),i=n(16550),s=n(18790),c=n(94104),l=n(60373),u=n(1116),d=n(67392),p=n(48596),f=!!c._r;function m(e){if(e.href)return e.href;for(var t,n=o(e.items);!(t=n()).done;){var r=t.value;if("link"===r.type)return r.href;if("category"===r.type){var a=m(r);if(a)return a}}}var h=function(e,t){return void 0!==e&&(0,p.Mg)(e,t)},g=function(e,t){return e.some((function(e){return b(e,t)}))};function b(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||g(e.items,t))}function v(e){var t=e.sidebarItems,n=e.pathname,r=e.onlyCategories,a=void 0!==r&&r,i=[];return function e(t){for(var r,s=o(t);!(r=s()).done;){var c=r.value;if("category"===c.type&&((0,p.Mg)(c.href,n)||e(c.items))||"link"===c.type&&(0,p.Mg)(c.href,n))return a&&"category"!==c.type||i.unshift(c),!0}return!1}(t),i}function y(){var e,t=(0,u.V)(),n=(0,i.TH)().pathname;return!1!==(null==(e=(0,c.gA)())?void 0:e.pluginData.breadcrumbs)&&t?v({sidebarItems:t.items,pathname:n}):null}function w(e){var t=(0,c.Iw)(e).activeVersion,n=(0,l.J)(e).preferredVersion,r=(0,c.yW)(e);return(0,a.useMemo)((function(){return(0,d.j)([t,n,r].filter(Boolean))}),[t,n,r])}function k(e,t){var n=w(t);return(0,a.useMemo)((function(){var t=n.flatMap((function(e){return e.sidebars?Object.entries(e.sidebars):[]})),r=t.find((function(t){return t[0]===e}));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((function(e){return e.name})).join(", ")+'".\nAvailable sidebar ids are:\n- '+t.map((function(e){return e[0]})).join("\n- "));return r[1]}),[e,n])}function x(e,t){var n=w(t);return(0,a.useMemo)((function(){var t=n.flatMap((function(e){return e.docs})),r=t.find((function(t){return t.id===e}));if(!r){if(n.flatMap((function(e){return e.draftIds})).includes(e))return null;throw new Error("Couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+' "'+n.map((function(e){return e.name})).join(", ")+'".\nAvailable doc ids are:\n- '+(0,d.j)(t.map((function(e){return e.id}))).join("\n- "))}return r}),[e,n])}function E(e){var t=e.route,n=e.versionMetadata,r=(0,i.TH)(),o=t.routes,a=o.find((function(e){return(0,i.LX)(r.pathname,e)}));if(!a)return null;var c=a.sidebar,l=c?n.docsSidebars[c]:void 0;return{docElement:(0,s.H)(o),sidebarName:c,sidebarItems:l}}},91980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>s,_X:()=>c});var r=n(67294),o=n(16550),a=n(61688),i=n(69688);function s(e){!function(e){var t=(0,o.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((function(){return t.block((function(e,t){return n(e,t)}))}),[t,n])}((function(t,n){if("POP"===n)return e(t,n)}))}function c(e){return t=function(t){return null===e?null:new URLSearchParams(t.location.search).get(e)},n=(0,o.k6)(),(0,a.useSyncExternalStore)(n.listen,(function(){return t(n)}),(function(){return t(n)}));var t,n}},67392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=function(e,t){return e===t}),e.filter((function(n,r){return e.findIndex((function(e){return t(e,n)}))!==r}))}function o(e){return Array.from(new Set(e))}n.d(t,{j:()=>o,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(67294),o=n(86010),a=n(35742),i=n(30226);function s(){var e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var c=n(44996),l=n(52263);function u(e){var t=e.title,n=e.description,o=e.keywords,i=e.image,s=e.children,u=function(e){var t=(0,l.Z)().siteConfig,n=t.title,r=t.titleDelimiter;return null!=e&&e.trim().length?e.trim()+" "+r+" "+n:n}(t),d=(0,c.C)().withBaseUrl,p=i?d(i,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),o&&r.createElement("meta",{name:"keywords",content:Array.isArray(o)?o.join(","):o}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),s)}var d=r.createContext(void 0);function p(e){var t=e.className,n=e.children,i=r.useContext(d),s=(0,o.Z)(i,t);return r.createElement(d.Provider,{value:s},r.createElement(a.Z,null,r.createElement("html",{className:s})),n)}function f(e){var t=e.children,n=s(),a="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,""),i="plugin-id-"+n.plugin.id;return r.createElement(p,{className:(0,o.Z)(a,i)},t)}},69688:(e,t,n)=>{"use strict";n.d(t,{i6:()=>f,Qc:()=>h,zX:()=>d,D9:()=>p,Ql:()=>m});var r=n(26528),o=n(94578);function a(e){return a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},a(e)}var i=n(89611);function s(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(s=function(){return!!e})()}function c(e){var t="function"==typeof Map?new Map:void 0;return c=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(s())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,t);var o=new(e.bind.apply(e,r));return n&&(0,i.Z)(o,n.prototype),o}(e,arguments,a(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),(0,i.Z)(n,e)},c(e)}var l=n(67294),u=n(10412).Z.canUseDOM?l.useLayoutEffect:l.useEffect;function d(e){var t=(0,l.useRef)(e);return u((function(){t.current=e}),[e]),(0,l.useCallback)((function(){return t.current.apply(t,arguments)}),[])}function p(e){var t=(0,l.useRef)();return u((function(){t.current=e})),t.current}var f=function(e){function t(t,n){var o,a,i;return(i=e.call(this)||this).name="ReactContextError",i.message="Hook "+(null!=(o=null==(a=i.stack)||null==(a=a.split("\n")[1])||null==(a=a.match((0,r.Z)(/at (?:\w+\.)?(\w+)/,{name:1})))?void 0:a.groups.name)?o:"")+" is called outside the <"+t+">. "+(null!=n?n:""),i}return(0,o.Z)(t,e),t}(c(Error));function m(e){var t=Object.entries(e);return t.sort((function(e,t){return e[0].localeCompare(t[0])})),(0,l.useMemo)((function(){return e}),t.flat())}function h(e){return function(t){var n=t.children;return l.createElement(l.Fragment,null,e.reduceRight((function(e,t){return l.createElement(t,null,e)}),n))}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(67294),o=n(723),a=n(52263);function i(e,t){var n=function(e){var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function s(){var e=(0,a.Z)().siteConfig.baseUrl;return(0,r.useMemo)((function(){return function(e){var t=e.baseUrl;function n(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0!==t.length)return t.find(n)||e(t.filter(r).flatMap((function(e){var t;return null!=(t=e.routes)?t:[]})))}(e.routes)}({routes:o.Z,baseUrl:e})}),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>c,RF:()=>d,o5:()=>p});var r=n(67294),o=n(10412),a=n(72389),i=n(69688);var s=r.createContext(void 0);function c(e){var t,n=e.children,o=(t=(0,r.useRef)(!0),(0,r.useMemo)((function(){return{scrollEventsEnabledRef:t,enableScrollEvents:function(){t.current=!0},disableScrollEvents:function(){t.current=!1}}}),[]));return r.createElement(s.Provider,{value:o},n)}function l(){var e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}var u=function(){return o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null};function d(e,t){void 0===t&&(t=[]);var n=l().scrollEventsEnabledRef,o=(0,r.useRef)(u()),a=(0,i.zX)(e);(0,r.useEffect)((function(){var e=function(){if(n.current){var e=u();a(e,o.current),o.current=e}},t={passive:!0};return e(),window.addEventListener("scroll",e,t),function(){return window.removeEventListener("scroll",e,t)}}),[a,n].concat(t))}function p(){var e,t,n,o=l(),a=(e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((function(t){e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((function(){var t=e.current,n=t.elem,r=t.top;if(!n)return{restored:!1};var o=n.getBoundingClientRect().top-r;return o&&window.scrollBy({left:0,top:o}),e.current={elem:null,top:0},{restored:0!==o}}),[]),(0,r.useMemo)((function(){return{save:t,restore:n}}),[n,t])),i=(0,r.useRef)(void 0),s=(0,r.useCallback)((function(e){a.save(e),o.disableScrollEvents(),i.current=function(){var e=a.restore().restored;if(i.current=void 0,e){window.addEventListener("scroll",(function e(){o.enableScrollEvents(),window.removeEventListener("scroll",e)}))}else o.enableScrollEvents()}}),[o,a]);return(0,r.useLayoutEffect)((function(){queueMicrotask((function(){return null==i.current?void 0:i.current()}))})),{blockElementScrollPositionUntilNextRender:s}}function f(){var e=(0,r.useRef)(null),t=(0,a.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:function(n){e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),function(){}}(n):function(e){var t=null,n=document.documentElement.scrollTop>e;return function r(){var o=document.documentElement.scrollTop;(n&&o>e||!n&&o{"use strict";n.d(t,{HX:()=>r,os:()=>o});n(52263);var r="default";function o(e,t){return"docs-"+e+"-"+t}},50012:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>u});var r=n(67294),o=n(61688),a="localStorage";function i(e){var t=e.key,n=e.oldValue,r=e.newValue,o=e.storage;if(n!==r){var a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}}function s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,c||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),c=!0),null}var t}var c=!1;var l={get:function(){return null},set:function(){},del:function(){},listen:function(){return function(){}}};function u(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t,listen:t}}(e);var n=s(null==t?void 0:t.persistence);return null===n?l:{get:function(){try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:function(t){try{var r=n.getItem(e);n.setItem(e,t),i({key:e,oldValue:r,newValue:t,storage:n})}catch(o){console.error("Docusaurus storage error, can't set "+e+"="+t,o)}},del:function(){try{var t=n.getItem(e);n.removeItem(e),i({key:e,oldValue:t,newValue:null,storage:n})}catch(r){console.error("Docusaurus storage error, can't delete key="+e,r)}},listen:function(t){try{var r=function(r){r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),function(){return window.removeEventListener("storage",r)}}catch(o){return console.error("Docusaurus storage error, can't listen for changes of key="+e,o),function(){}}}}}function d(e,t){var n=(0,r.useRef)((function(){return null===e?l:u(e,t)})).current(),a=(0,r.useCallback)((function(e){return"undefined"==typeof window?function(){}:n.listen(e)}),[n]);return[(0,o.useSyncExternalStore)(a,(function(){return"undefined"==typeof window?null:n.get()}),(function(){return null})),n]}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(52263),o=n(16550),a=n(18780);function i(){var e=(0,r.Z)(),t=e.siteConfig,n=t.baseUrl,i=t.url,s=t.trailingSlash,c=e.i18n,l=c.defaultLocale,u=c.currentLocale,d=(0,o.TH)().pathname,p=(0,a.applyTrailingSlash)(d,{trailingSlash:s,baseUrl:n}),f=u===l?n:n.replace("/"+u+"/","/"),m=p.replace(n,"");return{createUrl:function(e){var t=e.locale;return""+(e.fullyQualified?i:"")+function(e){return e===l?""+f:""+f+e+"/"}(t)+m}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),o=n(16550),a=n(69688);function i(e){var t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((function(){n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(52263);function o(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=t.trailingSlash,r=t.baseUrl;if(e.startsWith("#"))return e;if(void 0===n)return e;var o,a=e.split(/[#?]/)[0],i="/"===a||a===r?a:(o=a,n?function(e){return e.endsWith("/")?e:e+"/"}(o):function(e){return e.endsWith("/")?e.slice(0,-1):e}(o));return e.replace(a,i)}},54143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t].concat(e(t.cause)):[t]}},18780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(54143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},86010:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>T,Ep:()=>p});var r=n(87462);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!l)for(;d--;d)i.unshift("..");!l||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(38776);function c(e){return"/"===e.charAt(0)?e:"/"+e}function l(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,h(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(59864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function c(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var l=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=c(t),h=c(n),g=0;g{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var c;if(void 0===t)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,o,a,i,s],u=0;(c=new Error(t.replace(/%s/g,(function(){return l[u++]})))).name="Invariant Violation"}throw c.framesToPop=1,c}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},813:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=o,this.iframesTimeout=a}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var o=e.contentWindow;if(r=o.document,!o||!r)throw new Error("iframe inaccessible")}catch(a){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,o=!1,a=null,i=function i(){if(!o){o=!0,clearTimeout(a);try{r.isIframeBlank(e)||(e.removeEventListener("load",i),r.getIframeContents(e,t,n))}catch(s){n()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var o=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=t.querySelectorAll("iframe"),s=i.length,c=0;i=Array.prototype.slice.call(i);var l=function(){--s<=0&&a(c)};s||l(),i.forEach((function(t){e.matches(t,o.exclude)?l():o.onIframeReady(t,(function(e){n(t)&&(c++,r(e)),l()}),l)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var o=!1,a=!1;return r.forEach((function(e,t){e.val===n&&(o=t,a=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==o||a?!1===o||a||(r[o].handled=!0):r.push({val:n,handled:!0}),!0):(!1===o&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var o=this;e.forEach((function(e){e.handled||o.getIframeContents(e.val,(function(e){o.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,o){for(var a=this,i=this.createIterator(t,e,r),s=[],c=[],l=void 0,u=void 0,d=function(){var e=a.getIteratorNode(i);return u=e.prevNode,l=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return a.checkIframeFilter(l,u,e,s)}),(function(t){a.createInstanceOnIframe(t).forEachNode(e,(function(e){return c.push(e)}),r)})),c.push(l);c.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(s,e,n,r),o()}},{key:"forEachNode",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=this.getContexts(),i=a.length;i||o(),a.forEach((function(a){var s=function(){r.iterateThroughNodes(e,a,t,n,(function(){--i<=0&&o()}))};r.iframes?r.waitForIframes(a,s):s()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var o=!1;return n.every((function(t){return!r.call(e,t)||(o=!0,!1)})),o}return!1}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var o in t)if(t.hasOwnProperty(o)){var a=t[o],i="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a);""!==i&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(i)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(i)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(o){n.every((function(n){if(-1!==n.indexOf(o)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,o="string"==typeof r?r:r.value,a="string"==typeof r?[]:r.limiters,i="";switch(a.forEach((function(e){i+="|"+t.escapeStr(e)})),o){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr(n)))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var o=t.callNoMatchOnInvalidRanges(e,r),a=o.start,i=o.end;o.valid&&(e.start=a,e.length=i-a,n.push(e),r=i)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,o=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?o=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:o}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,o=!0,a=n.length,i=t-a,s=parseInt(e.start,10)-i;return(r=(s=s>a?a:s)+parseInt(e.length,10))>a&&(r=a,this.log("End range automatically set to the max value of "+a)),s<0||r-s<0||s>a||r>a?(o=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(o=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:o}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return o.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",o=e.splitText(t),a=o.splitText(n-t),i=document.createElement(r);return i.setAttribute("data-markjs","true"),this.opt.className&&i.setAttribute("class",this.opt.className),i.textContent=o.textContent,o.parentNode.replaceChild(i,o),a}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,o){var a=this;e.nodes.every((function(i,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(i.node))return!1;var l=t-i.start,u=(n>i.end?i.end:n)-i.start,d=e.value.substr(0,i.start),p=e.value.substr(u+i.start);if(i.node=a.wrapRangeInTextNode(i.node,l,u),e.value=d+p,e.nodes.forEach((function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=u),e.nodes[n].end-=u)})),n-=u,o(i.node.previousSibling,i.start),!(n>i.end))return!1;t=i.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,o){var a=this,i=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var o=void 0;null!==(o=e.exec(t.textContent))&&""!==o[i];)if(n(o[i],t)){var s=o.index;if(0!==i)for(var c=1;c{"use strict";n.r(t)},37253:(e,t,n)=>{"use strict";n.r(t)},83128:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),l=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),c(l,i(e,u,d)),1===e?(c(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){c(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),l=document.querySelector(r.parent);return c(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),l!=document.body&&u(l,"nprogress-custom-parent"),l.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),c=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function l(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;l(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);l(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,o){for(var a,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),c=1;c{var r=n(5826);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],w=n[7];s&&(r.push(s),s="");var k=null!=h&&null!=m&&m!==h,x="+"===y||"*"===y,E="?"===y||"*"===y,_=n[2]||u,S=b||v;r.push({name:g||a++,prefix:h||"",delimiter:_,optional:E,repeat:x,partial:k,asterisk:!!w,pattern:S?l(S):w?".*":"[^"+c(_)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>a});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);E+=x.value.length,x=x.next){var _=x.value;if(t.length>e.length)return;if(!(_ instanceof o)){var S,C=1;if(v){if(!(S=a(k,E,e,b))||S.index>=e.length)break;var q=S.index,T=S.index+S[0].length,A=E;for(A+=x.value.length;q>=A;)A+=(x=x.next).value.length;if(E=A-=x.value.length,x.value instanceof o)continue;for(var N=x;N!==t.tail&&(Ad.reach&&(d.reach=P);var I=x.prev;if(L&&(I=c(t,I,L),E+=L.length),l(t,I,C),x=c(t,I,new o(p,g?r.tokenize(R,g):R,y,R)),O&&c(t,x,O),C>1){var D={cause:p+","+m,reach:P};i(e,t,n,x.prev,E,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function c(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function l(e,t,n){for(var r=t.next,o=0;o"+a.content+""},r}(),o=r;r.default=r,o.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},o.languages.markup.tag.inside["attr-value"].inside.entity=o.languages.markup.entity,o.languages.markup.doctype.inside["internal-subset"].inside=o.languages.markup,o.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(o.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:o.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:o.languages[t]};var a={};a[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},o.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(o.languages.markup.tag,"addAttribute",{value:function(e,t){o.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:o.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),o.languages.html=o.languages.markup,o.languages.mathml=o.languages.markup,o.languages.svg=o.languages.markup,o.languages.xml=o.languages.extend("markup",{}),o.languages.ssml=o.languages.xml,o.languages.atom=o.languages.xml,o.languages.rss=o.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},o.languages.c=o.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),o.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),o.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},o.languages.c.string],char:o.languages.c.char,comment:o.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:o.languages.c}}}}),o.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete o.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(o),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(o),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},o={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:o,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:o})}(o),o.languages.javascript=o.languages.extend("clike",{"class-name":[o.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),o.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,o.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:o.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:o.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:o.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:o.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:o.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),o.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:o.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),o.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),o.languages.markup&&(o.languages.markup.tag.addInlined("script","javascript"),o.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),o.languages.js=o.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(o),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(o),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},c=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(o),o.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:o.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},o.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var s=p(/^\{$/,/^\}$/);if(-1===s)continue;for(var c=n;c=0&&f(l,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function c(t,n,r){var o={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",o),o.tokens=e.tokenize(o.code,o.grammar),e.hooks.run("after-tokenize",o),o.tokens}function l(t){var n={};n["interpolation-punctuation"]=o;var a=e.tokenize(t,n);if(3===a.length){var i=[1,1];i.push.apply(i,c(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,i)}return new e.Token("interpolation",a,r.alias,t)}function u(t,n,r){var o=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),i=0,u={},d=c(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=s(i++,r)););return u[n]=o,n})).join(""),n,r),p=Object.keys(u);return i=0,function e(t){for(var n=0;n=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var o=p[i],a="string"==typeof r?r:r.content,s=a.indexOf(o);if(-1!==s){++i;var c=a.substring(0,s),d=l(u[o]),f=a.substring(s+o.length),m=[];if(c&&m.push(c),m.push(d),f){var h=[f];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,o=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(o),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function a(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return o})),RegExp(e,t)}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},s=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(o.content[0].content[1])&&n.pop():"/>"===o.content[o.content.length-1].content||n.push({tagName:i(o.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&n.length>0&&0===n[n.length-1].openedBraces){var c=i(o);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(c=i(t[r-1])+c,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",c,null,c)}o.content&&"string"!=typeof o.content&&s(o.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)}))}(o),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(o),o.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},o.languages.go=o.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),o.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete o.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var c=0;c=a.length);c++){var l=s[c];if("string"==typeof l||l.content&&"string"==typeof l.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof l?l:l.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof l?s.splice.apply(s,[c,1].concat(v)):l.content=v}}else l.content&&i(l.content)}return s}(n.tokens)}}}})}(o),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(o),o.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},o.languages.webmanifest=o.languages.json,o.languages.less=o.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),o.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),o.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},o.languages.objectivec=o.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete o.languages.objectivec["class-name"],o.languages.objc=o.languages.objectivec,o.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},o.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},o.languages.python["string-interpolation"].inside.interpolation.inside.rest=o.languages.python,o.languages.py=o.languages.python,o.languages.reason=o.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),o.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete o.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(o),o.languages.scss=o.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),o.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),o.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),o.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),o.languages.scss.atrule.inside.rest=o.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(o),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(o),o.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const a=o},29901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(29901),o=n(39642),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(16500).resolve(t)],delete Prism.languages[e],n(16500)(t),a.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6726},16500:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=16500},39642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var s={},c=e[r];if(c){function l(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,a),s[t]=!0,n[t])s[i]=!0}t(c.require,l),t(c.optional,l),t(c.modify,l)}n[r]=s,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,s){var c=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),l=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(c);i=i.map(l),s=(s||[]).map(l);var u=n(i),d=n(s);i.forEach((function e(n){var r=c[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(c),m=u;o(m);){for(var h in p={},m){var g=c[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in f(b))if(v in u){p[b]=!0;break}for(var y in m=p)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,s={},c={};function l(e){if(e in s)return s[e];c[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var p=i(u.map((function(e){var t=l(e);return delete c[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)l(u);var d=[];for(var p in c)d.push(s[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},92703:(e,t,n)=>{"use strict";var r=n(50414);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),o=n(27418),a=n(63840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n